Makefile GNU根据非模式文件生成模式规则

Makefile GNU根据非模式文件生成模式规则,makefile,gnu-make,Makefile,Gnu Make,在GNUMake中,依赖于非模式文件的模式规则的语义到底是什么 我在Makefile中有以下代码片段。当foo.a存在时,当调用makefoo.b时,gnumake似乎不会创建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 .SUFF

在GNUMake中,依赖于非模式文件的模式规则的语义到底是什么

我在Makefile中有以下代码片段。当
foo.a
存在时,当调用
makefoo.b
时,gnumake似乎不会创建
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 $< $@
.SUFFXIES:
%.b:%
mv$<$@
与此一样,模式规则依赖于模式规则

.SUFFIXES:

%.b: %.intermediate
        mv $< $@

%.intermediate: %.a
        mv $< $@
。后缀:
%.b:%中级
mv$<$@
%.中级:%
mv$<$@

它与依赖于非模式的模式规则无关。这很好,并且它具有预期的语义:对于任何以
.b
结尾的文件,如果该文件
move\u a\u to_b.artifact
过期,则将运行配方

您的问题是您没有定义模式规则,而是在删除模式规则。模式规则必须始终具有配方。没有配方的模式规则将删除模式规则。看

您必须添加一个配方,然后它会做一些事情:

%.b : move_a_to_b.artifact
        @echo do something to create $@

我认为这与依赖于非模式先决条件的模式目标有关。但你证明了这一点。谢谢你消除了这种困惑!:-)<代码>%.b:将a\u移动到b.artifact也适用于显式空配方。