GNU Make 模式规则依赖于非模式文件
GNU Make pattern rule depending on non-pattern file
在 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 $@
在 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 $@