我有以下生成文件:生成文件:隱式規則:同一目標的不同的先決條件
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.txt
,d = DIR/3
和n = 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)中是錯誤的。
我可能是錯的,但我不認爲'%'會匹配某個'/'的內容。因此,假設上面是你的'Makefile'的全部內容,你沒有任何匹配'DIR/3/def.txt'的規則,'make'應該抱怨「不知道如何構建DIR/3/def.txt「或其他內容。 – twalberg
它[%]確實與'/'匹配;否則'DIR/0/a.txt','DIR/1/b.txt'和'DIR/2/c'不會被觸及;但他們這樣做。 –
學到了新的東西......它似乎工作。那麼,也許'DIR/3/def.xtx'不會被創建,因爲第三條規則缺少'mkdir'部分?由於它是「DIR/3/abc.txt」的先決條件,因此需要在目錄存在之前首先構建,因此規則1中的「mkdir」在嘗試運行規則3之前不會發生。 – twalberg