【问题标题】:DistCC and CMake - select between local and distributed build when running makeDistCC 和 CMake - 运行 make 时在本地和分布式构建之间进行选择
【发布时间】:2014-10-31 23:05:09
【问题描述】:

我的项目是使用 CMake 构建并使用 DistCC + GCC 编译的。

我配置编译器如下:

SET(CMAKE_C_COMPILER "distcc variation-of-gcc")

要构建项目,我只需运行“cmake”,然后运行“ma​​ke -jXX”。

虽然 distcc 确实加快了速度,但我有时想在没有分发的情况下构建 - 我希望它在机器上本地构建。

我知道我可以修改 DISTCC_HOSTS 以仅包含 localhost - 但这仍然具有 distcc 网络的开销,尽管它比其他机器的开销要快...

我也可以通过再次运行 cmake 并使用自定义标志修改 CMAKE_C_COMPILER 来做到这一点。

但我正在寻找一种方法,只需将标志直接添加到“make”即可。

I.e.
# This will use distcc:
make -jXX ...
# This will run locally:
make LOCAL_BUILD=1 -jX ...

我可以使用 CMake 技巧吗?

【问题讨论】:

  • 我根本不知道 cmake,但它会将使用 CMAKE_C_COMPILER 选择的编译器粘贴到 makefile 变量中并在 makefile 本身中使用它吗?或者它是否在生成的 makefile 中嵌入了实际的编译器名称?
  • 我相信它在 Makefile 的多个地方嵌入了固定字符串。所以重写并不简单。
  • 我对 cmake 了解得越多,我就越不喜欢它。您可以编写自己的脚本并将其用作编译器,并让它响应 LOCAL_BUILD 或任何变量的存在来选择要使用的编译器。
  • 我认为应该有一个更优雅的解决方案。无论如何,由于我将 CMake 用于多个平台,使用不同的编译器,你能建议如何实现脚本吗?如果能用CMake生成就好了……

标签: c++ gcc makefile cmake distcc


【解决方案1】:

我们使用以下方法来允许打开和关闭 -Werror 标志的 make 时间(而不是 cmake 时间)。

if(CMAKE_GENERATOR STREQUAL "Unix Makefiles")
    # TODO: this approach for the WERROR only works with makefiles not Ninja
    set(CMAKE_CXX_COMPILE_OBJECT "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> $(WERROR) -o <OBJECT> -c <SOURCE>")
endif()

然后我们运行

make WERROR=-Werror

将警告作为错误打开。

我希望您可以做类似的事情来确定是否使用 distcc 来自 make 变量。像这样:

set(CMAKE_CXX_COMPILE_OBJECT "$(USE_DISTCC) <CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")

然后运行任一

make USE_DISTCC=distcc

或者只是

make

【讨论】:

    【解决方案2】:

    最简单的做法 (IMO) 是在您的项目中编写一个调用编译器的小脚本,然后更改您的 CMake 文件以运行该脚本,而不是直接包含编译器的名称:

    SET(CMAKE_C_COMPILER "my-gcc-script")
    

    现在您可以让该脚本正常运行 distcc,但(基于环境变量或其他)也可以在没有 distcc 的情况下运行。无需更改 CMake 文件中的任何内容。

    【讨论】:

    • 我认为应该有一个更优雅的解决方案。也许使用 shell 变量作为编译器 cmd 的前缀。无论如何,由于我将 CMake 用于多个平台,使用不同的编译器,你能建议如何实现脚本吗?如果能用CMake生成就好了……
    • 可能会使用以下形式的脚本:$MYDISTCC $@,然后在运行 make 之前设置 $MYDISTCC 变量...
    • "$MYDISTCC" "$@" 是正确的,但是是的,这是基本思想,如果 cmake 不强迫你这样做,那就太好了。你可以在那里使用$CC,因为这是 make 通常使用的东西,而且我想像 autotools 之类的东西也在它们的交叉编译支持中使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2022-08-22
    • 2013-10-19
    • 1970-01-01
    • 2014-10-31
    • 2011-01-29
    • 2010-12-06
    相关资源
    最近更新 更多