2017-04-11 108 views
0

我試圖使用GNU make的SECONDEXPANSION(使用3.81,3.80和更早版本不支持SECONDEXPANSION),如documentation中所述,通過隱式規則遍歷目標層次結構。層次結構是由宏/變量的定義:GNU make的SECONDEXPANSION和遞歸

.SECONDEXPANSION : 

top00.subblocks := mid00 mid01 
mid00.subblocks := bottom00 

wanted : top00.recurse ; 
works_but_not_wanted : top00.onelevel ; 

%.recurse : %.report $$(addsuffix .recurse,$$($$*.subblocks)) ; 
%.onelevel : %.report $$(addsuffix .report,$$($$*.subblocks)) ; 

%.report : 
    @echo REPORT: $* 

如果我嘗試make wanted,它會給:

make: *** No rule to make target `top00.recurse', needed by `wanted'. Stop. 

如果我嘗試make works_but_not_wanted它會給:

REPORT: top00 
REPORT: mid00 
REPORT: mid01 

這不是我想要的,因爲它不是報告最低的,只會出於明顯的原因而降低一級。但目標wanted失敗。看起來GNU make對遞歸行爲有困難。

有什麼建議嗎?

回答

0

這是documented behavior

沒有一個單一的隱含規則可以在鏈出現不止一次。

+0

謝謝,這很有道理。所以,即使不考慮二次擴張。對於基於層次結構定義宏的上述預期遞歸,除了明顯的遞歸調用之外,您是否有任何建議? – Paljas

+0

是的,因爲二次擴展不會創建新的模式規則。我不明白爲什麼它不能這樣工作,但要跟蹤以前的擴展以確保沒有重複是很重要的。 – MadScientist