具有共享相同配方的多个规则的 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.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 文件添加到 TARGETS 变量中,$^ 将扩展为空。我猜想$(TARGETS):
更具体,所以它不会应用通用规则。显然,您无法避免模式规则的配方重复。以上是关于具有共享相同配方的多个规则的 Makefile的主要内容,如果未能解决你的问题,请参考以下文章
两个或多个 Drupal 视图页面显示是不是可以共享相同的路径?