2011-04-14 80 views
0

如何在目標執行過程中定義$(MAKEFILE)的變量? 基本上,我在一個特定的平臺「Makefile.aix」中命名的子目錄中有幾個make文件,而在所有其他目錄中只有Makefile。我想爲每個子目錄中定義的$(MAKEFILE)設置一個變量。代碼看起來像這樣。從子目錄設置目標變量爲生成文件的名稱

   do (\ 
         echo Making $$i ...;\ 
         cd $$i;\ 
         if [ -f Makefile.$(PLATFORM) ] \ 
         then\ 
          make -f Makefile.$(PLATFORM) \ 
         else\ 
          make -f Makefile\ 
         fi\ 
       ); done 

這其實不是一個化妝的風格,但沒有項目的具體的我不能建議任何更好:

MAKEFILE = Makefile 

SUBDIR = ./sub ./sub2 

    ifneq ($(wildcard Makefile),) 
      MAKEFILE = Makefile 
    else 
      MAKEFILE = Makefile.$(PLATFORM) 
    endif 


    all:; 
      @for i in $(SUBDIR);\ 
        do (\ 
          echo Making $$i ...;\ 
          cd $$i;\ 
          make -f $(MAKEFILE)\ 
        ); done 

回答

0

按照你的邏輯,我想提出更新有()第

1

對於不同的平臺,每個子目錄中是否只有一個Makefile.$(PLATFORM)或有幾個?
在第一種情況下,你可以做這樣的事情:

 
SUBDIR = ./sub ./sub2 

define script 
cd $(1); \ 
$(MAKE) -f Makefile* 

endef 

all: 
    $(foreach dir, $(SUBDIR), $(call script,$(dir))) 

(裏面定義的空行是顯著可以省略,如果你在該行$(MAKE) ...的末尾添加一個分號,處於領先地位。哪個你更喜歡一個長的命令行,包含所有的目錄,這將隨後在一個塊要執行的命令)

另一種script會(只是個人喜好的事)。

 
define script 
$(MAKE) -C $(1) -f $(notdir $(wildcard $(1)/Makefile*)) 

endef 

如果目錄中有多個Makefile.$(PLATFORM)文件,則它變得更加困難。我將不得不多想一想。

更新:在回答您的意見,這樣的事情應該工作:

 
define script 
$(MAKE) -C $(1) -f $(notdir $(wildcard $(1)/Makefile $(1)/Makefile.$(PLATFORM))) 

endef 
+0

有在幾個子目錄幾個不同的平臺。 「Makefile.aix,Makefile.sun,Makefile.hpux」 – Marc 2011-04-14 23:08:44

+0

@Marc:好的,我已經更新了我的答案。我假設'$(PLATFORM)'事先被定義爲其中一個選項,對吧? – eriktous 2011-04-15 00:18:49

+0

@eriktous。在對我的測試makefile進行更改後出現錯誤「Unix:/ src> make all make -C ./sub -f Makefile make -C./sub2 -f Makefile.aix make:***。/sub2:路徑名中的文件或目錄不存在..停止。 make:*** [all]錯誤2「 – Marc 2011-04-18 15:57:32

0

你可以做最本,包括遍歷目錄,使用GNU make的內置功能。將在一箇中心位置下面,說$(TOP_DIR)/mk/subdir.mk

makefile-for-dir = \ 
    $(if $(wildcard $(1)/Makefile),Makefile,Makefile.$(PLATFORM)) 

make-recursive = \ 
    $(foreach _d,$(1),$(MAKE) -C $(_d) -f $(call makefile-for-dir,$(_d)) &&) : 

在每次啓動遞歸品牌makefile文件,使用

include $(TOP_DIR)/mk/subdir.mk 

SUBDIRS = dir1 dir2 dir3 

.PHONY: all 
all: 
    [email protected]$(call make-recursive,$(SUBDIRS)) 
相關問題