如果在Makefile中出错,如何删除目标文件?

时间:2017-05-31 08:55:01

标签: bash makefile

在以下示例中,我希望在出现错误时删除foo。不幸的是它不起作用。

foo:
    perl -e 'die()' > $@ || [rm $@ -a true]

有什么不对?

2 个答案:

答案 0 :(得分:3)

GNU make可以为您做到这一点。

Special Built-in Target Names

  

.DELETE_ON_ERROR

     

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

创建文件是非原子操作是一个普遍问题。并非总是可以在终止时删除不完整或损坏的文件,例如,当程序被SIGKILL或OOM杀手杀死时。换句话说,所有涉及删除文件的解决方案都容易出现故障。

强大的通用解决方案是:

  1. 使用临时文件名创建文件。
  2. 文件完成并具有正确的权限后,将其重命名为最终名称。 Renaming a file is an atomic operations in UNIX,只要文件保留在同一个文件系统中。
  3. E.g:

    foo:
        perl -e 'die()' > $@~
        mv --force $@~ $@
    

答案 1 :(得分:0)

这对我有用......

Died at -e line 1.
removing foo because exit code was 255

输出

{{1}}