使用带有模式的多个目标

时间:2014-04-28 19:07:31

标签: 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 $@

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

使用方法一和“make -n”我得到

touch 1.txt
touch out.a.1.txt
touch 2.txt
touch out.a.2.txt
touch 3.txt
touch out.a.3.txt

但是使用方法二我得到了所需的输出

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

我没有在规则in the on-line docs中看到多个目标的任何例外情况。我是否遗漏了部分文档,解释了为什么这不起作用?有一种简单的方法可以使它工作吗? (实际上,我要构建的文件组合比这个简单的例子要多得多。)

(使用GNU Make 3.81)

1 个答案:

答案 0 :(得分:3)

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

有关模式规则,请参阅the documentation

哦,BTW,不,除了多次编写模式规则之外别无选择。您可以使用各种方法自动生成模式规则,但这就是它。