2014-02-10 49 views
0

DEPENDS = $(OBJ _ $(DIR))我寫它使用多個迪爾斯構建一個makefile。在我的makefile我有這個如何Concat的在Makefile中

1:dir=arch 
2:CLEAN_FILES+=$(dir)/*.o 
3:include $(dir)/Rules.mk 
4:DEPENDS +=$(OBJS_arch) 

在拱創建一個$變量稱爲(OBJS_arch)的Rules.mk。這種邏輯適用於所有與拱門同級的目標。

我希望替換了$ 4號線(這是硬編碼)(OBJS _ $(DIR))

+0

我不知道這個問題是問。請更改它和/或提供更多細節。 – MadScientist

+0

更新問題 – mSO

+0

那麼,你爲什麼不只是寫'$(OBJS _ $(DIR))'?這怎麼辦並不像預期的那樣? – MadScientist

回答

0

檢查製作的join功能,

你可以嘗試做的,

DEPENDS=$(join OBJ_, $(dir)) 

使手動說,

$(join list1,list2) 

Concatenates the two arguments word by word: the two first words (one from each 
argument) concatenated form the first word of the result, the two second words 
form the second word of the result, and so on. So the nth word of the result 
comes from the nth word of each argument. If one argument has more words that the 
other, the extra words are copied unchanged into the result. 

For example, ‘$(join a b,.c .o)’ produces ‘a.c b.o’. 
+0

可以ü請舉例 – mSO

+0

它的工作原理。你知道如何創建一個數組並在Makefile中一個循環,這樣我可以從路徑 – mSO

+0

@mSO都能跟得上列表中選擇目錄。從未嘗試過。 –

1

噢,我想我終於明白你的問題有。如果你會顯示不正確的行爲並描述它不是你想要的,這將是非常有幫助的。

無論如何。問題是你正在使用遞歸變量DEPENDS。在實際使用變量之前,遞歸變量的右側不會擴展。所以,當你寫:

dir=one 
CLEAN_FILES+=$(dir)/*.o 
include $(dir)/Rules.mk 
DEPENDS +=$(OBJS_$(dir)) 

dir=two 
CLEAN_FILES+=$(dir)/*.o 
include $(dir)/Rules.mk 
DEPENDS +=$(OBJS_$(dir)) 

後這取決於都會有這樣的文字值:$(OBJS_$(dir)) $(OBJS_$(dir))。該價值直到後期纔會擴大。當它被擴展時,dir將是最後一個值,並且您將獲得同一個變量的多個副本。

你需要使用一個簡單擴展型變量,而不是一個遞歸變量。要做到這一點與追加,首先初始化變量爲簡單,然後追加將保持:

# Make sure DEPENDS is simply expanded 
DEPENDS := 

dir=one 
CLEAN_FILES+=$(dir)/*.o 
include $(dir)/Rules.mk 
DEPENDS +=$(OBJS_$(dir)) 

dir=two 
CLEAN_FILES+=$(dir)/*.o 
include $(dir)/Rules.mk 
DEPENDS +=$(OBJS_$(dir)) 

這將做你想做的。

要做到這一點在一個循環,因爲這是生成文件命令不是shell命令,你將不得不使用eval這絕對是高級用法。

像這樣的事情會做到這一點,但:

DIRS = one two three four 

# Make sure DEPENDS is simply expanded 
DEPENDS := 

# Define a user-defined macro to include Rules.mk and set DEPENDS 
define ADD_DEPENDS 
CLEAN_FILES += $1/*.o 
include $1/Rules.mk 
DEPENDS += $$(OBJS_$1) 
endef 

# Run it! 
$(foreach D,$(DIRS),$(eval $(call ADD_DEPENDS,$D))) 
+0

感謝MadScientist。你能幫助做一些像dir_list =一二三。並重復清理/包含/取決於循環 – mSO