CMake:构建多个项目使用的库

时间:2012-07-05 14:45:26

标签: cmake

我有一个目录,其中包含我用于独立项目的几个工具,例如:

CommonTools
  + Tool A
  + Tool B
  + Tool C

工具B依赖于工具A,但工具A可以独立于工具B使用。我认为我有两个选择:

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

  2. 我可以使用find_library找到它们。然后我遇到了以下问题:find_library(A)在我实际构建A之前无法工作,所以我不能cmake CommonTools(因为工具B需要工具A)。我可以从make调用cmake,但这看起来很复杂......

  3. 我可以将相对路径放到工具B和工具A中的工具A.仅对其他项目使用find_library。不幸的是,这个相对路径会根据我是构建CommonTools还是工具B而改变。

  4. 您对此有何看法?谢谢!

1 个答案:

答案 0 :(得分:1)

由于我希望能够执行一步式构建,这就是我最终要做的事情。

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

所有这一切都意味着持续集成服务器将在配置时而不是在构建时正确地检测任何缺少的依赖项(即应该在服务器上但不是版本控制的子模块或不受版本控制的子模块),而仍然允许一步建立。

我希望这对其他人有用。

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