2016-08-11 135 views
0

假設我有一些圖書館,我需要爲先決條件的目標,而這些庫存儲在包含庫名稱的目錄:模式規則

. 
|-- Makefile 
|-- a 
| |-- Makefile 
| `-- lib-a 
|-- b 
| |-- Makefile 
| `-- lib-a 
`-- out 

其中out要求均爲a/lib-ab/lib-b。這兩個庫都可以通過簡單地進入目錄並在那裏執行make lib-<X>來構建。

我的想法Makefile與模式規則,以避免重複是這樣的,如果兩個文件都在同一個目錄或不同的目錄中,但具有相同的名稱,即可。我需要使用%只有一次:

all: out 

out: a/lib-a b/lib-b 
    cat $^ > out 

%/lib-%: 
    make -C $(dir [email protected]) 

然而,這並不工作,因爲%/lib-%模式是非法的。

+0

你可以把配方的罐裝配方,以避免重複的食譜內容,或者你可以使用'foreach','call'等來建立目標,以避免重複。 –

回答

2

調用子版本時,不應使用原始make命令。始終使用$(MAKE)(或${MAKE})變量。

總之,沒有辦法編寫一個模式規則,其中需要多個模式。

如果它們都具有相同的配方,然後做最簡單的事情就是構建目標列表,並將它們全部寫在一個單一的規則:

TARGETS := a b 

all: out 

OUT_TARGETS := $(foreach T,$(TARGETS),$T/lib-$T) 

out: $(OUT_TARGETS) 

$(OUT_TARGETS): 
     $(MAKE) -C $(@D) 

.PHONY: all out $(OUT_TARGETS)