You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Makefile中正确使用中间文件?避免不必要重复构建

解决Makefile重复构建foo的问题

问题原因

GNU Make会自动把未出现在目标列表里的文件视为中间文件,执行完后会删除它们。因为tempfile被删除,下次执行make foo时,Make发现依赖的tempfile不存在,就会强制重新生成它,进而触发foo的重建——哪怕bar根本没变化。

解决办法

1. 标记tempfile为次要目标(保留文件)

用.PRECIOUS告诉Make不要删除tempfile,这样下次执行时会对比tempfile和bar的时间戳,只有bar更新才会重建依赖链。

.PRECIOUS: tempfile

tempfile: bar
    generate tempfile (using bar)

foo: tempfile
    generate foo (using bar)

2. 让foo直接依赖bar(跳过中间文件显式依赖)

如果生成foo的逻辑本质只需要bar,tempfile只是临时产物,直接调整依赖关系,把tempfile的生成和清理放到foo的规则里。这样Make只会对比foo和bar的时间戳,bar不变就不会重建foo。

foo: bar
    generate tempfile (using bar)
    generate foo (using bar)
    rm tempfile

3. 用stamp文件跟踪bar的变化(不保留tempfile)

如果必须保留中间步骤但又不想留tempfile,可以创建一个stamp文件来记录bar的更新状态。只有bar变化时才更新stamp,进而触发foo的构建。

bar.stamp: bar
    generate tempfile (using bar)
    touch $@  # 更新stamp的时间戳

foo: bar.stamp
    generate foo (using bar)
    rm tempfile  # 清理临时文件

内容的提问来源于stack exchange,提问作者YoavKlein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:36:29