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

如何为多个目标创建一个makefile,每个目标在输出中都有相同的标识符作为输入?,makefile,Makefile,我有一个输入*.in文件的列表,我想使用make为每个文件生成一个输出*.out文件 target1.out : input1.in {external program} < input1.in > target1.out target1.out:input1.in {外部程序}target1.out 我在gnu make方面没有经验,因此非常感谢您的帮助 我应该如何使用makefile做到最好?您正在寻找这个吗 target%.out: input%.in {e

我有一个输入*.in文件的列表,我想使用make为每个文件生成一个输出*.out文件

target1.out : input1.in
    {external program} < input1.in > target1.out
target1.out:input1.in
{外部程序}target1.out
我在gnu make方面没有经验,因此非常感谢您的帮助
我应该如何使用makefile做到最好?

您正在寻找这个吗

target%.out: input%.in
    {external program} < $< >$@
(通常在
Makefile
的顶部)然后
makeall
将生成它能生成的所有文件

一种常见的反模式是编写一个带有循环的配方,如

everything:
    for file in input*.in; do \
        t=$${file%.in}; \
        t=target$${t#input}.out; \
        {external program} >"$$t"; \
    done
(还要注意壳牌的美元符号必须加倍,以防止
make
试图解释它们)。除了笨拙之外,这首先禁用了使用
make
的一个关键原因,即避免创建已经是最新的文件。

看看。
$(通配符)
etc函数是特定于GNU make的;在legacy
make
中也有写这篇文章的方法,但这些方法往往会有点折磨人。如果您需要特定非GNU
make
的说明,请编辑您的问题以澄清您的需要。
everything:
    for file in input*.in; do \
        t=$${file%.in}; \
        t=target$${t#input}.out; \
        {external program} >"$$t"; \
    done