2016-10-03 126 views
3

我有模式依賴於一個makefile鏈,並在年底,他們應該走到一起,在一個文件中,如:*.x - >*.y - >onefile.z如何設置Makefile目標取決於模式先決條件?

所以我做了這樣的文件:

$ touch a.x b.x 

和規則:

%.y: %.x some-other-script 
    touch [email protected] 

onefile.z: %.y second-other-script 
    touch [email protected] 

此規則不起作用:

$ make onefile.z 
make: *** No rule to make target '%.y', needed by 'onefile.z'. Stop. 

使用通配符:

%.y: %.x some-other-script 
    touch [email protected] 

z: $(wildcard *.y) second-other-script 
    touch [email protected] 

這不工作之一:它認爲沒有*.y文件和收益作出onefile.z跳過的第一個規則。

$ make onefile.z 
touch onefile.z 

$ ls 
a.x b.x onefile.z Makefile 

我大概可以合併兩個規則合爲一體,但在實際應用中,有更多的步驟,有些是通過HTTP發出請求,並採取太多的時間,事實上,不應該沒有理由重複。

有沒有辦法使這種依賴?

回答

2

onefile.z: %.y second-other-script是一個規則規則,而不是一個模式規則或靜態模式規則,所以%字面解釋。即使它是一種模式規則,應該如何推斷詞幹應該匹配什麼?

$(wildcard *.y)告訴make找到與*.y匹配的所有文件,但當然還沒有,所以它返回一個空字符串。

以下應該工作,如果我理解正確你的問題:

xfiles := $(wildcard *.x) 
yfiles := $(xfiles:.x=.y) 

%.y: %.x some-other-script 
    touch [email protected] 

onefile.z: $(yfiles) second-other-script 
    touch [email protected] 

請參閱GNU上

+0

這確實奏效,非常感謝! (儘管SO將線條突破轉變爲打破格式化的東西,但讓我感到困惑了一段時間) –