Makefile 当前提条件更新时,避免运行GNU make recipe

Makefile 当前提条件更新时,避免运行GNU make recipe,makefile,gnu-make,Makefile,Gnu Make,我有一个Makefile,如下所示: foo: bar touch foo sleep 2 echo UPDATED > bar bar: baz cp baz bar

我有一个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将需要重建。

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


您也可以只在规则末尾触摸foo,完全避免这个“foo导致下次重新生成”的问题,假设这在这种环境下是可行的。

解决方案1

仅在更新
后,
触摸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
时重建
bar
foo
,那么唯一可行的解决方案就是第一个。

我在问题的末尾添加了另一个条件。我所看到的纯订单依赖的问题是,如果baz被修改,foo将不会被重建。正确的,你不能有你的蛋糕和吃它。这就是为什么我提供了第二种选择(在他的回答中@robertreale反映了这一点),即确保您在规则体中最后一次接触目标,从而避免这个问题。