Makefile 用相同的图案制作目标两次

Makefile 用相同的图案制作目标两次,makefile,Makefile,我有很多库,我想作为依赖项构建它们: LIBS = libs/foo libs/bar 每个库都有一个我需要编译的对象,都在一个可预测的位置。它们是: libs/foo/lib/libfoo-O3.a libs/bar/lib/libbar-O3.a 我想有效地将我的LIBS字符串转换为以下规则: build : libs/foo/lib/libfoo-O3.a libs/bar/lib/libbar-O3.a libs/foo/lib/libfoo-O3.a: $(MAKE) -

我有很多库,我想作为依赖项构建它们:

LIBS = libs/foo libs/bar
每个库都有一个我需要编译的对象,都在一个可预测的位置。它们是:

libs/foo/lib/libfoo-O3.a
libs/bar/lib/libbar-O3.a
我想有效地将我的
LIBS
字符串转换为以下规则:

build : libs/foo/lib/libfoo-O3.a libs/bar/lib/libbar-O3.a

libs/foo/lib/libfoo-O3.a:
    $(MAKE) -C libs/foo

libs/bar/lib/libbar-O3.a:
    $(MAKE) -C libs/bar

我知道你不能使用
%
两次,所以不幸的是
libs/%/lib/lib%-O3。a
作为目标是不可能的。还有别的办法吗?带有
定义
模板的内容?

如果可以将LIBS变量更改为仅包含名称,则可以轻松执行:

LIBS = foo bar

LIBPATHS := $(foreach L,$(LIBS),libs/$L/lib/lib$L-O3.a)
如果不能,您仍然可以这样做,只是可读性稍差一些:

LIBS = libs/foo libs/bar

LIBPATHS := $(foreach L,$(LIBS),$L/lib/lib$(notdir $L)-O3.a)
然后只需添加如下内容:

$(LIBPATHS):
        $(MAKE) -C $(firstword $(subst /lib/, ,$@))