Makefile 使用具有图案的多个目标制作

Makefile 使用具有图案的多个目标制作,makefile,Makefile,我认为在一个规则中有多个目标与为每个目标定义具有相同配方的多个规则是一样的;然而,当目标/依赖项具有模式时,我似乎有一个问题 下面是一个简化的makefile示例,其中包含两种不同的构建文件的方法 all: $(foreach n, 1 2 3, $(foreach l, a b, out.$(l).$(n).txt)) 1.txt 2.txt 3.txt: touch $@ #Method One out.a.%.txt out.b.%.txt: %.txt touch $

我认为在一个规则中有多个目标与为每个目标定义具有相同配方的多个规则是一样的;然而,当目标/依赖项具有模式时,我似乎有一个问题

下面是一个简化的makefile示例,其中包含两种不同的构建文件的方法

all: $(foreach n, 1 2 3, $(foreach l, a b, out.$(l).$(n).txt))

1.txt 2.txt 3.txt:
    touch $@

#Method One
out.a.%.txt out.b.%.txt: %.txt
    touch $@

#Method Two
out.a.%.txt: %.txt
   touch $@
out.b.%.txt: %.txt
   touch $@
使用带有“make-n”的方法1,我得到

但是通过方法二,我得到了期望的输出

touch 1.txt
touch out.a.1.txt
touch out.b.1.txt
touch 2.txt
touch out.a.2.txt
touch out.b.2.txt
touch 3.txt
touch out.a.3.txt
touch out.b.3.txt
我在规则中没有看到多个目标的任何例外。我是否遗漏了文档中解释为什么这不起作用的部分?有没有一个简单的方法让它工作?(实际上,我要构建的文件组合比这个简单示例中要多得多)

(使用GNU Make 3.81)

隐式(模式)规则和显式规则的工作方式相反。对于显式规则,多个目标定义多个单独的规则,每个目标一个规则。对于模式规则,多个目标意味着对模式规则配方的一次调用将构建所有目标

请参见关于模式规则的说明


哦,顺便说一句,不,除了多次编写模式规则之外,别无选择。您可以使用各种方法自动生成模式规则,但仅此而已。

果然,我一定错过了模式页面的最后一段。谢谢你指出这一点并解释为什么它不起作用。这有点令人失望,但现在我至少明白这是故意的。
touch 1.txt
touch out.a.1.txt
touch out.b.1.txt
touch 2.txt
touch out.a.2.txt
touch out.b.2.txt
touch 3.txt
touch out.a.3.txt
touch out.b.3.txt