2012-06-14 72 views
4

所以我有這樣的目標依賴一個makefile:我可以在makefile目標中有多個%符號嗎?

all: $(foreach lang, $(LANGS), $(foreach models,$(MODELS),targetName$(model).xml$(lang))) 

和目標名稱目標看起來是這樣的:

targetName%.xml%: MODEL\=% targetName.xml* 

但它不工作。我得到這個錯誤:

make[1]: *** No rule to make target `targetNameMYMODEL.xmlen', needed by `all'. Stop. 

然而,呼籲「所有」與在目標名稱目標這樣的硬編碼語言工作:

all: $(foreach lang, $(LANGS), $(foreach models,$(MODELS),targetName$(model).xmlen)) 

,並呼籲「所有」沒有全部或目標名稱語言工作得很好。我在想也許Makefile不喜歡在目標名稱中有兩個百分號。另外,由於我有點繼承了這個makefile,有人能告訴我MODEL \ =%的含義是什麼嗎?還有另一個目標如下所示:MODEL%: ;但我不確定\ =%的含義。

編輯:

我有,比方說,5種型號列表,並列表說5種語言,我們的目標是產生25個文件,每一個組合: 所以基於此效應初探進一步明確的語言和模型。

targetName%.xml target最初將創建一個名爲targetName.xml的文件,但現在我需要它來構建類似targetName.xml的東西這就是爲什麼我需要兩個%符號。

如上所示,我通過嵌套的foreach循環訪問這兩個列表,但我很難將這些變量傳遞給目標。我試圖從foreach語句中導出語言變量,我試圖將targetName%.xml的內容放在for循環中以便循環語言。後者不起作用,因爲在循環的「do」部分有Makefile命令(例如eval)。

回答

2

你說得對,Make不喜歡目標名稱中的兩個%符號。這只是Make的通配符處理並非所有人都希望的方法之一。有一種方法可以生成迭代一個變量值的所有模式規則(並且自動使用%);這有點難看,但如果這就是你想要的,我們可以向你展示。

,但此行是一個爛攤子:

targetName%.xml%: MODEL\=% targetName.xml* 

除了目標兩個通配符的問題,最後PREQ,targetName.xml*將意味着正是:一個目標(或文件)呼籲targetName.xml*。星號不會被展開,也不會被擴展到以targetName.xml開頭的所有現有文件或其他任何文件的列表。

然後有MODEL\=%,這表明這個makefile的作者有點困惑(並且不相信測試)。如果通配符的值是foo,那麼這將指示一個名爲MODEL=foo的目標(或文件)的先決條件。 \「逃脫」=,以便Make不會中止,但這僅僅是抑制健康的錯誤消息。我認爲是作者的初衷是這樣的:

targetName%.xml: MODEL=% 

targetName%.xml: $(wildcard targetName.xml*) 
    do some things 

第一條規則是不指定的先決條件,它是設定一個目標特定變量。所以當Make試圖通過doing some things構建targetNamefoo.xml時,變量MODEL在該命令的上下文中將具有值foo。第二條規則有一個preq列表,由wildcard生成;你不能在一行中混合特定於目標的變量和preq。

我們可以給出進一步的建議,但是如果我們能夠更清楚地看到您想要做的事情會有所幫助。

相關問題