如何使用 cmake 组织大型构建

Tob*_*ner 5 c++ cmake

我正在处理一个更大的项目,我们正在考虑如何组织大型构建。我认为它应该/可以用 cmake 来完成,但目前我不知道如何满足我们的所有要求。

这是我们的项目组织的样子:

  • 该项目由多个子项目(称为构建模块)组成
  • 每个构建模块可以由创建静态或动态库、可执行文件或测试的多个部分组成
  • 构建模块可能依赖于其他构建模块的公共接口
  • 为了加快构建时间,每个构建模块都应该构建在单独的 CI 服务器上。依赖项不应该每次都构建,而是从一些二进制存储库中获取(我们在这里考虑 nuget,但最简单的解决方案可能是网络共享)

考虑到 cmake,我正在考虑这样的目录结构

- Root directory
    - Build Module 1
        - Build Module 1 Static Lib
        - Build Module 1 Unit Test
        - Build Module 1 Public Interface
    - Build Module 2
    - ...
    - Build Module n
Run Code Online (Sandbox Code Playgroud)

第一个问题:从哪里开始放置 CMakeLists.txt 文件?我会从构建模块级别开始,而不是从 root 开始。这样,如果开发人员只想构建模块 3、4 和 5,他可以创建他的自定义模块。

第二个:如何处理部署/查找包。理想情况下,依赖项的查找机制将允许创建从源构建的构建以及仅从源获取依赖二进制文件的构建。我希望这可以使用 find_package 和 xxxConfig.cmake / FindXXX.cmake 以某种方式完成。有人能告诉我怎么做吗?如何创建这些文件?如何使用 cmake 创建适当的部署?

第三个问题:有人了解我们如何将 nuget 集成到这个过程中吗?这可以作为 cpack 生成器完成吗?已经有了吗?cpack 能否替代 nuget(意味着它可以从某个远程位置获取二进制文件并在构建过程中安装它们)?

谢谢你。托比亚斯

ste*_*ire 3

1) 您可以创建一个顶级 CMakeLists.txt 文件并具有用于构建每个模块的缓存选项:

http://quickgit.kde.org/?p=extra-cmake-modules.git&a=blob&h=6cbafa2d&hb=5f60617c&f=modules%2FECMOptionalAddSubdirectory.cmake

开发人员可以使用这些选项来构建 3、4、5。或者,记录如何添加他们需要的 add_subdirectory() 调用。如果模块也应该独立构建(看起来如此),那么这样做的方法是:

if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
    # Top-level build. Find dependencies.
    find_package(Module1).
else()
    # Built as a subdir together with depenendencies.
    # Dependencies are already in scope.
endif()
Run Code Online (Sandbox Code Playgroud)

2)我为 CMake 3.0 编写了此文档,但其中大部分适用于 2.8:

http://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html

您可能可以将配置文件添加到源中,其中包含类似的内容

add_subdirectory(${CMAKE_CURRENT_LIST_DIR})
Run Code Online (Sandbox Code Playgroud)

使用 find_package 并操作 CMAKE_PREFIX_PATH 来获取“源包”。

3) cmake 没有附带现有的 nuget cpack 生成器。您可能想查看ExternalProject:

http://www.cmake.org/cmake/help/v3.0/module/ExternalProject.html