在GNU Make中,依赖于非模式文件的模式规则的语义究竟是什么?
我在Makefile中有以下代码段。如果foo.a
存在,则在调用foo.b
时,GNU Make似乎无法创建make foo.b
。
.SUFFIXES:
%.b: move_a_to_b.artifact
move_a_to_b.artifact:
mv foo.a foo.b
touch move_a_to_b.artifact
但是,以下工作正常并将文件从foo.a
移至foo.b
。
.SUFFXIES:
%.b: %.a
mv $< $@
就像这样,使用模式规则取决于模式规则
.SUFFIXES:
%.b: %.intermediate
mv $< $@
%.intermediate: %.a
mv $< $@
答案 0 :(得分:4)
根据非模式,它与模式规则没有任何关系。没问题,并且它具有预期的语义:对于任何以.b
结尾的文件,如果它与文件move_a_to_b.artifact
过时,则会运行配方。 / p>
您的问题是,您没有定义模式规则,而是删除模式规则。模式规则必须始终具有配方。没有配方的模式规则会删除模式规则。请参阅Canceling Pattern Rules。
你必须添加食谱,然后它会做一些事情:
%.b : move_a_to_b.artifact
@echo do something to create $@