构建命令已经写了一部分目标文件,后面才失败时,GNU Make 默认可能把这个半成品留在磁盘上。下次再跑,如果时间戳刚好没触发重建,就挺难排查。 .DELETE_ON_ERROR(实际使用时去掉反引号后的空格)可以让 Make 在配方失败且目标已被改动时删除目标。
环境是 GNU Make 4.3+,Linux 或 macOS,配方只用 POSIX shell:
.DELETE_ON_ERROR:
result.txt: input.txt
{ cat $<; printf 'partial\n'; false; } >$@
printf 'complete input\n' >input.txt
if make result.txt; then
printf 'expected make to fail\n' >&2
exit 1
fi
test ! -e result.txt
printf 'partial target removed\n'
这里的 false 模拟生成过程后半段出错。删掉 .DELETE_ON_ERROR: 再运行,result.txt 会留下已经写入的内容。它适合普通构建产物;如果某类文件本来就要保留断点数据,还是应该用临时文件加成功后的重命名,把语义写清楚。