不止一種方法去做一件事
假設我們有main/Makefile
,main/subOne/def.mk
,main/subTwo/def.mk
。和main/subOne/subThree/def.mk
,以及各種源文件和頭文件(foo.cc
和bar.h
)。
首先,我們必須決定如何讓知道哪些目標構建和遞歸哪些子目錄到,在EAC h目錄。最安全的方法是將它們列在相應的def.mk
文件中。
那麼大問題:遞歸還是非遞歸?
遞歸Make(當Make執行Make的另一個實例時)是粗略但有效的。它導致更簡單的makefile,但是阻止Make使用它的依賴處理來完全生效,所以構建過程可能是低效的。 (許多人認爲遞歸製作只是普通的壞因爲這個原因,但我認爲它有它的用途。)
Makefile
:
SUBDIRS := subOne subTwo
-include def.mk
all: $(SUBDIRS)
.PHONY: $(SUBDIRS)
$(SUBDIRS):
@make -C [email protected] -f ../$(STACK)Makefile STACK=../$(STACK)
注意,變量STACK
(或任何你想將它命名)跟蹤的路徑備份到makefile。
subOne/def.mk
:
SUBDIRS := subThree
all: alpha.o
alpha.o: alpha.h
subTwo/def.mk
:
SUBDIRS :=
all: beta.o
beta.o: beta.h
subOne/subThree/def.mk
:
SUBDIRS :=
all: gamma.o delta.o
gamma.o: gamma.h
delta.o: delta.h gamma.h
非遞歸版本是有點複雜,但如果你我會添加它're game ...
是的,所有這些都是可能的。你想聽聽所有這些,或者其中一個特別吸引你嗎?你想讓你的makefile系統*做什麼?* – Beta
@Beta:第一個,即 _是否有可能在父目錄中只有一個Makefile,並且每個子目錄只有def.mk,這樣父目錄的Makefile用於編譯子目錄?_ – meetrp
好吧,現在假設你有'main/Makefile'和'main/subOne/def.mk'。你想在哪裏運行Make,你想給它什麼參數以及你想要做什麼? – Beta