2015-10-12 110 views
0

Makefile的第一行是:使用父的Makefile編譯子目錄

包括def.mk

這使我能夠靈活地定義裏面def.mk的依賴關係,離開儘可能通用的Makefile

目前我正在每個子模塊下定義一個def.mk。但我是複製整個Makefile。

  • 是否有可能只有一個Makefile在父目錄和每個子目錄有只有def.mk使得父目錄的Makefile用於編譯子目錄?
  • 或者說,是有可能有一個最小的Makefile下的每個子目錄,後者又使用父的Makefile
  • 此外,Makefile需要使用在各自的目錄中定義的def.mk,而不是父母的。

PS:不幸的是,我沒有奢侈地使用任何automake工具。這些Makefiles必須手工製作! :(

PPS:另外,我有子目錄比一級深度更

+1

是的,所有這些都是可能的。你想聽聽所有這些,或者其中一個特別吸引你嗎?你想讓你的makefile系統*做什麼?* – Beta

+0

@Beta:第一個,即 _是否有可能在父目錄中只有一個Makefile,並且每個子目錄只有def.mk,這樣父目錄的Makefile用於編譯子目錄?_ – meetrp

+0

好吧,現在假設你有'main/Makefile'和'main/subOne/def.mk'。你想在哪裏運行Make,你想給它什麼參數以及你想要做什麼? – Beta

回答

1

不止一種方法去做一件事

假設我們有main/Makefilemain/subOne/def.mkmain/subTwo/def.mk。和main/subOne/subThree/def.mk,以及各種源文件和頭文件(foo.ccbar.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 ...

+0

如果您至少發佈了一個描述非遞歸構造的鏈接特別是考慮到你自己的答案比較「簡直就是壞」 – Dan

+0

@Dan:「一個描述非遞歸構造的鏈接」?我真的不知道你認爲這樣的鏈接會指向什麼(而且我沒有「比較而言,我自己的回答」簡直太糟糕了「。 – Beta

+0

」許多人認爲遞歸製作簡直不好「..」非遞歸版本稍微複雜一些,但如果您是遊戲,我會添加它......「對我來說,暗示」非遞歸作出「更好(否則,你爲什麼提到它?)如果不是這樣,回答答案還是完全刪除最後一句話? – Dan