如何在(GNU)make中重用同一目标的模式规则?

时间:2014-05-26 09:45:26

标签: makefile gnu-make

我在make中自动化管道,该管道由多个可以链接在一起的操作组成。 文件名中指示了应用了哪种操作。 有时我必须在同一个命令链中重新运行相同的操作才能获得某个目标,例如make input.filtered.sorted.updated.sorted应生成以下输出文件:input.filteredinput.filtered.sortedinput.filtered.sorted.updatedinput.filtered.sorted.updated.sorted。 但是,这似乎不可能一蹴而就。

考虑以下虚拟实现:

# just some dummy commands
save=and writing the result to $@
filter=@echo filtering $< accoring to some critera $(save)
sort=@echo sorting $< according to some criteria $(save)
update=@echo updating some values of $< according to $(word 2,$^) $(save)

# assume these input files exist
.PHONY : input update_table

# keep all intermediate files
.SECONDARY :

# this is what I would like to build
desired_target : input.filtered.sorted.updated.sorted

# this is what I can build
possible_target : input.filtered.sorted.updated

# just some dummy rules
%.filtered : % ; $(filter)
%.sorted : % ; $(sort)
%.updated : % update_table ; $(update)

运行make(即make desired_target)会导致以下错误:

make: \*** No rule to make target `input.filtered.sorted.updated.sorted', needed by `desired_target'.  Stop.

但是,make possible_target工作正常:

filtering input accoring to some critera and writing the result to input.filtered
sorting input.filtered according to some criteria and writing the result to input.filtered.sorted
updating some values of input.filtered.sorted according to update_table and writing the result to input.filtered.sorted.updated

有趣的是,运行touch input.filtered.sorted.updated && make按预期工作:

filtering input accoring to some critera and writing the result to input.filtered
sorting input.filtered according to some criteria and writing the result to input.filtered.sorted
updating some values of input.filtered.sorted according to update_table and writing the result to input.filtered.sorted.updated
sorting input.filtered.sorted.updated according to some criteria and writing the result to input.filtered.sorted.sorted.updated.sorted

如何在不事先make中间目标的情况下让touch运行?

附录:

如果前面的示例中不清楚,make possible_target && make [desired_target]工作正常。所以我想摆脱使用make s依赖树的第一次调用。

2 个答案:

答案 0 :(得分:1)

来自make manual - 10.4 Chains of Implicit Rules

  

链中不会出现多个隐式规则。这个   意味着make甚至不会考虑这样一个荒谬的事情   通过运行链接器两次从foo.o.o制作foo。这个约束   具有防止搜索中任何无限循环的额外好处   对于隐式规则链。

因此,对我来说,唯一的方法是创建一个中间规则,如possible_target,并将其添加为desired_target的依赖项。

desired_target : possible_target

答案 1 :(得分:0)

我写了a patch against 3.82,其中添加了-M选项,允许多次使用相同的规则。

我将它用于包含100多种此类规则的特定Makefile。

如果你使用它或者你想要它适应,请告诉我。