CMake:如何使用* nix系统上的所有内核来构建外部项目?

时间:2019-03-15 02:57:30

标签: xcode visual-studio makefile cmake external-project

我正在研究一个基于CMake的项目,该项目依赖于也使用CMake的庞大的第三方代码库。我通过ExternalProject_Add机制包括了第三方项目。该项目默认情况下使用Makefile,尽管父项目是Xcode项目。

外部项目生成的结果非常慢,因为它仅使用单个内核。我认为我不能强迫项目生成Xcode项目而不是Makefile。

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

请注意,Mac和Linux构建必须有条件地添加不可避免的'-j N'选项(为什么默认情况下'make'不这样做?),但Windows / Visual Studio没有。 / p>

1 个答案:

答案 0 :(得分:0)

您基本上已经回答了自己的问题:使用另一个构建生成器。 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的选项。在您的shell中设置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选项) override 明智的默认设置。因此,在定义外部项目时,请从小处开始并根据需要添加选项。

tl; dr

  • 定义外部项目时要稀疏。根据需要进行构建。
  • 使用另一个比并行理解更好的构建生成器 'make'
  • 如果要为您使用其他CMake构建生成器 外部项目,而不是主项目,您必须 指定它。