【问题标题】:make: hierarchical make filemake:分层make文件
【发布时间】:2010-12-02 15:54:54
【问题描述】:

(免责声明:我习惯了scons ...我对make有点缺乏经验)

上下文:我正在使用生成 makefile 的 Eclipse CDT。

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

现在,我想做的是在文件夹“lib”中创建一个生成文件,调用生成文件“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

【问题讨论】:

  • 嗯...再看看你的 BUILDS 规则。如果您“发布”,它将全部(在发布中),然后清理(在发布中)。我建议 $(BUILDS):
    $(MAKE) -C $@
  • Beta,当然它不应该有意义,它是一组示例;-)
  • @hacker,你是写我的 Perl 教科书的人,不是吗?你不是吗!?!

标签: build-process makefile


【解决方案1】:

取决于什么是“调用”。你想要么

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

【讨论】:

  • $(BUILD) 变量代表什么?使自己是上下文相关的,我应该指定它吗?
  • 这是给你一个想法。就像你有 BUILD=debug 一样,它将构建(无论目标是什么)到 $(BUILD) - debug 目录中。无论如何,您的最终生成文件取决于您;-)
  • 但我不想在这个“顶级”makefile 中指定所有支持的目标:我想将目标从命令行传递到 sub i> makefiles...我该如何实现?
  • 似乎有一个 % 目标有助于解决我的问题...问题是隐式目标 all (当只是调用 make 没有参数)没有得到处理......我该如何解决这个问题?
  • 是的,您可以使用通配符目标。您可以尝试在 makefile 的最开始添加 default: all 目标。我认为这应该是诀窍。
【解决方案2】:
all: release debug

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

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

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

【讨论】:

  • 小修正:makefile 位于 lib/Debuglib/Release 中,所以应该是 make -C Debugmake -C Release。工作正常!谢谢!
  • 但是为每个指定目标呢?我不想局限于“调试”和“发布”。我不需要一个 $@ 吗??
  • Beta 的答案很好地涵盖了这一点:)
【解决方案3】:

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

all: debug product

debug:
        $(MAKE) -f debug/Makefile

product:
        $(MAKE) -f product/Makefile

【讨论】:

  • 不考虑 sub 生成文件中包含的相对路径层次结构。
  • 当然,这是一个向您展示如何构建顶级 makefile 的示例。您没有提供您的子 makefile,因此不可能知道它们包含相对路径。我从事的项目不依赖于子 makefile 中的相对路径,而是将其他参数向下传递给子 makefile 以识别构建位置。
【解决方案4】:

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

%: $(MAKE) -C 调试 $@ $(MAKE) -C 释放 $@

如果这太笼统了,您可以将 % 替换为 $(TARGETS),其中 TARGETS 是您定义的内容,是您想要使用的所有内容的列表。

【讨论】:

  • 试过了,但它不适用于默认命令启动 make :它抱怨没有指定目标 all ;-(
  • @Jean-Lou Dupont:您只需将all: debug release 添加到Beta 提供的makefile 的开头即可。
猜你喜欢
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 2023-03-06
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多