Makefile转换当前目录中的文件

时间:2017-07-03 10:18:19

标签: shell makefile file-conversion dash-shell

我试图将所有带脚本的.txt转换为其他格式 我允许仅为目标使用shell命令,但我不允许使用循环...
顺便说一下,我必须使用仪表解释器 该脚本称为txtConverter。它从stdin读取txt并将转换后的文本(可能是markdown或其他格式)放到stdout中。因此,我必须读取当前目录中的所有.txt文件,并通过将脚本用于具有不同文件名的显式格式来转换每个文件。
例如,如果当前目录中只有1个.txt文件,则在使用makefile后应该有2个文件:

1. Directory: Hallo.txt
2. using make
3. Directory: Hallo.txt
              Hallo.sh

我发现了这样的事情:

OBJ=$(patsubst %.txt, %.sh, $(wildcard *.txt))

这应该查找.txt文件并将其转换为.sh文件吗?

convertToSh : $(OBJ) 
    What kind of Code?

但是我需要一个规则才能正确转换?

%.txt : %.sh

问题是我不知道如何使用shell代码来填充.sh文件,如:

cat $< | ./txtConverter > $@

如果我使用$()来执行shell代码,那么它也会起作用:

@echo $(ls -1)

我是Makefiles的新手,我正在看一部纪录片,但我真的不明白它是如何运作的。 如果你把所有这些放在一个Makefile中,我不确定它是怎么样的。 求救!

解决方案:

向@MadScientist发送Thx,向A Makefile to Convert All Markdown Files to PDFs Using Pandoc

发送
.RECIPEPREFIX = ~
OBJS=$(patsubst %.txt, %.sh, $(wildcard *.txt))
convertToSh : $(OBJS)
%.sh : %.txt
~ ./convertTxtToSh > $@ < $<

工作正常!在@MadScientist的GNU手册中找到.RECIPEPREFIX = ~

1 个答案:

答案 0 :(得分:1)

了解make(IMO)的最佳地点是GNU Make Manual。当然,make有不同的版本,本手册讨论了GNU版本,但这可能是最常见的版本。

规则的配方是用shell脚本语法编写的,所以你可以将shell代码直接放在那里作为配方。

但是,模式规则定义是 target 先决条件。因此,在您想要从.sh先决条件)创建.txt目标)的情况下,您需要写:

%.sh : %.txt
        cat $< | ./txtConverter > $@

或者为了避免UUOC你可以写:

%.sh : %.txt
        ./txtConverter > $@ < $<

请记住,您必须在配方行之前使用实际的TAB字符。确保您的编辑器不会用空格或其他东西替换它。

然而,这只是一个告诉make的模板,&#34;如果你想创建foo.sh,并且你有(或者可以弄清楚如何构建)foo.txt,那么你可以使用这个配方来做到这一点&#34;。

接下来,您需要告诉make要创建哪些.sh个文件。你已经弄清楚了:

OBJ=$(patsubst %.txt, %.sh, $(wildcard *.txt))

然后你需要告诉make来构建这些。你可以用:

convertToSh : $(OBJ)

但是这个规则并不需要一个配方:这里没有任何事可做,因为所有的工作都是在模式规则中完成的。这只是将所有先决条件收集到一个地方的简单方法。