2013-10-24 60 views
0

我意識到,當我從主makefile運行makefile時,如果它們的子makefile失敗,則父繼續並且不返回錯誤退出代碼。 我試圖添加異常處理...但它不起作用。有任何想法嗎?調用makefile - 處理異常

MAKE_FILES := $(wildcard test_*.mak) 
compile_tests: 
     @echo "Compiling tests.$(MAKE_FILES)." 
     @for m in $(MAKE_FILES); do\ 
       $(MAKE) -f "$$m"; || $(error Failed to compile $$m)\ 
     done 

回答

1

不能使用使功能,如在你的食譜$(error ...),因爲所有使變量和函數展開第一,調用殼之前。因此,當make嘗試運行該配方時,錯誤函數會立即發生,甚至在啓動之前。

你必須使用shell構造失敗,而不是構造;是這樣的:

compile_tests: 
     @echo "Compiling tests.$(MAKE_FILES)." 
     @for m in $(MAKE_FILES); do \ 
       $(MAKE) -f "$$m" && continue; \ 
       echo Failed to compile $$m; \ 
       exit 1 
     done 

然而,即使這是不是真的很大,因爲如果使用-k它仍然會立即停止。更好的是採取什麼使做得很好,這是運行很多事情優點:

compile_tests: $(addprefix tests.$(MAKE_FILES)) 
$(addprefix tests.$(MAKE_FILES)): tests.%: 
     $(MAKE) -f "$*" 

一個說明,如果啓用-j這些將在並行中運行。不知道你是否沒有問題。

+0

謝謝。我想我也可以像這樣使用exit bash命令:make -f $$ m ||出口1; – max

+0

當然。但是你原來的解決方案有一個「回聲無法編譯」,所以我想保留這一點。如果你不關心它,那麼你可以直接調用exit。 – MadScientist