C++ DistCC和CMake-运行make时在本地和分布式构建之间进行选择

C++ DistCC和CMake-运行make时在本地和分布式构建之间进行选择,c++,gcc,makefile,cmake,distcc,C++,Gcc,Makefile,Cmake,Distcc,我的项目是使用CMake构建的,并使用DistCC+GCC编译 我按如下方式配置编译器: SET(CMAKE_C_COMPILER "distcc variation-of-gcc") 为了构建项目,我只需运行“cmake”然后运行“make-jXX” 虽然distcc确实加快了速度,但有时我希望在不分发的情况下进行构建—我希望它在机器上本地构建 我知道我可以修改DISTCC_主机,使其仅包含本地主机-但这仍然会带来DISTCC网络的开销,尽管这比其他机器的开销要快 我还可以通过再次运行cma

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

我按如下方式配置编译器:

SET(CMAKE_C_COMPILER "distcc variation-of-gcc")
为了构建项目,我只需运行“cmake”然后运行“make-jXX

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

我知道我可以修改DISTCC_主机,使其仅包含本地主机-但这仍然会带来DISTCC网络的开销,尽管这比其他机器的开销要快

我还可以通过再次运行
cmake
并使用自定义标志修改cmake_C_编译器来实现这一点

但我正在寻找一种方法,通过直接在“make”中添加一个标志来实现这一点

I.e.
# This will use distcc:
make -jXX ...
# This will run locally:
make LOCAL_BUILD=1 -jX ...
我可以使用CMake技巧吗?

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

SET(CMAKE_C_COMPILER "my-gcc-script")

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

我们使用以下选项来允许使用make time(而不是CMake time)开关
-Werror
标志

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变量的distcc。像这样:

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

make

我根本不知道cmake,但它是否会将使用
cmake\u C\u编译器选择的编译器粘贴到makefile变量中,并在makefile本身中使用它?或者它会在生成的Makefile中嵌入实际的编译器名称吗?我相信它会在Makefile中的多个位置嵌入固定字符串。因此,覆盖并不简单。我对cmake了解得越多,我就越不喜欢它。您可以编写自己的脚本,并将其用作编译器,让它响应
LOCAL\u BUILD
或任何变量的存在,以选择使用哪个编译器。我认为应该有一个更优雅的解决方案。无论如何,由于我使用CMake实现多个平台和不同的编译器,您能建议如何实现该脚本吗?如果它可以由CMake生成,那就太好了……我认为应该有一个更优雅的解决方案。可能使用shell变量作为编译器cmd的前缀。无论如何,由于我使用CMake实现多个平台和不同的编译器,您能建议如何实现该脚本吗?如果它可以由CMake生成,那就太好了……可能会使用以下形式的脚本:$MYDISTCC$@,然后在运行make之前设置$MYDISTCC变量…
“$MYDISTCC”“$@”
,以确保正确性,但是是的,这是基本思想,如果CMake不强迫您这样做,那就太好了。您可以在那里使用
$CC
,因为这是make通常使用的,我想,像autotools这样的东西也在交叉编译支持中使用。
make USE_DISTCC=distcc
make