我想知道是否可以编写一个包含多个规则的 Makefile,每个规则都定义了自己的先决条件,并在不复制配方的情况下执行所有这些规则。例子:
TARGETS= file1 file2 file3
all: $(TARGETS)
file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1
cat $^ > $@
谢谢!
是的,它是以一种相当明显的方式编写的:
TARGETS= file1 file2 file3
all: $(TARGETS)
file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1
$(TARGETS):
cat $^ > $@
只是为了澄清。
通用make 规则如下所示:
targets... : prerequisites...
recipe
...
规则的任何部分都可以省略。如果没有配方,可以在 makefile 中的任何位置填充先决条件列表,目标可以出现在多个规则语句的左侧。
例如,下面的例子等价于上面的例子(好吧,假设 Makefile 设计得当,所以先决条件的顺序无关紧要):
file1 file3 : dep1
file1 file2 file3 : dep2
file2 : dep3 dep4
与列出先决条件不同,每个目标最多可以有一个明确的配方。在配方中,您可以使用自动变量来获取目标名称、先决条件列表等。
正如@Calmarius 在评论中提到的那样,这不适用于模式规则,例如%.txt: %.foo
. 目标中的多个模式意味着该规则一次生成所有这些目标。
此模式规则有两个目标:
%.tab.c %.tab.h: %.y bison -d $<
这告诉 make 配方
bison -d x.y
将同时制作x.tab.c
和x.tab.h
。如果文件 foo 依赖于 filesparse.tab.o
并且scan.o
文件 scan.o 依赖于 fileparse.tab.h
,那么当parse.y
改变时,配方bison -d parse.y
将只执行一次,并且两者的先决条件parse.tab.o
都会scan.o
得到满足。
但是,可以在模式规则中定义多个先决条件(即,前提是其目标包含一个%
词干,否则它将是一个常规规则)。