模式规则与目录和库中发生的模式

时间:2016-08-11 12:06:42

标签: makefile

假设我有一些我需要的库作为目标的先决条件,并且这些库存储在包含库名的目录中:

.
|-- 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 $@)

但是,这不起作用,因为%/lib-%模式是非法的。

1 个答案:

答案 0 :(得分:2)

在调用子make时,不应该使用原始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)