上面第一個答案中給出的for循環解決方案實際上不應該按原樣使用。在該方法中,如果您的某個子製作失敗,則構建不會失敗(因爲它應該),而是繼續執行其他目錄。不僅如此,構建的最終結果將是最後一個子目錄的出口代碼,因此如果成功,即使其他子目錄失敗,構建也會成功。不好!!
all:
@for dir in $(SUBDIRS); \
do \
$(MAKE) -C $${dir} [email protected] || exit $$?; \
done
但是現在你有相反的問題:
你可以做這樣的事情解決它,如果你運行「make -k」(繼續即使有錯誤),那麼這將不會在這種情況下要服從。它會在失敗時退出。
上述兩種方法的另一個問題是,它們序列化所有子目錄的構建,因此如果啓用並行構建(使用make的-j選項),該構建只會發生在單個子目錄中,而不是跨所有子目錄。
Eregrith和sinsedrix的解決方案更接近您想要的,儘管在您調用遞歸make調用時,永遠不應使用「make」。正如johfel的例子,你應該總是使用$(MAKE)。
像這樣的東西是你想要什麼:
SUBDIRS = subdir1 subdir1 subdir3 ...
all: $(addprefix all.,$(SUBDIRS))
all.%:
@ $(MAKE) -C '$*' '$(basename [email protected])'
.PHONY: $(addprefix all.,$(SUBDIRS))
當然,你可以爲其他的目標,如「安裝」或任何添加更多的節這樣。有更多奇特的方法來處理任何通用目標的構建子目錄,但這需要更多的細節。
如果您想支持並行構建,您可能需要在此級別聲明依賴關係以避免相互依賴的目錄的並行構建。例如在上面的,如果你不能建立subdir3直到兩個subdir1後subdir2是成品(但它的確定爲subdir1和subdir2建立並聯),那麼你可以添加這樣的事情給你的Makefile:
all.subdir3 : all.subdir1 all.subdir2
是APP1 app2等包含其他Makefiles的子目錄名稱,還是其他Makefiles的名稱? (道歉我用Makefile的東西垃圾 - 發現它在極端混亂) – bph 2012-02-16 15:19:45
一個目標可以包含編譯器調用,打電話,回聲「你好」... – sinsedrix 2012-02-16 15:28:01