如何在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
相关产品推荐
相关产品推荐

