具有多个规则的Makefile共享相同的配方

sup*_*afa 26 makefile rules

我想知道是否可以编写一个包含多个规则的Makefile,每个规则都定义了自己的先决条件,并在不重复配方的情况下执行所有相同的配方.例:

TARGETS= file1 file2 file3

all: $(TARGETS)

file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1
    cat $^ > $@
Run Code Online (Sandbox Code Playgroud)

谢谢!

Eld*_*mov 43

是的,它是以一种相当明显的方式编写的:

TARGETS= file1 file2 file3

all: $(TARGETS)

file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1

$(TARGETS):
    cat $^ > $@
Run Code Online (Sandbox Code Playgroud)

UPD.

只是为了澄清.

通用make规则如下所示:

targets... : prerequisites...
    recipe
    ...
Run Code Online (Sandbox Code Playgroud)

规则的任何部分都可以省略.如果没有配方,可以在makefile中的任何位置填充先决条件列表,目标可以出现在多个规则语句的左侧.

例如,以下示例等同于上面的示例(假设Makefile设计正确,以便先决条件的顺序无关紧要):

file1 file3       : dep1
file1 file2 file3 : dep2
file2             : dep3 dep4
Run Code Online (Sandbox Code Playgroud)

与列出先决条件不同,每个目标最多只能有一个明确的配方.在配方中,您可以使用自动变量来获取目标名称,先决条件列表等.

UPD.2

正如@Calmarius在评论中提到的,这不适用于模式规则,例如%.txt: %.foo.目标中的多个模式意味着规则一次生成所有这些目标.

此模式规则有两个目标:

%.tab.c %.tab.h: %.y
    bison -d $<
Run Code Online (Sandbox Code Playgroud)

这告诉make,配方bison -d x.y将同时x.tab.cx.tab.h.如果文件foo依赖于文件parse.tab.o并且scan.o文件scan.o取决于文件parse.tab.h,parse.y则更改时,配方bison -d parse.y 将仅执行一次,parse.tab.o并且scan.o将满足两者的先决条件 .

可以在模式规则中定义多个先决条件(即,只要其目标包含%词干,否则它将是常规规则).

  • 如果您有模式规则,这将无效,例如:%.txt:%.foo.如果将一些txt文件添加到TARGETS变量中,$ ^将扩展为空.我想让'$(TARGETS):`更具体,因此它不会应用通用规则.显然你无法避免模式规则的配方重复. (4认同)