2013-03-30 47 views
20

我有一大堆的是與同類型的化妝規則構建的應用程序:沒有擴展名的Makefile模式規則?

apps = foo bar baz 

all: $(apps) 

foo: foo.o $(objects) 
    $(link) 

bar: bar.o $(objects) 
    $(link) 

baz: baz.o $(objects) 
    $(link) 

如果他們有一個擴展名(例如.x)我可以做一個模式規則,如:

%.x: %.o $(objects) 
    $(link) 

,我不必爲每個應用程序寫出新規則。

但他們沒有一個擴展,我敢肯定:

%: %.o $(objects) 
    $(link) 

將無法​​正常工作(因爲它指定了打造任何文件,你可以使用此規則)。

無論如何要指定一個規則將覆蓋所有的$(apps)構建規則?

回答

6
%: %.o $(objects) 
    $(link) 

以上應該工作。

您可以通過將其轉換成static pattern rule限制規則的範圍,因此,它是隻考慮您的目標清單:

$(apps) : % : %.o $(objects) # only consider this for $(apps) targets 
    $(link) 
0

不是一個答案,你在找什麼,但這可能解釋爲什麼這樣的通用代碼級別可能不會產生好的結果。 ...

靜態模式依賴乾的存在來匹配和構建依賴鏈。 與隱式規則(用於沒有任何收件人的目標)相同的方式。

我看到你試圖存檔,制定一個通用的規則,將滿足對象的所有目標檢查並鏈接到你的代碼中。

像這樣::

% : % : $(rule1) 
     echo/generic code ; 

,以便它被調用在不同的充場景

,因爲你不想添加一個擴展(這成爲一些問題的根源) 的所有應用程序與此相關的問題是,目標也會反映在依賴關係中,因爲無法區分目標的依賴關係。

因此,如果你沒有嘗試,我想你會到這裏來?

$ make -nf mk.t 
    mk.t:18: *** mixed implicit and static pattern rules. Stop. 

:),我會給這個明天再試,看看我是否能在真正通用的方式得到這個工作。不錯的問題,但。

+0

我不確定我是否理解,你是說[Beta](http://stackoverflow.com/a/15718701/1131467)的答案不正確? –

+0

不,不是我說的! ,所發佈的答案在理論上都是正確的 - 事實上我正在嘗試同樣的事情。制定靜態模式規則是這些場景的明顯選擇.....但試圖使它們過於通用不起作用。我只是發佈了我的觀察結果,這對我來說似乎很合理,只是爲了讓你知道。 – nsd