makefile - GNU 根据非模式文件制定模式规则

标签 makefile gnu-make

在 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/

相关文章:

makefile - (M|m)akefile 语义是什么?

makefile - GNU Make - 配方中的变量扩展

bash - Makefile 中的脚本通常用于查找工具链的路径

c++ - Ubuntu 上的问题构建节(文本到语音)

go - 生成后的模板标识

makefile - 先决条件的搜索路径,如 vpath,但仅适用于某些模式规则

c - 用于插件编译的 Makefile

c - 为什么 $(< file.txt) 不适用于 makefile?

makefile - GNU 制作 : How to export the SHELL variable to sub-makes?

makefile - 为什么在 GNU makefile 中定义后不能使用 '='?文档建议我可以