39

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

TARGETS= file1 file2 file3

all: $(TARGETS)

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

谢谢!

4

1 回答 1

60

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

TARGETS= file1 file2 file3

all: $(TARGETS)

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

$(TARGETS):
    cat $^ > $@

UPD。

只是为了澄清。

通用make 规则如下所示:

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

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

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

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

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

UPD。2

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

此模式规则有两个目标:

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

这告诉 make 配方bison -d x.y将同时制作x.tab.cx.tab.h。如果文件 foo 依赖于 filesparse.tab.o并且scan.o文件 scan.o 依赖于 file parse.tab.h,那么当parse.y改变时,配方bison -d parse.y 将只执行一次,并且两者的先决条件 parse.tab.o都会scan.o得到满足。

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

于 2012-07-11T20:41:12.483 回答