![](/img/trans.png)
[英]Makefile | Cleaning up after Make - Error: No such file or directory | Error: recipe for target * failed
[英]How to avoid “No such file or directory” Error for `make clean` Makefile target
我有一個Makefile,它定義了.PHONY清理目標,用於清理.o文件和可執行文件,目標如下:
...
.PHONY : clean
clean:
rm $(addprefix $(vq_DIR),$(vq_OBJS)) \
$(addprefix $(vq_DIR),vq) \
$(addprefix $(covq_DIR),$(covq_OBJS)) \
$(addprefix $(covq_DIR),covq) \
$(addprefix $(covq_2_DIR),$(covq_2_OBJS)) \
$(addprefix $(covq_2_DIR),covq_2) \
$(addprefix $(covq_2_DIR),$(test_OBJS)) \
$(addprefix $(covq_2_DIR),test)
一切都按預期工作,但是當其中一些文件不存在時, rm
會引發錯誤(沒有這樣的文件或目錄),並且輸出顯示Makefile目標失敗,當它明顯做我想要的時候。
是否有一種很好的方法可以告訴rm
命令“刪除這些文件,如果它們存在,如果不存在就不要抱怨”? 我查了手冊頁的rm
,發現沒有這樣的標志。
編輯:我實際上沒有注意到聯機幫助頁中-f
標志的描述,這是解決方案。
使用rm -f
(甚至更好的$(RM)
,由內置的make
規則提供,可以使用make -p
)而不是rm
在你的clean
規則中找到。
rm -f
將FORCE並且不輸出任何錯誤
當目標失敗時
執行目標時,它會根據事件是否成功返回狀態 - 如果目標失敗,則make將不會執行任何依賴它的目標。 例如,在上面的示例中,如果“clean”失敗,則rebuild將不會執行“build”目標。 不幸的是,如果沒有要刪除的核心文件,可能會發生這種情況。 幸運的是,通過在命令前面加一個減號,可以很容易地解決這個問題,其狀態應該被忽略:
clean: -rm -f *.o core
我放棄了rm。 以下命令將刪除文件和目錄。
find . -delete
要僅刪除文件或僅刪除目錄,請使用-type選項:
# remove only files
find . -type f -delete
# remove only dirs
find . -type d -delete
實際上,我已經創建了一個名為bomb的小腳本(基於該片段),可以在不抱怨的情況下刪除文件: https : //github.com/lingtalfi/bomb
晚會,但這是另一個解決方案,適用於我們古怪的構建環境:
if exist *.exe rm -f *.exe
不是免費輸出,但是減少並且干凈地退出:
# make clean
if exist *.exe rm -f *.exe
在解決這個問題之前,我嘗試了許多替代方案,但都有問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.