如果Make规则失败,则删除目标文件的优雅方式

时间:2016-10-08 07:59:42

标签: shell makefile stdout gnu-make redirectstandardoutput

我的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

然而,这样做的缺点是Makesome_tool失败时不会注意到,因为在这种情况下rm接管并返回exitcode 0(成功)。

另一种方法可能是:

target_file: src_file
        some_tool src_file > target_file.tmp
        mv target_file.tmp target_file

但是这种代码很乏味,失败后会留下令人讨厌的文件target_file.tmp

有没有更优雅的方法来解决这个问题?

1 个答案:

答案 0 :(得分:8)

您可以使用special target .DELETE_ON_ERROR

  

如果.DELETE_ON_ERROR在makefile中的任何位置被提及为目标,则make将删除规则的目标(如果它已更改并且其配方以非零退出状态退出),就像它接收到信号时一样。 / p>

只需一行:

.DELETE_ON_ERROR:

所有失败的规则都会删除目标。