2016-08-11 94 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)