2011-02-24 40 views
0

對於小C/C++項目我以前寫我的乾淨的目標如下:如何在Makefile中正確清理?

clean: 
    $(RM) *.o *~ 

對於稍大一點的項目,當來源子目錄布控,說src1src2,我會寫

clean: 
    $(RM) src1/*.o src1/*~ src2/*.o src2/*~ 

有了更子目錄,它很快變得凌亂......所以,我意識到我可以使用find命令是這樣的:

clean: 
    find . -name "*.o" -exec $(RM) {} \; 
    find . -name "*~" -exec $(RM) {} \; 

但是我發現人們常常結合使用findxargs而不是使用-exec,我不知道爲什麼,因爲它似乎很好地工作......

你用什麼,爲什麼?

我知道對於大項目或者爲了更好的兼容性,我應該使用cmake或autotools,但我喜歡小項目的Makefile的簡單性。

回答

1

由於exec每個文件創建一個子進程被刪除。另一方面,它們分批起來。

這是有效的區別:

rm src1/a.o 
rm src1/b.o 
rm src2/c.o 

和:

rm src1/a.o src1/b.o src2/c.o 

它可能不會管那麼多了,除非你有文件的很多但它是值得知道該用案件。

但我沒有使用或者這些方法的。我讓每個目錄負責構建自己(以及它的下級目錄),在那裏有一個Makefile。然後,從頂級之作,我有這樣的:

all: 
    for i in module1 module2 \ 
    do \ 
     cd $i \ 
     $(MAKE) all \ 
     cd .. \ 
    done 

同樣的協議爲clean目標。我不要假定每個單獨的子目錄清理是相同的動作。

通過這樣做,相關的操作是本地化的。如果我有一個目錄,其中.o文件實際上是第三方對象供我鏈接(所以我沒有源代碼),但我確保clean不會在相關的makefile中刪除它們。你的解決方案將軟管他們,造成很多焦慮和牙齒咬傷:-)

+0

GNU和BSD'find'支持對'-exec'的擴展,使得它們儘可能多地爲命令應用參數:'find ... -exec ... +' – 2011-02-24 05:35:43

+0

不錯!是否有充分的理由使用'cd ...' - >'make'而不是'make -C ...'? – Simon 2011-02-24 14:00:32

3

我習慣於(GNU find)的'find'版本也支持'-delete'標誌。我可能會這樣做:

clean: 
    find . -name '*.o' -delete 

因爲它是有效的,簡單和乾淨。

如果我有多個模式刪除,我通常重複命令:

clean: 
    rm -f a.out 
    find . -name '*.o' -delete 
    find . -name '*~' -delete 
+0

是的,我喜歡那樣! – Simon 2011-02-24 13:55:13