我在make
中自动化管道,该管道由多个可以链接在一起的操作组成。
文件名中指示了应用了哪种操作。
有时我必须在同一个命令链中重新运行相同的操作才能获得某个目标,例如make input.filtered.sorted.updated.sorted
应生成以下输出文件:input.filtered
,input.filtered.sorted
,input.filtered.sorted.updated
和input.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依赖树的第一次调用。
答案 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)