如何在Makefile中实现日志同时输出到文件与标准输出且出错自动删除?
解决Makefile日志同时输出与错误时自动清理的问题
可以通过结合bash的pipefail选项和.DELETE_ON_ERROR(或临时文件过渡)来实现需求,核心是让make能正确捕获程序的错误状态,避免生成损坏的日志文件。
方案一:直接写入目标文件+自动清理
# 指定用bash执行命令,因为pipefail是bash特性 SHELL := /bin/bash .DELETE_ON_ERROR: my.log my.log: prereqs set -o pipefail; myprogram | tee $@
set -o pipefail:让bash管道的退出码等于管道中第一个失败命令的退出码,确保myprogram崩溃时,整个命令返回非0,make会判定目标构建失败。.DELETE_ON_ERROR: my.log:当目标构建失败时,自动删除已生成的损坏my.log,下次执行make my.log会重新构建。tee $@:同时将程序输出写入my.log和标准输出。
方案二:临时文件过渡
SHELL := /bin/bash my.log: prereqs set -o pipefail; myprogram | tee temp-$@ && mv temp-$@ $@
- 只有当
myprogram成功执行(管道返回0)时,才会将临时日志temp-my.log重命名为最终的my.log。 - 若
myprogram失败,临时文件会保留,但my.log不会被更新或创建,后续make会自动重新触发构建,同时tee依然能将输出打到标准输出。
内容的提问来源于stack exchange,提问作者j13r
相关产品推荐
相关产品推荐

