如何编写makefile使其忽略;“无关”;变化?

如何编写makefile使其忽略;“无关”;变化?,makefile,Makefile,假设我有一个这样的Makefile B: A quick-custom-script < $< > $@ C: B slow-custom-script < $< > $@ 然而,我想知道是否有更聪明的方法来实现我的目标?这与通常的惯例非常接近。它将比较放在同一个配方中,如下所示: B: A quick-custom-script < $< > $@T $(move-if-change) 这种组合到一个规

假设我有一个这样的Makefile

B: A
    quick-custom-script < $< > $@

C: B
    slow-custom-script < $< > $@

然而,我想知道是否有更聪明的方法来实现我的目标?

这与通常的惯例非常接近。它将比较放在同一个配方中,如下所示:

B: A
    quick-custom-script < $< > $@T
    $(move-if-change)
这种组合到一个规则中的优点是,如果
quick custom script
异常终止并且makefile再次运行,则配方将从头开始,部分写入的输出文件将被丢弃


使用
cmp
通常比
diff
更快,而且
mv
是原子的,因此它避免了再次引入相同的潜在损坏。

感谢您指出损坏问题。尽管如此,这种通常的惯例仍然依赖于快速定制脚本,因为它确实非常快速且便宜,因为它将始终运行(因为$@T会以某种方式被删除)?是的,但不清楚这是否实际相关。如果构建了
A
本身,则应
$(如果更改,则移动)
到其配方。如果它是一个原始输入文件,那么问题是没有op输入文件更改的频率有多高,以及使用这种构建树的时间有多长(因此,
quick custom script
被不必要地反复调用)。
B: A
    quick-custom-script < $< > $@T
    $(move-if-change)
move-if-change = @if cmp -s $@ $@T ; then rm $@T ; else mv $@T $@; fi