GNU根据非模式文件制作模式规则

时间:2016-08-27 19:36:45

标签: makefile gnu-make

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

1 个答案:

答案 0 :(得分:4)

根据非模式,它与模式规则没有任何关系。没问题,并且它具有预期的语义:对于任何以.b结尾的文件,如果它与文件move_a_to_b.artifact过时,则会运行配方。 / p>

您的问题是,您没有定义模式规则,而是删除模式规则。模式规则必须始终具有配方。没有配方的模式规则会删除模式规则。请参阅Canceling Pattern Rules

你必须添加食谱,然后它会做一些事情:

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