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 $@