我正在开发一个项目,其目录结构看起来有点像这样:
inputs/
a.txt
b.txt
c.txt
outputs/
a.out
b.out
c.out
makefile
文件夹中的文件outputs
是从文件夹中的文件生成的inputs
,我想每当输入文件之一发生更改时自动更新它们。
我尝试通过创建带有模式规则的 makefile 来做到这一点。 (为了使这个问题简单,我只是复制输入文件而不是转换它)
outputs/%.txt: inputs/%.out
cp $< $@
然而,这个 makefile 并没有完全达到我想要的效果。如果我运行,make outputs/a.txt
它将应用我编写的规则,并重新生成输出文件(如果它已过时),但如果我只是运行,make
则不会发生任何情况:
make: *** No targets. Stop.
有没有办法告诉 make 默认情况下我想为输入文件夹中的每个文件生成一个输出文件?
编辑:使输出文件具有与输入文件不同的文件后缀。
答案1
您通常会使用如下的 makefile 来完成此操作:
IN = $(wildcard inputs/*.txt)
OUT = $(subst inputs/,outputs/,$(IN))
outputs/%.txt: inputs/%.txt
cp $< $@
default: $(OUT)
这使得默认目标(文件中的第一个目标)取决于目录字符串从输入更改为输出的OUT
现有文件的全局扩展。IN
如果您想更改后缀,还有许多其他内置函数可以操作目标。例如,您可以添加中间操作:
IN2 = $(addsuffix .out,$(basename $(IN)))
该basename
函数将删除尾随.txt
,并addsuffix
添加尾随.out
。