簡體   English   中英

Makefile出錯時如何刪除目標文件?

[英]How to delete the target file in case of error in Makefile?

在以下示例中,我希望在發生錯誤的情況下刪除foo 不幸的是,它不起作用。

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

怎么了

GNU make可以為您做到這一點。

特殊內置目標名稱

.DELETE_ON_ERROR

如果將.DELETE_ON_ERROR提及為makefile中任何位置的目標,則make會刪除規則的目標(如果它已更改並且其配方以非零退出狀態退出),就像接收到信號時一樣。


創建文件是非原子操作是一個普遍的問題。 並非總是可以在終止時刪除不完整或損壞的文件,例如,使用SIGKILL或OOM殺手殺死該程序時。 換句話說,所有涉及刪除文件的解決方案都容易出錯。

強大的通用解決方案是:

  1. 用一個臨時文件名創建文件。
  2. 文件完成並具有正確的權限后,將其重命名為最終名稱。 只要文件保留在同一文件系統中, 重命名文件是UNIX中的原子操作

例如:

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

這對我有用...

foo: 
    @perl -e 'die()' > $@ || { echo "removing $@ because exit code was $${?}"; rm $@; }

產量

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM