我想知道,如果有可能写一个Makefile几个规则,每一个定义了自己的先决条件,并执行所有这些相同的配方,而无需复制的配方。 例:
TARGETS= file1 file2 file3
all: $(TARGETS)
file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1
cat $^ > $@
谢谢!
我想知道,如果有可能写一个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 $^ > $@
只是为了澄清。
通用生成规则是这样的:
targets... : prerequisites...
recipe
...
该规则的任何部分都可以省略。 如果没有配方,可以填充在makefile任何地方先决条件列表,可发生于多种规则语句的左手侧的目标。
例如,下面是等效于上面的例子(当然,假设生成文件被适当地设计成使得先决条件的顺序并不重要):
file1 file3 : dep1
file1 file2 file3 : dep2
file2 : dep3 dep4
不像上市的先决条件,也可以为每个目标至多有一个明确的食谱。 配方内,您可以使用自动变量来获取目标名称,先决条件列表等。
作为@Calmarius在评论中提到了这一点并不适用于模式的规则 ,就像%.txt: %.foo
。 目标中的多个模式意味着该规则同时产生所有这些目标。
这种模式规则有两个目标:
%.tab.c %.tab.h: %.y bison -d $<
这告诉make配方
bison -d xy
将使双方x.tab.c
和x.tab.h
。 如果文件foo取决于文件parse.tab.o
和scan.o
和文件scan.o取决于文件parse.tab.h
,当parse.y
改变,配方bison -d parse.y
会只执行一次,而两者的先决条件parse.tab.o
和scan.o
会满意的。
人们可以在虽然模式规则定义多个先决条件(即,只要它的目标包含%
干的,否则这将是一个常规的规则)。