具有多个规则的Makefile共享相同的配方

时间:2012-07-11 20:37:29

标签: makefile rules

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

TARGETS= file1 file2 file3

all: $(TARGETS)

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

谢谢!

1 个答案:

答案 0 :(得分:42)

是的,它的编写方式相当明显:

TARGETS= file1 file2 file3

all: $(TARGETS)

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

$(TARGETS):
    cat $^ > $@

UPD。

只是澄清一下。

通用make rule看起来像这样:

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

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

例如,以下示例等同于上面的示例(假设Makefile设计正确,以便先决条件的顺序无关紧要):

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

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

UPD。 2

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

  

此模式规则有两个目标:

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

这说明配方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   将只执行一次,以及两者的先决条件   <{1}}和parse.tab.o将会得到满足。

可以在模式规则中定义多个先决条件(即,只要其目标包含scan.o词干,否则它将是常规规则。)