在 GNU Make 中,依赖于非模式文件的模式规则的语义到底是什么?
我的 Makefile 中有以下代码片段。当 foo.a
存在时,GNU Make 在调用 make foo.b
时似乎不会创建 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 $< $@
最佳答案
它与依赖于非模式的模式规则没有任何关系。这很好,并且它具有预期的语义:对于任何以 .b
结尾的文件,如果它相对于文件 move_a_to_b.artifact
来说已经过时,则将运行配方。
您的问题是您没有定义模式规则,而是删除模式规则。模式规则必须始终有一个配方。没有配方的模式规则将删除该模式规则。请参阅Canceling Pattern Rules .
你必须添加一个配方,然后它就会做一些事情:
%.b : move_a_to_b.artifact
@echo do something to create $@
关于makefile - GNU 根据非模式文件制定模式规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39185022/