2014-10-01 73 views
1

在我的项目的所有.cpp文件都存储在Makefile文件 - 替换通配符

Classes/ 
Classes/Something/ 
Classes/Something/Else 
... 

我想编译所有.cpp文件separetly到bin /目录下,替换/与_,使:

Classes/First.cpp -> Bin/Classes_First.o 
Classes/Foo/Bar.cpp -> Bin/Classes_Foo_Bar.o 

现在我想为编译创建规则:

Bin/%.o: $(subst _,/,%.cpp) 
    $(COMPILER)g++ $(COMPILE_FLAGS) -c -o [email protected] $^ 

我想:

make bin/Classes_Test.o

但编译失败。

因此,我创建调试模式:

%.cpp: 
    @echo CPP: [email protected] 

现在印刷:

CPP: Classes_Test.cpp 

为什么?

所以我改变了我的模式:

Bin/%.o: $(subst _,/,Test1_Test2.cpp) 

,我看到:

CPP: Test1/Test2.cpp 

我有点困惑,为什么SUBST如果我使用通配符作为源不工作...

回答

0

这是一个评估订单问题。

当make解析makefile时,它会评估$(subst)调用,但此时$(subst)的参数是文字字符串%.cpp,它没有任何东西可以替代,所以什么也不做。

在目标评估/执行时间,目标模式中的%和prereq模式已填写,但$(subst)早已消失。

要做到这一点,您需要手动(以某种方式)将输出文件映射到输入文件。你可以做到这一点,并保持%.o模式的规则目标为实际的配方运行虽然(所以你只需要生成一堆Bin/Test1_Test2.o: Test1/Test2.cpp行)。

另外,我相信你能可能能够使用secondary expansion做到这一点:

.SECONDEXPANSION: 
Bin/%.o: $$(subst _,/,%.cpp)