有没有办法告诉 make 将规则应用于与模式匹配的每个文件?

有没有办法告诉 make 将规则应用于与模式匹配的每个文件?

我正在开发一个项目,其目录结构看起来有点像这样:

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

相关内容