2013-03-01 107 views
4

我有一套我想编译的.cpp文件。这些.cpp文件位于分层目录结构中。我希望相应的.o文件都以一个构建文件夹结束。Makefile动态规则w /没有GNU-make模式

这里是我如何获得GNU使枚举文件...

SRCS = \ 
    $(wildcard $(CODE)/**/*.cpp) \ 
    $(wildcard $(CODE)/AlgebraLibraries/**/*.cpp) \ 
    $(wildcard $(CODE)/Calculator/Environments/**/*.cpp) 

BARE_SRCS = $(notdir $(SRCS)) 
BARE_OBJS = $(BARE_SRCS:.cpp=.o) 
OBJS = $(addprefix $(BUILD)/, $(BARE_OBJS)) 

这样做之后,我不知道如何创建,将创建从.cpp文件.o文件的规则。直觉上,我想要做的是以下伪代码。

for i=0, N do # <-- a for-loop! 
    $(OBJS)[i]: $(SRCS)[i] # <-- the rule! 
    $(CPP) -c $(SRCS)[i] -o $(OBJS)[i] # <-- the recipe 
end 

当然,这不是有效的GNU使代码,但我希望你明白它是什么在这里,我想要做的事。以下将无法使用。

%.o: %.cpp 
    $(CPP) -c $< -o [email protected] 

这不起作用,因为GNU make会匹配%符号,假设.o文件位于.cpp文件的旁边。

我所知道的所有这些方法的替代方法都是可行的,但是会非常单调乏味,它将所有规则列举为明确的规则。这是迟缓的!一定有更好的方法。

我一直在研究GNU make生成规则的能力,但似乎没有办法没有内置逻辑来做。如果我能利用一些流程控制语句来生成我想要制定的规则,那将是非常好的。这是否要求太多的GNU-make?

无论如何,有没有办法做到我正在试图用GNU make做什么?如果是这样,怎么样?

谢谢你的帮助!

回答

11

这看起来像......多项先进让诡计工作:

all: $(OBJS) 

define ruletemp 
$(patsubst %.cpp, $(BUILD)/%.o, $(notdir $(1))): $(1) 
    $$(CPP) -c $$< -o [email protected] 
endef 

$(foreach src,$(SRCS),$(eval $(call ruletemp, $(src)))) 
+0

会不会gcc的抱怨,如果它是试图为'dir1/dir2/file.c'创建'$(BUILD)/ dir1/dir2/file.o',因为目录结构'$(BUILD)/ dir1/dir2'不存在? – Tuxdude 2013-03-02 02:42:57

+1

谢谢,谢谢! (http://www.gnu.org/software/make/manual/make.html#Eval-Function) - 我将阅读更多关于这个,看看我是否可以使用它。我认为这就是我正在寻找的...一种抽象make-file语法的方法。顺便说一句,即使我不应该尝试去做我在我的情况下所做的事情,但我确信在其他情况下,我试图做的事至少是合法的。我也开始考虑果酱,但我不喜欢没有人支持它的事实。 – user2125275 2013-03-02 05:51:34

+0

这工作,顺便说一句。再次感谢!我的makefile看起来相当隐秘,但它至少可以作为一些可以在make中完成的东西的例子。 – user2125275 2013-03-02 06:51:40