簡體   English   中英

makefile:隱式規則:相同的目標不同的先決條件

[英]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.txtd = DIR/3n = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM