假设我有一些我需要的库作为目标的先决条件,并且这些库存储在包含库名的目录中:
.
|-- Makefile
|-- a
| |-- Makefile
| `-- lib-a
|-- b
| |-- Makefile
| `-- lib-a
`-- out
其中out
同时需要a/lib-a
和b/lib-b
。只需输入目录并在那里执行make lib-<X>
即可构建两个库。
我想要一个带有模式规则以避免重复的Makefile
,如果这两个文件位于同一目录或不同目录但具有相同名称,即。我只需要使用%
一次:
all: out
out: a/lib-a b/lib-b
cat $^ > out
%/lib-%:
make -C $(dir $@)
但是,这不起作用,因为%/lib-%
模式是非法的。
答案 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)