2012-10-23 88 views
1

我有以下生成文件:生成文件:隱式規則:同一目標的不同的先決條件

all: DIR/0/a.txt DIR/1/b.txt DIR/2/c.txt DIR/3/abc.txt 

DIR/%/abc.txt: DIR/%/def.xtx # rule #1 
    mkdir -p $(@D) 
    touch [email protected] 

DIR/%.txt: # rule #2 
    mkdir -p $(@D) 
    touch [email protected] 

DIR/%.xtx: 
    touch [email protected] 

我要生成DIR/%/def.xtx每當產生DIR/%/abc.txt;否則只產生DIR/%.txt

但是,在GNU Make 3.81中使用上面的makefile,只生成DIR/3/abc.txt,並且不生成DIR/%/def.xtx

繼我們得到了GNU使用戶手冊中的「隱規則搜索算法」:

(1)t分裂成目錄部分,稱爲d,其餘的,所謂的ñ。例如,如果t是'src/foo.o',那麼d是'src /',而n是'foo.o'。

對於DIR/3/abc.txtd = DIR/3n = abc.txt

(2)列出所有模式規則,其中一個目標匹配t或n。如果目標模式包含斜線,則它與t相匹配;否則,針對n。

規則#1和#2匹配。

(3)如果該列表中的任何規則不是匹配任何規則,則從列表中刪除所有非終結符匹配規則。

不確定:沒有規則從列表中刪除。

(4)從列表中刪除所有沒有配方的規則。

沒有規則被刪除。

(5)對於列表中的每個模式的規則:

(5.A)求出幹s,這是T的非空部分或正通過在目標圖案中的「%」匹配。

對於規則1,s = 3。 對於規則#2,s = 3/abc

(5.B)通過用S爲「%」計算的前提名稱;如果目標模式不包含斜線,則將d追加到每個必備項名稱的前面。

對於規則#1,它變爲:DIR/3/abc.txt: DIR/3/def.xtx 規則#2沒有先決條件。

(5.c)測試所有先決條件是否存在或應該存在。 (如果文件名在makefile中作爲目標提及或作爲明確的前提條件,那麼我們認爲它應該存在。)

不確定:DIR/3/def.xtx被規則DIR/%.xtx:提及。

經過這麼長時間的漫長解釋,我的意見是我可能在(5.c)中是錯誤的。

+0

我可能是錯的,但我不認爲'%'會匹配某個'/'的內容。因此,假設上面是你的'Makefile'的全部內容,你沒有任何匹配'DIR/3/def.txt'的規則,'make'應該抱怨「不知道如何構建DIR/3/def.txt「或其他內容。 – twalberg

+0

它[%]確實與'/'匹配;否則'DIR/0/a.txt','DIR/1/b.txt'和'DIR/2/c'不會被觸及;但他們這樣做。 –

+0

學到了新的東西......它似乎工作。那麼,也許'DIR/3/def.xtx'不會被創建,因爲第三條規則缺少'mkdir'部分?由於它是「DIR/3/abc.txt」的先決條件,因此需要在目錄存在之前首先構建,因此規則1中的「mkdir」在嘗試運行規則3之前不會發生。 – twalberg

回答

3

the manual

的規則,其先決條件實際存在或提到總是 優先於有先決條件的規則必須由 進行鏈接等潛規則。

您的規則#1需要鏈接,您的規則#2沒有先決條件,因此當嘗試構建DIR/3/abc.txt時,Make會選擇#2而不是#1。

編輯:

如果你能忍受有目錄的列表:

DIRS := DIR/0 DIR/1 DIR/2 DIR/3 

,那麼你可以用static pattern rule做到這一點:

all: DIR/0/a.txt DIR/1/b.txt DIR/2/c.txt DIR/3/abc.txt 

ABC_TXT := $(addsuffix /abc.txt, $(DIRS)) 

$(ABC_TXT): DIR/%/abc.txt : DIR/%/def.xtx 

DIR/%.txt: 
    mkdir -p $(@D) 
    touch [email protected] 

DIR/%.xtx: 
    touch [email protected] 

(它可以避免重複的.txt規則呢!)

+0

這回答了爲什麼規則#2選擇超過規則#1的問題,但是,我怎樣才能規避這種行爲? –

+0

我們可以在配方中明確地做出先決條件(即'make DIR/$ */def.xtx'),但這會非常低效。有另一種方法嗎?! –

+0

@AdrianoCarvalho:努力吧... – Beta

相關問題