2009-09-30 95 views
2

(免责声明:我习惯了scons的......我用make有些雏)化妆:化妆分层文件

语境:我使用的Eclipse CDT产生的makefile。

比方说,我有一个项目目录'lib'和2个构建配置'调试'和'发布'。 Eclipse CDT正常地为每个构建配置生成一个makefile。所述makefile最终驻留在“Debug”和“Release”文件夹中。

现在,我想要做的是在文件夹'lib'中生成一个makefile,其中调用 makefiles的Debug/makefile和Release/makefile。

我该怎么做?

我希望能够在文件夹'lib'中启动'make',并且这两个配置都将与指定的目标一起被调用。

解决方案 此基础上的巨大投入聚集在这里,我设计了以下内容:

MAKE=make 
BUILDS=Release Debug 
TARGETS=all clean 

$(TARGETS): 
    @for b in $(BUILDS) ; do $(MAKE) -C $$b [email protected] ; done 

$(BUILDS): 
    @for t in $(TARGETS) ; do $(MAKE) -C [email protected] $$t ; done 

%: 
    @for b in $(BUILDS) ; do $(MAKE) -C $$b [email protected] ; done 
+0

@hacker:谢谢! – jldupont 2009-09-30 15:44:31

+0

呃......再看看你的BUILDS规则。如果你“发布”,它将使所有(在发布),然后使得清洁(在发布中)。我建议$(BUILDS):
$(MAKE)-C $ @ – Beta 2009-09-30 16:22:15

+0

Beta,当然它不应该是有意义的,它是一组示例;-) – 2009-09-30 16:31:10

回答

3

取决于什么是“通话”。你想要么

include $(BUILD)/Makefile

$(MAKE) -C $(BUILD) [email protected]

或一些这样的。我猜你想要后者。也许像

release debug: 
    $(MAKE) -C [email protected] 

你明白了。

更多的例子:

BUILDS=release debug 
TARGETS=all clean 

$(TARGETS): 
    for b in $(BUILDS) ; do $(MAKE) -C $$b [email protected] ; done 

$(BUILDS): 
    for t in $(TARGETS) ; do $(MAKE) -C [email protected] $$t ; done 
+0

$(BUILD)变量代表什么?使它自己*或*我想要指定它吗? – jldupont 2009-09-30 14:15:10

+0

这是给你一个想法。就像如果你有'BUILD = debug'一样,它将会被编译(无论目标是什么)到'$(BUILD)' - 'debug'目录中。您的最终生成文件取决于您,不管怎样;-) – 2009-09-30 14:16:44

+0

但是我不想在这个“顶级”makefile中指定所有支持的目标:我想将目标从命令行传递到* sub * makefiles ...我如何实现这一目标? – jldupont 2009-09-30 14:19:52

1
all: release debug 

release: 
    $(MAKE) -C ../Release 

debug: 
    $(MAKE) -C ../Debug 

我假设他们都在同一水平上。路径必须来自您致电Make的地方。

+0

小修正:makefile位于* lib/Debug *和* lib/Release *中,所以它应该是** make -C Debug **和** make -C Release **。 工作正常!谢谢! – jldupont 2009-09-30 14:08:15

+0

但是,为每个指定目标呢?我不想只限于'调试'和'发布'。我不需要一个* $ @ *的地方? – jldupont 2009-09-30 14:10:36

+0

Beta的答案涵盖了很好的:) – 2009-09-30 14:19:57

-2

拥有不同的目标来调用两个目录中的makefile。

all: debug product 

debug: 
     $(MAKE) -f debug/Makefile 

product: 
     $(MAKE) -f product/Makefile 
+0

不考虑* sub * makefiles中包含的相对路径层次结构。 – jldupont 2009-09-30 14:28:19

+0

当然,这是一个示例,向您展示如何构建顶层makefile。您没有提供您的子生成文件,因此无法知道它们包含相对路径。 我工作的项目不依赖子构建文件中的相对路径,但将其他参数传递给子构建文件以标识构建位置。 – JZeeb 2009-09-30 14:56:41

2

既然你提到 “指定目标(S)”,我建议:

 
%: 
    $(MAKE) -C Debug [email protected] 
    $(MAKE) -C Release [email protected] 

如果真是太一般了,你可以用$(目标),其中定位替换%是你定义一个你想要做的事情的清单。

+0

尝试了这一点,但它不能使用默认命令launch * make *:它抱怨目标** all **没有被指定;-( – jldupont 2009-09-30 14:27:20

+0

@ Jean-Lou Dupont:你只需要添加'all:debug释放“到由Beta提供的makefile的开头。 – 2009-09-30 15:14:20