更新先决条件时,避免运行GNU make recipe

时间:2014-06-13 14:21:37

标签: makefile gnu-make

我有一个看起来像这样的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将需要重建。

2 个答案:

答案 0 :(得分:3)

解决方案1 ​​

touch foo更新后bar就足够了。这样,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扩展,因此不是完全可移植的。

修改

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

答案 1 :(得分:1)

是的,如果您bar需要foo,但不需要仅因为foo更改而需要重建bar,那么只需订购仅限订单的先决条件喜欢你想要的东西。

你也可能只是在规则结尾处touch foo而是避免这种情况导致自己下次重建时会被重建。完全问题,假设在这种环境下可行。