多个规则共享同一配方的Makefile
我想知道是否有可能编写一个包含多个规则的Makefile,每个规则定义自己的先决条件,并在不复制配方的情况下执行相同的配方。例如:多个规则共享同一配方的Makefile,makefile,rules,Makefile,Rules,我想知道是否有可能编写一个包含多个规则的Makefile,每个规则定义自己的先决条件,并在不复制配方的情况下执行相同的配方。例如: TARGETS= file1 file2 file3 all: $(TARGETS) file1: dep1 dep2 file2: dep2 dep3 dep4 file3: dep2 dep1 cat $^ > $@ 谢谢 是的,它是以一种非常明显的方式写的: TARGETS= file1 file2 file3 all: $(TARGET
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 $^ > $@
UPD。
我只是想澄清一下
一般情况如下:
targets... : prerequisites...
recipe
...
规则的任何部分都可以省略。如果没有配方,可以在makefile的任何位置填充先决条件列表,目标可能出现在多个规则语句的左侧
例如,下面的例子与上面的例子相当(好吧,假设Makefile设计正确,前提条件的顺序无关紧要):
与列出的先决条件不同,每个目标最多只能有一个显式配方。在配方中,您可以使用它来获取目标名称、先决条件列表等
UPD。2.
正如@Calmarius在评论中提到的,这不适用于%.txt:%.foo
。
目标中的多个模式意味着规则一次生成所有这些目标
此模式规则有两个目标:
%.tab.c %.tab.h: %.y
bison -d $<
%.tab.c%.tab.h:%.y
野牛-d$<
这告诉make,配方bison-dx.y
将同时生成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
将得到满足
一个人可以在模式规则中定义多个先决条件(也就是说,如果其目标包含
%
词干,否则它将是一个常规规则)。@superruzafa,请参阅更新的答案,我试图解释规则的外观。如果您有模式规则,这将不起作用,例如:%.txt:%.foo。如果将一些txt文件添加到目标变量中,$^将扩展为零。我猜make thiks的$(TARGETS):
更具体,因此它不会应用一般规则。显然,您无法避免模式规则的重复。
%.tab.c %.tab.h: %.y
bison -d $<