两次使用相同的模式制作目标

时间:2014-12-09 14:11:44

标签: 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) -C libs/foo

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

我知道你不能两次使用%,所以不幸的是libs/%/lib/lib%-O3.a是一个非首发目标。还有另一种方法吗?有define模板的东西吗?

1 个答案:

答案 0 :(得分:2)

如果您可以将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/, ,$@))