2013-07-24 64 views
19

我有一個目錄(root_dir),它包含許多子目錄(subdir1, subdir2, ...)。在每個子目錄中運行make

我想在root_dir的每個目錄中運行make,使用放置在其中的Makefile。 (顯然假設每個subdir...都有自己的Makefile)。

所以基本上有兩個問題:

  1. 如何獲得目錄的Makefile中(自動)的列表?
  2. 如何爲make文件中的每個目錄運行make?

正如我才能運行做出特定目錄knwow我注意做到以下幾點:

$(MAKE) -C subdir 

回答

33

有與做的各種問題子做內爲一個單一的配方循環。做多個子目錄,最好的辦法是這樣的:

SUBDIRS := $(wildcard */.) 

all: $(SUBDIRS) 
$(SUBDIRS): 
     $(MAKE) -C [email protected] 

.PHONY: all $(SUBDIRS) 

(只是想指出,這是GNU做出具體的,你沒有提到你使用make的版本的任何限制)。

ETA這是一個支持多個頂級目標的版本。

TOPTARGETS := all clean 

SUBDIRS := $(wildcard */.) 

$(TOPTARGETS): $(SUBDIRS) 
$(SUBDIRS): 
     $(MAKE) -C [email protected] $(MAKECMDGOALS) 

.PHONY: $(TOPTARGETS) $(SUBDIRS) 
+1

目錄列表什麼如果我也想要乾淨的目標? – Claudio

+0

爲什麼$(SUBDIRS)在.PHONY中?那是因爲目錄修改日期/時間不重要嗎?我有這個問題,因爲這些目錄不是假貨。鳳凰被假定爲假目標。 – shuva

+0

'.PHONY'用於每次運行makefile時都要創建的目標,無論它是否存在或是否過期。 – MadScientist

3

試試這個:

SUBDIRS = foo bar baz 

subdirs: 
    for dir in $(SUBDIRS); do \ 
     $(MAKE) -C $$dir; \ 
    done 

這可能會幫助你link

編輯:你也可以這樣做:

最簡單的方法就是做:

CODE_DIR = code 

.PHONY: project_code 

project_code: 
     $(MAKE) -C $(CODE_DIR) 

的.PHONY規則意味着project_code不是必須 建立了一個文件,還支持-C標誌指示運行光盤代碼目錄的變化(相當於 在打電話之前)。您可以使用相同的方法 在代碼Makefile中調用其他目標。

例如:

clean: 
    $(MAKE) -C $(CODE_DIR) clean 

Source

+0

其實我不想有在makefile – Alex

相關問題