2010-06-30 51 views
36

我不知道我怎樣才能避免在一個Makefile一些回聲:禁止的消息

clean: 
    rm -fr *.o 

這個規則會打印:

$>make clean 
rm -fr *.o 

$> 

如何避免那?

回答

21

其實我一直在尋找別的東西,加入這行來Makefile文件:

.SILENT:clean 

同時靜靜地執行「乾淨」目標的每一步。

直到有人指出一些缺點,我用這個作爲我最喜歡的解決方案!

+10

的缺點是,你從來沒有從你的作品中得到任何反饋,並且沒有任何命令行與「無聲」相反以關閉它。這就像用大錘打開一個罐子。 – 2012-04-26 22:44:59

7

如果你在命令前加@,它不會回顯到shell。嘗試將rm更改爲@rm。 (Reference

63

要下手:實際的命令必須在下一行(或至少是與GNU的情況下做,這可能是與其他製作的不同 - 我不知道那)

clean: 
    rm -rf *.o 

(注意,你需要一個TABrm -rf *.o之前在每一個規則)

使其成爲沉默可以通過前綴一個@來完成:

所以你的makefile變得

clean: 
    @rm -rf *.o 

如果沒有*.o要刪除的文件,你仍然可能最終得到一個錯誤信息。爲了抑制這些,添加以下

clean: 
    [email protected] -rf *.o 2>/dev/null || true 
  • 2>/dev/null管道的任何錯誤信息到/ dev/null的 - 所以你不會看到任何錯誤
  • 在指令前面的-可以確保make忽略非零返回代碼
+1

這是處理它希望bash的經典方式,但我一直在尋找解決這個問題的GNU Make方法。 當然,我在下一行有命令,只是急着寫下這個問題。 順便說一句,你怎麼看.SILENT答案(我的一個朋友發現)? – claf 2010-06-30 15:16:52

+0

我還沒有真正使用.silent,GNU Make手冊指出它僅支持歷史原因,但我確實喜歡它。它比你的命令中的許多'@'少冗長。 – plof 2010-07-01 02:20:59

+1

來想一想,'''和'||真正的「太多了 - 他們中的任何一個都應該足夠了。如果沒有東西需要刪除,你需要其中一個來防止Gnu Make退出。更好的辦法是使用'rm -f * .o',因爲如果沒有東西需要刪除,它不會返回錯誤。 – plof 2010-07-01 02:28:35

3

從手冊:.SILENT is essentially obsolete since @ is more flexible.

更糟糕的是,使印了太多的信息。警告/錯誤/私人消息被掩埋在輸出中。另一方面-s.SILENT)只能壓縮任何東西。特別是「無所事事」和「最新消息」可能是一種痛苦。沒有選擇來壓制他們。你必須積極地過濾它們或使用像colormake這樣的東西。下面是的grep的解決方案:

make | egrep -hiv 'nothing to be done|up to date' 

但產量將有行號。Perl的解決方案因此比較好,因爲它抑制了行號,並立即刷新標準輸出:

make | perl -ne '$|=1; print unless /nothing to be done|up to date/i' 

製作是一個有缺陷的工具。 "What’s Wrong With GNU make?"解釋這一點比我能做得更好。

10

我回應了這個古老的話題,因爲它出現在搜索的高位,答案令人困惑。要做用戶想要的,只需要:

clean: 
    @rm -f *.o 

@表示make不會迴應該命令。 -f參數rm告訴rm忽略任何錯誤,例如沒有*.o文件,並始終返回成功。

我從OP的例子中刪除了-r,因爲它意味着遞歸,這裏我們只是rm ing .o文件,沒什麼可遞歸的。

不需要2>&1 >/dev/null,因爲-f不會打印錯誤。

.SILENT: clean 

到位@的作品,但它不是在Makefile中的同一個地方,它影響的命令,所以有人維護項目以後可能會搞不清楚。這就是爲什麼@是首選。這是更好的參考地點。