2010-02-02 57 views
62

經過多年的不使用make,我發現自己需要它,現在的GNU版本。我很確定我應該能夠做我想做的事,但還沒有想出如何或找到與谷歌等答案如何讓GNU明確測試失敗?

我想創建一個測試目標,將執行我的程序多次,將結果保存在日誌文件中。一些測試應該會導致我的程序中止。不幸的是,我的makefile在第一個導致錯誤的測試中放棄。我有類似:

# Makefile 
# 
test: 
     myProg -h > test.log    # Display help 
     myProg good_input >> test.log  # should run fine 
     myProg bad_input1 >> test.log  # Error 1 
     myProg bad_input2 >> test.log  # Error 2 

通過以上,使bad_input1運行後退出,從來沒有得到的bad_input2運行。

+0

製作。可能會遇到很多問題,包括:in | a | piped | sequence',最後一個決定退出代碼;'a; more; involved; recipe; line;'患有同樣的問題;沒有跳過很​​多障礙,用不同的參數重複地運行同樣的事情可能會對腳本造成麻煩,我通常選擇對腳本進行腳本編寫,如果需要,可以使用腳本kefile。 – 2015-10-02 20:28:40

+0

作爲替代['set -e'](http://stackoverflow.com/questions/3474526/stop-on-first-error)在bash中可以使錯誤輸出在命令失敗時類似於使配方行。 – 2015-10-02 20:32:00

回答

16

,如果你想要求目標失敗的正確的解決辦法是否定其退出代碼

# Makefile 
# 
test: 
    myProg -h > test.log    # Display help 
    myProg good_input >> test.log  # should run fine 
    ! myProg bad_input1 >> test.log  # Error 1 
    ! myProg bad_input2 >> test.log  # Error 2 

現在,它是在這兩個案件成功錯誤

+1

我會晚點指出,如果你的shell不是Bash,''''關鍵字可能不可用。 – tripleee 2017-08-01 08:08:29

120

命令之前,例如:

-myProg bad_input >> test.log 

GNU做出那麼將忽略進程退出代碼放在一個-

+1

是的,但是這意味着使用'make test'在腳本中運行,如果失敗,意味着測試不通過! – 2013-08-24 21:02:43

+6

雖然這並不回答實際問題,但它通過閱讀標題來回答問題的出現,這就是爲什麼它有這麼多的讚揚。 – LukeGT 2014-10-23 08:49:13

+1

@LukeGT:部分原因是這個選票比tripleee的答案多得多,因爲這是在四年之前選擇的答案提供了更好的答案。 – GreenMatt 2015-02-03 14:02:01

30

嘗試運行它作爲

make -i 

make --ignore-errors 

其忽略所有規則的所有錯誤。

我也建議運行它作爲

make -i 2>&1 | tee results 

,讓你得到了所有的錯誤和輸出,看看發生了什麼。

僅僅在錯誤發生後盲目地繼續工作可能不是你真正想做的事情。 make實用程序本質上通常依靠先前命令的成功完成,以便它可以使用這些命令的人爲因素作爲稍後要執行的命令的先決條件。

BTW我倒是高度建議得到的the O'Reilly book on make副本。第一版對製作的基本性質,特別是其後向鏈接行爲有很好的概述。後來的版本仍然不錯,但是第一版。仍然對實際發生的事情有最清晰的解釋。事實上,我自己的副本是我向傳給我的人詢問有關make的「WTF?問題」的第一件事! ( - :

+1

這工作得很好。感謝您的迴應。 – GreenMatt 2010-02-03 14:18:17