Build process make:分层生成文件

Build process make:分层生成文件,build-process,makefile,Build Process,Makefile,(免责声明:我习惯于嘲笑……我对make有点缺乏经验) 上下文:我正在使用EclipseCDT生成生成生成文件 假设我有一个项目目录'lib'和两个构建配置'Debug'和'Release'。EclipseCDT为每个构建配置优雅地生成一个makefile。上述生成文件最终驻留在“调试”和“发布”文件夹中 现在,我要做的是在文件夹“lib”中有一个makefile,它调用makefile“Debug/makefile”和“Release/makefile” 我该怎么做 我希望能够在文件夹“lib

(免责声明:我习惯于嘲笑……我对make有点缺乏经验)

上下文:我正在使用EclipseCDT生成生成生成文件

假设我有一个项目目录'lib'和两个构建配置'Debug'和'Release'。EclipseCDT为每个构建配置优雅地生成一个makefile。上述生成文件最终驻留在“调试”和“发布”文件夹中

现在,我要做的是在文件夹“lib”中有一个makefile,它调用makefile“Debug/makefile”和“Release/makefile”

我该怎么做

我希望能够在文件夹“lib”中启动“make”,并使用指定的目标调用这两种配置

解决方案 根据这里收集到的大量信息,我设计了以下内容:

MAKE=make
BUILDS=Release Debug
TARGETS=all clean

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

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

%:
    @for b in $(BUILDS) ; do $(MAKE) -C $$b $@ ; done
取决于什么是“呼叫”。你想不想

include$(BUILD)/Makefile

$(MAKE)-C$(BUILD)$@

或者类似的。我猜你想要后者。也许像

release debug:
    $(MAKE) -C $@
你明白了

更多示例:

BUILDS=release debug
TARGETS=all clean

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

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

我假设他们都在同一水平上。路径必须来自调用Make的位置。

在两个目录中有不同的调用makefile的目标

all: debug product

debug:
        $(MAKE) -f debug/Makefile

product:
        $(MAKE) -f product/Makefile
由于您提到“指定目标”,我建议:

%: $(MAKE) -C Debug $@ $(MAKE) -C Release $@ %: $(MAKE)-C调试$@ $(MAKE)-C发布$@
如果这太笼统,您可以将%替换为$(TARGETS),其中TARGETS是您定义的,一个列表,列出了您希望使用的所有内容。

次要更正:makefile位于lib/Debug和lib/Release中,因此它应该是make-C Debug和make-C Release。很好!谢谢但是,如何为每一个目标指定目标呢?我不想局限于“调试”和“发布”。我不需要某处有一个$@吗?Beta的答案很好地涵盖了这一点:)$(构建)变量代表什么?这是一个上下文,使自己还是我期望指定它?它是给你一个想法。例如,如果您有
BUILD=debug
,它将构建(无论目标是什么)到
$(BUILD)
-
debug
目录中。无论如何,您的最终生成文件取决于您;-)但我不想在这个“顶级”makefile中指定所有支持的目标:我想将目标从命令行传递到子makefile。。。我如何做到这一点?似乎有一个%的目标证明有助于解决我的问题。。。问题是隐式目标all(仅在不带参数的情况下调用make)没有得到处理。。。我该如何解决这个问题?是的,可以使用通配符目标。您可以尝试在makefile的最开始添加
default:all
target。我认为这应该是一个技巧。尝试了这个方法,但它与默认命令launch make不起作用:它抱怨没有指定目标all-(@Jean-Lou Dupont:您只需将
all:debug release
添加到Beta提供的makefile的开头。它不考虑子makefile中包含的相对路径层次结构。当然,这是一个演示如何构造顶级makefile的示例。您没有提供子makefile,因此无法知道它们包含相对路径。我所处理的项目不依赖于子makefiles中的相对路径,而是将其他参数向下传递到子makefiles以标识生成位置。嗯……再看看您的生成规则。如果您“发布”,它将使所有(在发布中),然后使干净(在发布中)。我建议$(构建):
$(MAKE)-C$@Beta,当然它不应该是有意义的,这是一组示例;-)@hacker,你是我的Perl教科书的作者,不是吗?不是吗!?! %: $(MAKE) -C Debug $@ $(MAKE) -C Release $@