Matched Pattern作为Makefile依赖项中的函数的参数

时间:2014-01-22 14:23:43

标签: c++ regex makefile gnu-make

假设文件结构如下:

a/a1.cpp
a/a2.cpp
b/b1.cpp
b/b2.cpp
Makefile

我的目标是构建两个目标文件a.o和b.o,其中a.o依赖于a1.cpp和a2.cpp而b.o依赖于b1.cpp和b2.cpp。但是,事实证明我无法在Makefile中进行epxress。这是我试过的:

SOURCES := a/a1.cpp a/a2.cpp b/b1.cpp b/b2.cpp
TARGETS := a.o b.o
RELEVANT = $(filter $(1)/%.cpp,$(SOURCES))
$(TARGETS): %.o: $(call RELEVANT,%)
    @echo $^

我原本预计在使用调用函数时,%会被a或b替换,而RELEVANT会返回所需的依赖项。但是,$ ^只返回一个空字符串,表明过滤器函数显然没有按预期工作。 基本上,这个问题似乎是由模式匹配规则之前评估的函数引起的,如下所述:Makefile, Regex and multiple dependencies。不过,我无法将解决方案转移到我的案例中。此外,它看起来有点hackish,我希望有一个更清晰的解决方案,不需要bash功能。

有人能够为这个问题找到解决方案吗?

2 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。如果您真的想使用先决条件列表中的函数来执行此操作,则可以使用辅助扩展:

.SECONDEXPANSION:

$(TARGETS): %.o: $$(call RELEVANT,%)
        @echo $^

我不太确定你是如何将多个.cpp文件编译成单个目标文件的。

答案 1 :(得分:0)

这是另一个:

all : ${TARGETS}

define RULE
${1}.o: $(2)
        echo "$$(1) : $$@ :  $$^"
endef

$(foreach tgt, $(TARGETS), $(eval $(call RULE, $(basename $(tgt)), $(filter $(basename $(tgt))/%.cpp, $(SOURCES)) )))