[英]makefile: implicit rules: same target different prerequisites
我有以下makefile:
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 $@
DIR/%.txt: # rule #2
mkdir -p $(@D)
touch $@
DIR/%.xtx:
touch $@
我想生成DIR/%/def.xtx
每當DIR/%/abc.txt
產生; 否則僅生成DIR/%.txt
。
但是,將上述makefile與GNU Make 3.81一起使用時,只會生成DIR/3/abc.txt
,而不會生成DIR/%/def.xtx
。
遵循GNU make用戶手冊中的“隱式規則搜索算法”,我們得到:
(1)將t分為目錄部分d,其余部分為n。 例如,如果t為'src / foo.o',則d為'src /',而n為'foo.o'。
對於DIR/3/abc.txt
, d = DIR/3
和n = abc.txt
。
(2)列出所有模式規則之一,其目標與t或n相匹配。 如果目標模式包含斜線,則將其與t匹配; 否則,反對。
規則1和2匹配。
(3)如果該列表中的任何規則都不是任何匹配規則,則從列表中刪除所有非終結性匹配任何規則。
不確定:沒有規則從列表中刪除。
(4)從列表中刪除所有沒有配方的規則。
沒有規則被刪除。
(5)對於列表中的每個模式規則:
(5.a)找到詞干s,它是t或n的非空部分,與目標模式中的“%”匹配。
對於規則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/%.xtx:
規則DIR/%.xtx:
提到了DIR/3/def.xtx
。
經過這么長時間的解釋,我的觀點是(5.c)中我可能是錯誤的。
從手冊中
某個先決條件實際存在或被提及的規則始終優先於具有先決條件的規則,該條件必須通過鏈接其他隱式規則來制定。
您的規則#1需要鏈接,您的規則#2沒有先決條件,因此在嘗試構建DIR/3/abc.txt
時,Make將選擇#2而非#1。
編輯:
如果您可以站在目錄列表中:
DIRS := DIR/0 DIR/1 DIR/2 DIR/3
那么您可以使用靜態模式規則來做到這一點:
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 $@
DIR/%.xtx:
touch $@
(而且它也避免了.txt
規則的重復!)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.