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

Posted

技术标签:

【中文标题】具有共享相同配方的多个规则的 Makefile【英文标题】:Makefile with multiples rules sharing same recipe 【发布时间】:2012-07-11 13:38:56 【问题描述】:

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

TARGETS= file1 file2 file3

all: $(TARGETS)

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

谢谢!

【问题讨论】:

【参考方案1】:

是的,写得很明显:

TARGETS= file1 file2 file3

all: $(TARGETS)

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

$(TARGETS):
    cat $^ > $@

更新。

只是为了澄清。

通用make rule 如下所示:

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

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

例如,以下等价于上面的示例(好吧,假设 Makefile 设计得当,因此先决条件的顺序无关紧要):

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

与列出先决条件不同,每个目标最多可以有一个明确的配方。在配方中,您可以使用automatic variables 获取目标名称、先决条件列表等。

更新。 2

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

此模式规则有两个目标:

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

这告诉 make 配方 bison -d x.y 将同时制作 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 会很满意。

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

【讨论】:

@superruzafa,查看更新后的答案,我试图解释规则的样子。 如果您有模式规则,这将不起作用,例如:%.txt: %.foo。如果将一些 txt 文件添加到 TARGETS 变量中,$^ 将扩展为空。我猜想$(TARGETS): 更具体,所以它不会应用通用规则。显然,您无法避免模式规则的配方重复。

以上是关于具有共享相同配方的多个规则的 Makefile的主要内容,如果未能解决你的问题,请参考以下文章

在一个规则中,目标元素具有多个类

两个或多个 Drupal 视图页面显示是不是可以共享相同的路径?

具有多个 UITableView(s) 的相同原型单元格

具有相同名称属性的输入字段的多个表单?是好是坏?

从同一 Makefile 中的配方更改 make 变量并调用另一个规则?

在本地主机上使用具有多个项目的相同容器