【问题标题】:GNU Make pattern rule depending on non-pattern fileGNU Make 模式规则取决于非模式文件
【发布时间】:2016-08-27 19:36:45
【问题描述】:

在 GNU Make 中,依赖于非模式文件的模式规则的语义究竟是什么?

我在 Makefile 中有以下 sn-p。当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 $< $@

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    它与依赖于非模式的模式规则没有任何关系。这很好,它具有预期的语义:对于以.b 结尾的任何文件,如果它相对于文件move_a_to_b.artifact 已过期,则将运行配方。

    您的问题是您没有定义模式规则,而是删除模式规则。模式规则必须始终有一个配方。没有配方的模式规则将删除模式规则。见Canceling Pattern Rules

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

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

    【讨论】:

    • 我认为它与模式目标有关,具体取决于非模式先决条件。但你证明并非如此。感谢您消除这种困惑! :-)
    • %.b : move_a_to_b.artifact ; 也适用于明确的空配方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多