首页 > 解决方案 > CMake:如何使用 *nix 系统上的所有内核构建外部项目?

问题描述

我正在开发一个基于 CMake 的项目,该项目依赖于也使用 CMake 的巨大第三方代码库。我通过 ExternalProject_Add 机制包括第三方项目。该项目默认使用 Makefiles,尽管父项目是 Xcode 项目。

生成的外部项目非常缓慢,因为它只使用一个内核。我不认为我可以强制项目生成 Xcode 项目而不是 Makefile。

假设我坚持使用 Makefile,我如何通知 ExternalProject_Add 使用可用于泰坦尼克号第三方项目的所有内核?

请注意,添加不可避免的“-j N”选项(为什么默认情况下不使用“make”?)需要有条件地出现在 Mac 和 Linux 版本中,而不是 Windows/Visual Studio。

标签: xcodevisual-studiomakefilecmakeexternal-project

解决方案


您基本上已经自己回答了这个问题:使用另一个构建生成器。Ninja做并行构建购买默认和 CMake 使用它就好了。

include(ExternalProject)
ExternalProject_Add(foobar
    [...]
    ## configure options
    # cmake is used by default
    #CONFIGURE_COMMAND cmake
    # cmake will use the same generator as the main project, unless we override it
    CMAKE_GENERATOR Ninja
    ## build options
    BUILD_COMMAND ninja
    [...]
)

如果您不想使用其他生成器,请使用make's 选项。设置MAKEFLAGS在您的外壳中。在你CMakeLists.txt做类似的事情:

include(ProcessorCount)
ProcessorCount(N)

if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin")
    include(ExternalProject)
    ExternalProject_Add(foobar
        BUILD_COMMAND make -j${N}
    )
else()
    ## do windows stuff
endif()

此外,请记住许多ExternalProject_Add()选项(包括*_COMMAND选项)会覆盖合理的默认值。因此,在定义外部项目时,请从小处着手,并根据需要添加选项。

tl;博士

  • 定义外部项目时要保持稀疏。根据需要进行构建。
  • 使用另一个比“make”更了解并行性的构建生成器
  • 如果您想为外部项目使用与主项目不同的 CMake 构建生成器,则必须指定它。

推荐阅读