我有一个看起来像这样的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将需要重建。
答案 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
时重建foo
和baz
,那么唯一可行的解决方案就是第一个。
答案 1 :(得分:1)
是的,如果您bar
需要foo
,但不需要仅因为foo
更改而需要重建bar
,那么只需订购仅限订单的先决条件喜欢你想要的东西。
你也可能只是在规则结尾处touch foo
而是避免这种情况导致自己下次重建时会被重建。完全问题,假设在这种环境下可行。