2011-09-02 43 views
3

如果我有這樣的事情:Makefile中找到陣列

PROJECTS += path/to/first 
PROJECTS += path/to/second 
PROJECTS += path/to/third 

LIBS += lib_output/first.lib 
LIBS += lib_output/second.lib 
LIBS += lib_output/third.lib 

我怎麼會從PROJECTS += path/to/firstLIBS += lib_output/first.lib項目相關聯?有沒有像makefile中可用的hashmap?或者可能在數組中搜索?

+2

Make對複雜變量並不擅長。你能否讓我們更好地瞭解你想要做什麼? – Beta

回答

12

您可以模擬使用computed variable names查找表和,使變量名可以包括some special characters像點和斜槓的事實:

PROJECTS += path/to/first 
PROJECTS += path/to/second 
PROJECTS += path/to/third 

LIBS += lib_output/first.lib 
LIBS += lib_output/second.lib 
LIBS += lib_output/third.lib 

lookup.path/to/first := lib_output/first.lib 
lookup.path/to/second := lib_output/second.lib 
lookup.path/to/third := lib_output/third.lib 

path := path/to/first 
$(info ${path} -> ${lookup.${path}}) 
path := path/to/second 
$(info ${path} -> ${lookup.${path}}) 
path := path/to/third 
$(info ${path} -> ${lookup.${path}}) 

輸出:

$ make 
path/to/first -> lib_output/first.lib 
path/to/second -> lib_output/second.lib 
path/to/third -> lib_output/third.lib 
+0

你可以在規則中使用它嗎?我有像foo.o這樣的規則:randompath/foo.c,我在各種路徑下有很多這樣的文件,我可以很容易地生成對象名稱$(notdir $(SOURCES:.c = .o)),但是我無法派生模式規則中的源名稱。我可以使用您的解決方案爲它們創建單個規則嗎? – user377178

+2

您可以嘗試使用['VPATH'](http://www.gnu.org/software/make/manual/make.html#General-Search)幫助查找來自不同目錄的來源。更好的解決方案是在對象目錄中複製源目錄層次結構。這將避免文件名衝突。 –

+0

好的指針。我認爲vpath(小寫)就是我需要的。我的目標文件名實際上是「平坦」的路徑,例如some_5_steps_deep_path_foo.c.o。比複製文件夾結構更有效,如果你只是從每個項目中選擇幾個文件。 – user377178

0

我不知道如果我完全理解你的問題,但我認爲word函數可能是你需要的(它可能是一個GNU make擴展):

$(word 2, $(PROJECTS))返回path/to/second,
$(word 2, $(LIBS))返回lib_output/second.lib