我的Makefile中有一条大致如下的规则:
target_file: src_file
some_tool src_file > target_file
(当然,实际上我使用$@
和$<
,但对于这个问题,我更喜欢更明确的风格。)
问题是shell target_file
总是由新的时间戳创建,即使some_tool
失败也是如此。在这种情况下,存在空的target_file
,即使我修复了基础问题,也不会重建它,直到我手动删除target_file
或触摸src_file
。
此外,some_tool
只会写入标准输出,因此我无法通过some_tool ... -o target_file
等更清晰的方法解决此问题。
我目前的做法是删除
target_file: src_file
some_tool src_file > target_file || rm -f target_file
然而,这样做的缺点是Make
在some_tool
失败时不会注意到,因为在这种情况下rm
接管并返回exitcode 0(成功)。
另一种方法可能是:
target_file: src_file
some_tool src_file > target_file.tmp
mv target_file.tmp target_file
但是这种代码很乏味,失败后会留下令人讨厌的文件target_file.tmp
。
有没有更优雅的方法来解决这个问题?
答案 0 :(得分:8)
您可以使用special target .DELETE_ON_ERROR
:
如果.DELETE_ON_ERROR在makefile中的任何位置被提及为目标,则make将删除规则的目标(如果它已更改并且其配方以非零退出状态退出),就像它接收到信号时一样。 / p>
只需一行:
.DELETE_ON_ERROR:
所有失败的规则都会删除目标。