【问题标题】:how to organizing a large build using cmake如何使用 cmake 组织大型构建
【发布时间】:2014-05-04 19:29:04
【问题描述】:

我正在处理一个更大的项目,我们正在考虑如何组织大型构建。我认为应该/可以使用 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

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

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

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

谢谢。 托比亚斯

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    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()
    

    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})
    

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

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

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

    【讨论】:

    • 感谢您的回答 - 需要一些时间来检查您的意思。
    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2020-02-20
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2012-04-07
    相关资源
    最近更新 更多