CMake的:由多个项目

问题描述:

我有一个包含几个工具,我用独立的项目,例如目录用于构建库B.我想我有两个选择:CMake的:由多个项目

  1. 我可以安装该工具的系统目录下(如适用于Windows,C:\Program Files)。由于我没有足够的权限写入系统目录,因此我的一些程序打算在与它们相同的目录中使用,这不一定是好事。此外,我仍然需要找到头文件来编译使用这些工具的项目。

  2. 我可以用find_library找到它们。然后我遇到以下问题:find_library(A)将不会工作,直到我实际上建立了A,所以我不能cmake CommonTools(因为工具B需要工具A)。我可以从make调用cmake,但是看起来相当复杂......

  3. 我可以在工具B中放置工具A的相对路径&只对其他项目使用find_library。不幸的是,这种相对路径的变化取决于我是否构建CommonTools或工具B.

您对此有何看法?谢谢!

+0

这些工具是否可以修改所有库,哪些使用CMake自己? – Fraser 2012-07-05 20:27:20

+0

是的,他们是。感谢回复! – Deimos 2012-07-06 06:34:57

+0

驱使我的调查进一步,我现在这样做:在每个add_subdirectory命令后,我通过手动设置* module_FOUND,module_LIBRARIES和module_INCLUDE_DIRS变量来“注册”模块,但这对我来说似乎有点笨拙。在工具B里面,我有如果(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)find_package(Tool_A)...这个想法是,如果我自己构建工具B,我想检查它是否可用并执行svn checkout,如果它不是。 – Deimos 2012-07-06 06:41:01

正如我想能够执行一步构建,这是我最终做的。

  • 我将目前正在构建的模块的子模块与外部依赖关系&第三方工具区分开来。 每个(子)模块只负责构建自己。这意味着所有外部依赖&第三方工具必须已经安装或从服务器以二进制+表头形式提供。作为推论,这意味着缺少的依赖关系是一个二进制文件,应该可以从给定的服务器获得,但不是。
  • 子模块使用add_subdirectory添加,这意味着如果它们中的任何一个不可用,则配置步骤将失败并显示一条明确的消息。
  • 外部依赖关系&第三方工具使用find_package定位。 HINT位置是一个选项,必须由执行构建的用户提供(这表示模块对用户的依赖关系,如果找不到任何一个,则使用ExternalProject_Add从给定位置下载二进制文件。<module>_FOUND<module>_LIBRARIES & <module>_INCLUDE_DIRS变量必须在文件的CMakeLists.txt手动设置,但由于在服务器端(如<module>-<version>-<platform>/include & <module>-<version>-<platform>/binaries)适当的目录布局,可以以一致的方式进行(使用宏如)。再有,如果在服务器上找不到二进制文件,配置步骤将失败,并显示一条明确的消息。

所有这些持续集成服务器将正确检测到任何缺失的依赖关系(即,组件应该在服务器上,但不是在版本控制下的子模块)在配置时而不是在构建时,同时仍然允许一步构建。

我希望这可以用于其他人。 PS:作为Google Test用户的一个附属节点:“对于每个模块,gtest 必须重新编译,因为每个用户都需要使用用于编译已安装的Google Test库的相同编译器标志来编译其测试;否则,可能会遇到未定义的行为,如果您使用不同的编译器标记编译Google Test和您的测试代码,它们可能会看到同一个类/函数/变量的不同定义)。这意味着您实际上需要(在我的情况下)在的每个模块中运行ExternalProject_Add命令,因为每个模块都包含自己的测试。