【问题标题】:Make with with multiple targets with pattern使用带有图案的多个目标进行制作
【发布时间】:2014-04-29 03:24:22
【问题描述】:

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

这是一个简化的示例生成文件,其中包含两种不同的文件构建方法。

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)

【问题讨论】:

    标签: makefile


    【解决方案1】:

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

    请参阅the documentation 了解模式规则。

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

    【讨论】:

    • 果然,我一定错过了模式页面上的最后一段。感谢您指出这一点并解释为什么它不起作用。这有点令人失望,但现在我至少明白这是设计使然。
    猜你喜欢
    • 2013-01-08
    • 1970-01-01
    • 2018-07-17
    • 2018-07-07
    • 1970-01-01
    • 2018-09-04
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多