makefile - 如何为多个目标创建 makefile,每个目标在输出中具有相同的标识符作为输入?

标签 makefile

我有一个输入*.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/

相关文章:

c - 如何使用和构建一个 makefile 来将 scip 链接到 C?

c++ - Vc++/c++ Force Include Header 异常

makefile - 如何对 GNU Make 文件进行性能分析

c - 制作 : Circular mysh <- mysh dependency dropped

C:创建静态库并使用 Makefile 进行链接

c++ - 如何在 Ace Root 中为 MingW-64 构建 ACE no MakeFile

c++ - Makefile 不指定源文件

c - OpenCv Makefile Undefined symbols for architecture x86_64 错误

makefile - 将目标变量从模式匹配传递到静态

没有配方的 makefile 模式规则