【问题标题】:Avoid running GNU make recipe when prerequisite is updated更新先决条件时避免运行 GNU make recipe
【发布时间】:2014-08-04 03:31:47
【问题描述】:

我有一个如下所示的 Makefile:

foo: bar                                                                                                                                
        touch foo
        sleep 2
        echo UPDATED > bar

bar: baz
        cp baz bar
        sleep 2

bar 最初并不存在,因此它是从baz 复制而来的。然而,构建foo 的副作用是bar 也被修改,使其时间戳可能比foo 的时间戳更新。有没有解决的办法?仅订单依赖项会有所帮助吗?

另外,如果 baz 稍后被修改,bar 和 foo 将需要重建。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    解决方案 1

    bar 更新之后touch foo 就足够了。这样foo总是比bar更新。

    foo: bar                                                                                                                                
            sleep 2
            echo UPDATED > bar
            touch foo
    
    bar: baz
            cp baz bar
            sleep 2
    

    解决方案 2

    仅订单的先决条件,例如

    foo: | bar                                                                                                                                
        touch foo
        sleep 2
        echo UPDATED > bar
    
    bar: baz
        cp baz bar
        sleep 2
    

    也可以;但请记住,仅订购的先决条件是Makefile 语法的 GNU 扩展,因此不能完全移植。

    编辑

    此外,如果您希望在修改baz 时重建barfoo,那么唯一可行的解​​决方案是第一个。

    【讨论】:

      【解决方案2】:

      是的,如果您需要 barfoo 存在,但不需要仅仅因为 bar 更改而重建 foo,那么仅订单的先决条件听起来就像您想要的那样。

      您也可以只在规则末尾使用touch foo,并完全避免这种“foo 会导致下次重新构建”的问题,假设这在此环境中是可行的。

      【讨论】:

      • 我在问题的末尾添加了另一个条件。我看到的仅订单依赖的问题是,如果 baz 被修改, foo 将不会被重建。
      • 正确,不幸的是,你不能吃蛋糕。这就是为什么我提供了第二个选项(@RobertoReale 在他的回答中反映),即确保您在规则正文中最后触摸目标,从而避免此问题。
      猜你喜欢
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 2012-09-17
      • 1970-01-01
      相关资源
      最近更新 更多