Makefile 当前提条件更新时,避免运行GNU make recipe
我有一个Makefile,如下所示: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
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反映了这一点),即确保您在规则体中最后一次接触目标,从而避免这个问题。