【问题标题】:CMake: How to build an external project using all cores on *nix systems?CMake:如何使用 *nix 系统上的所有内核构建外部项目?
【发布时间】:2019-03-15 02:57:30
【问题描述】:

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

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

假设我被 Makefile 卡住了,我如何通知 ExternalProject_Add 使用所有可用于大型第三方项目的内核?

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

【问题讨论】:

  • 请注意,我能够有条件地为外部项目生成 Xcode 项目。我怀疑这个项目默认为 Makefiles 的原因可能是因为我必须覆盖 ExternalProject_Add CONFIGURE_COMMAND 以指定主 CMakeLists.txt 所在的子目录(不在 SOURCE_DIR 中)。现在 Xcode 构建速度要快得多。但是我在 Linux 上仍然会遇到同样的问题,所以我需要解决告诉 make 使用多个内核的问题。

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


【解决方案1】:

您自己基本上已经回答了这个问题:使用另一个构建生成器。 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 选项)覆盖 合理的默认值。因此,在定义外部项目时,请从小处着手,并根据需要添加选项。

tl;博士

  • 定义外部项目时要保持稀疏。根据需要进行构建。
  • 使用另一个更了解并行性的构建生成器 '制作'
  • 如果您想为您的 外部项目而不是您的主项目,您必须指定它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2022-07-06
    • 1970-01-01
    相关资源
    最近更新 更多