2009-09-30 134 views
2

(免責聲明:我習慣了scons的......我用make有些雛)化妝:化妝分層文件

語境:我使用的Eclipse CDT產生的makefile。

比方說,我有一個項目目錄'lib'和2個構建配置'調試'和'發佈'。 Eclipse CDT正常地爲每個構建配置生成一個makefile。所述makefile最終駐留在「Debug」和「Release」文件夾中。

現在,我想要做的是在文件夾'lib'中生成一個makefile,其中調用 makefiles的Debug/makefile和Release/makefile。

我該怎麼做?

我希望能夠在文件夾'lib'中啓動'make',並且這兩個配置都將與指定的目標一起被調用。

解決方案 此基礎上的巨大投入聚集在這裏,我設計了以下內容:

MAKE=make 
BUILDS=Release Debug 
TARGETS=all clean 

$(TARGETS): 
    @for b in $(BUILDS) ; do $(MAKE) -C $$b [email protected] ; done 

$(BUILDS): 
    @for t in $(TARGETS) ; do $(MAKE) -C [email protected] $$t ; done 

%: 
    @for b in $(BUILDS) ; do $(MAKE) -C $$b [email protected] ; done 
+0

@hacker:謝謝! – jldupont 2009-09-30 15:44:31

+0

呃......再看看你的BUILDS規則。如果你「發佈」,它將使所有(在發佈),然後使得清潔(在發佈中)。我建議$(BUILDS):
$(MAKE)-C $ @ – Beta 2009-09-30 16:22:15

+0

Beta,當然它不應該是有意義的,它是一組示例;-) – 2009-09-30 16:31:10

回答

3

取決於什麼是「通話」。你想要麼

include $(BUILD)/Makefile

$(MAKE) -C $(BUILD) [email protected]

或一些這樣的。我猜你想要後者。也許像

release debug: 
    $(MAKE) -C [email protected] 

你明白了。

更多的例子:

BUILDS=release debug 
TARGETS=all clean 

$(TARGETS): 
    for b in $(BUILDS) ; do $(MAKE) -C $$b [email protected] ; done 

$(BUILDS): 
    for t in $(TARGETS) ; do $(MAKE) -C [email protected] $$t ; done 
+0

$(BUILD)變量代表什麼?使它自己*或*我想要指定它嗎? – jldupont 2009-09-30 14:15:10

+0

這是給你一個想法。就像如果你有'BUILD = debug'一樣,它將會被編譯(無論目標是什麼)到'$(BUILD)' - 'debug'目錄中。您的最終生成文件取決於您,不管怎樣;-) – 2009-09-30 14:16:44

+0

但是我不想在這個「頂級」makefile中指定所有支持的目標:我想將目標從命令行傳遞到* sub * makefiles ...我如何實現這一目標? – jldupont 2009-09-30 14:19:52

1
all: release debug 

release: 
    $(MAKE) -C ../Release 

debug: 
    $(MAKE) -C ../Debug 

我假設他們都在同一水平上。路徑必須來自您致電Make的地方。

+0

小修正:makefile位於* lib/Debug *和* lib/Release *中,所以它應該是** make -C Debug **和** make -C Release **。 工作正常!謝謝! – jldupont 2009-09-30 14:08:15

+0

但是,爲每個指定目標呢?我不想只限於'調試'和'發佈'。我不需要一個* $ @ *的地方? – jldupont 2009-09-30 14:10:36

+0

Beta的答案涵蓋了很好的:) – 2009-09-30 14:19:57

-2

擁有不同的目標來調用兩個目錄中的makefile。

all: debug product 

debug: 
     $(MAKE) -f debug/Makefile 

product: 
     $(MAKE) -f product/Makefile 
+0

不考慮* sub * makefiles中包含的相對路徑層次結構。 – jldupont 2009-09-30 14:28:19

+0

當然,這是一個示例,向您展示如何構建頂層makefile。您沒有提供您的子生成文件,因此無法知道它們包含相對路徑。 我工作的項目不依賴子構建文件中的相對路徑,但將其他參數傳遞給子構建文件以標識構建位置。 – JZeeb 2009-09-30 14:56:41

2

既然你提到 「指定目標(S)」,我建議:

 
%: 
    $(MAKE) -C Debug [email protected] 
    $(MAKE) -C Release [email protected] 

如果真是太一般了,你可以用$(目標),其中定位替換%是你定義一個你想要做的事情的清單。

+0

嘗試了這一點,但它不能使用默認命令launch * make *:它抱怨目標** all **沒有被指定;-( – jldupont 2009-09-30 14:27:20

+0

@ Jean-Lou Dupont:你只需要添加'all:debug釋放「到由Beta提供的makefile的開頭。 – 2009-09-30 15:14:20