我有一个输入*.in 文件列表,我想使用make 为每个文件生成一个输出*.out 文件。
target1.out : input1.in
{external program} < input1.in > target1.out
我对 gnu make 没有 0 经验,所以非常感谢帮助 我应该如何最好地使用 makefile?
最佳答案
你在找这个吗?
target%.out: input%.in
{external program} < $< >$@
现在make
知道如何从inputXX.in
生成targetXX.out
。您仍然需要添加一个实际的目标,无论是在命令行上(例如 make targetShirley.out
假设您有 inputShirley.in
),还是在单独的配方中。常见的安排是
sources := $(wildcard input*.in)
targets := $(patsubst input%.in,target%.out,$(sources))
.PHONY: all
all: $(targets)
(通常位于 Makefile
的顶部),然后 make all
将生成它能生成的所有文件。
常见的反模式是编写带有循环的单个配方,例如
everything:
for file in input*.in; do \
t=$${file%.in}; \
t=target$${t#input}.out; \
{external program} >"$$t"; \
done
(另请注意 shell 的美元符号必须加倍以防止 make
尝试解释它们)。除了笨拙之外,这还首先禁用了使用 make
的一个关键原因,即避免创建已经是最新的文件。
关于makefile - 如何为多个目标创建 makefile,每个目标在输出中具有相同的标识符作为输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58540414/