Makefile中使用了倍数的规则共享相同的配方(Makefile with multiples r

2019-06-26 05:37发布

我想知道,如果有可能写一个Makefile几个规则,每一个定义了自己的先决条件,并执行所有这些相同的配方,而无需复制的配方。 例:

TARGETS= file1 file2 file3

all: $(TARGETS)

file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1
    cat $^ > $@

谢谢!

Answer 1:

是的,这是写在一个相当明显的方式:

TARGETS= file1 file2 file3

all: $(TARGETS)

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

$(TARGETS):
    cat $^ > $@

UPD。

只是为了澄清。

通用生成规则是这样的:

targets... : prerequisites...
    recipe
    ...

该规则的任何部分都可以省略。 如果没有配方,可以填充在makefile任何地方先决条件列表,可发生于多种规则语句的左手侧的目标。

例如,下面是等效于上面的例子(当然,假设生成文件被适当地设计成使得先决条件的顺序并不重要):

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

不像上市的先决条件,也可以为每个目标至多有一个明确的食谱。 配方内,您可以使用自动变量来获取目标名称,先决条件列表等。

UPD。 2

作为@Calmarius在评论中提到了这一点并不适用于模式的规则 ,就像%.txt: %.foo 。 目标中的多个模式意味着该规则同时产生所有这些目标。

这种模式规则有两个目标:

 %.tab.c %.tab.h: %.y bison -d $< 

这告诉make配方bison -d xy将使双方x.tab.cx.tab.h 。 如果文件foo取决于文件parse.tab.oscan.o和文件scan.o取决于文件parse.tab.h ,当parse.y改变,配方bison -d parse.y会只执行一次,而两者的先决条件parse.tab.oscan.o会满意的。

人们可以在虽然模式规则定义多个先决条件(即,只要它的目标包含%干的,否则这将是一个常规的规则)。



文章来源: Makefile with multiples rules sharing same recipe