我正在开发一个更大的项目,我们正在考虑如何组织大型构建.我认为应该/可以用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文件?我将从Build Module级别开始,而不是从root开始.这样,如果开发人员想要仅构建模块3,4和5,则可以创建他的自定义.
第二个:如何处理部署/查找包.理想情况下,依赖项的查找机制将允许创建从源构建的构建以及从源中仅获取依赖二进制文件的构建.我希望可以使用find_package和xxxConfig.cmake / FindXXX.cmake以某种方式完成此操作.谁能告诉我怎么样?如何创建这些文件?如何使用cmake创建适当的部署?
第三个问题:有人提供一些关于我们如何将nuget整合到这个过程中的信息吗?这可以作为cpack生成器完成吗?已经有一个吗? cpack可以替代nuget(意味着它可以从某个远程位置获取二进制文件并在构建过程中安装它们)吗?
谢谢.
托比亚斯
最佳答案 1)您可以创建顶级CMakeLists.txt文件,并具有用于构建每个模块的缓存选项:
开发人员可以使用这些选项来构建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