2012-02-16 93 views
1

我想創建一個Makefile(在父目錄中)調用其他Makefile(在子目錄中),這樣我就可以通過調用一個二進制文件(每個項目子目錄一個)來創建幾個二進制文件父母Makefile。使用make構建幾個二進制文件

我的研究一直受到在遞歸Makefiles上找到大量東西的阻礙,但我認爲這是你試圖建立幾個目錄Makefile的地方變成一個單個二進制文件?

也許我想要做的事情最好是由shell腳本處理,也許在每個子目錄中依次調用make,但我認爲Makefile可能是更優雅的解決方案?

任何指針感激地接受使用Linux和GNU工具鏈

回答

2

上面第一個答案中給出的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 
-1

每個makefile文件可以有多個目標

PS,它仍然是真正的遞歸makefile文件,它通常是寫:

all: target1 target2 target3 

target1 : 
    make -C subdir 

然後make all

+0

是APP1 app2等包含其他Makefiles的子目錄名稱,還是其他Makefiles的名稱? (道歉我用Makefile的東西垃圾 - 發現它在極端混亂) – bph 2012-02-16 15:19:45

+0

一個目標可以包含編譯器調用,打電話,回聲「你好」... – sinsedrix 2012-02-16 15:28:01

0

您可以通過

調用子目錄makefiles中的目標
all: 
    $(MAKE) -C subdirectory1 [email protected] 
    $(MAKE) -C subdirectory2 [email protected] 
    ... 

或更好

SUBDIRS=subd1 subd2 subd3 

all: 
    @for dir in $(SUBDIRS); \ 
    do \ 
     $(MAKE) -C $${dir} [email protected]; \ 
    done 
+0

非常優雅的解決方案 - 工作就像一個魅力... – bph 2012-02-16 15:58:41

+2

「for」不是必需的。你可以創建一個目標$(SUBDIRS):$(MAKE)-C $ @; – 2012-02-17 08:07:48

0

你確實應該從給定CMakeLists.txt配置文件中使用cmake生成Makefile文件自動。

這是random link爲您開始。 Here你可以找到一個簡單的示例項目,包括多個子目錄,可執行文件和共享庫。

相關問題