【问题标题】:Makefile with multiples rules sharing same recipe具有共享相同配方的多个规则的 Makefile
【发布时间】:2012-07-11 13:38:56
【问题描述】:

我想知道是否可以编写一个包含多个规则的 Makefile,每个规则都定义了自己的先决条件,并在不复制配方的情况下执行所有这些规则。示例:

TARGETS= file1 file2 file3

all: $(TARGETS)

file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1
    cat $^ > $@

谢谢!

【问题讨论】:

    标签: makefile rules


    【解决方案1】:

    是的,写得很明显:

    TARGETS= file1 file2 file3
    
    all: $(TARGETS)
    
    file1: dep1 dep2
    file2: dep2 dep3 dep4
    file3: dep2 dep1
    
    $(TARGETS):
        cat $^ > $@
    

    更新。

    只是为了澄清。

    通用make rule 如下所示:

    targets... : prerequisites...
        recipe
        ...
    

    规则的任何部分都可以省略。如果没有配方,可以在 makefile 中的任何位置填充先决条件列表,目标可以出现在多个规则语句的左侧。

    例如,以下等价于上面的示例(好吧,假设 Makefile 设计得当,因此先决条件的顺序无关紧要):

    file1 file3       : dep1
    file1 file2 file3 : dep2
    file2             : dep3 dep4
    

    与列出先决条件不同,每个目标最多可以有一个明确的配方。在配方中,您可以使用automatic variables 获取目标名称、先决条件列表等。

    更新。 2

    正如@Calmarius 在 cmets 中提到的,这不适用于pattern rules,例如%.txt: %.foo。 目标中的多个模式意味着该规则一次生成所有这些目标

    此模式规则有两个目标:

    %.tab.c %.tab.h: %.y
        bison -d $<
    

    这告诉 make 配方 bison -d x.y 将同时制作 x.tab.cx.tab.h。 如果文件 foo 依赖于 文件 parse.tab.oscan.o 和文件 scan.o 取决于 文件parse.tab.h,当parse.y 改变时,配方bison -d parse.y 将只执行一次,并且两者的先决条件 parse.tab.oscan.o 会很满意。

    但是,可以在模式规则中定义多个先决条件(即,前提是其目标包含 % 词干,否则它将是常规规则)。

    【讨论】:

    • @superruzafa,查看更新后的答案,我试图解释规则的样子。
    • 如果您有模式规则,这将不起作用,例如:%.txt: %.foo。如果将一些 txt 文件添加到 TARGETS 变量中,$^ 将扩展为空。我猜想$(TARGETS): 更具体,所以它不会应用通用规则。显然,您无法避免模式规则的配方重复。
    猜你喜欢
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2018-02-18
    • 2014-12-08
    • 1970-01-01
    相关资源
    最近更新 更多