多个规则共享同一配方的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

我想知道是否有可能编写一个包含多个规则的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 $^ > $@
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 $<