我想知道是否可以编写一个包含多个规则的Makefile,每个规则都定义了自己的先决条件,并在不重复配方的情况下执行所有相同的配方。例如:
TARGETS= file1 file2 file3
all: $(TARGETS)
file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1
cat $^ > $@
谢谢!
答案 0 :(得分:42)
是的,它的编写方式相当明显:
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来获取目标名称,先决条件列表等。
正如@Calmarius在评论中提到的,这不适用于pattern rules,例如%.txt: %.foo
。
目标中的多个模式意味着规则会立即生成所有这些目标 。
此模式规则有两个目标:
%.tab.c %.tab.h: %.y bison -d $<
这说明配方
bison -d x.y
将同时生成x.tab.c
和x.tab.h
。 如果文件foo依赖于 文件parse.tab.o
和scan.o
以及文件scan.o取决于 文件parse.tab.h
,当parse.y
更改时,食谱bison -d parse.y
将只执行一次,以及两者的先决条件 <{1}}和parse.tab.o
将会得到满足。
可以在模式规则中定义多个先决条件(即,只要其目标包含scan.o
词干,否则它将是常规规则。)