2

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

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 的相对路径,并且仅find_library用于其他项目。不幸的是,这个相对路径的变化取决于我是在构建 CommonTools 还是 Tool B。

您对此有何看法?谢谢!

4

1 回答 1

1

因为我希望能够执行一步构建,所以这就是我最终要做的。

  • 我将当前正在构建的模块的子模块与外部依赖项和第三方工具区分开来。每个(子)模块只负责构建自己。这意味着所有外部依赖项和第三方工具必须已经安装或从服务器以二进制 + 标头形式提供。作为推论,这意味着缺少的依赖项是一个二进制文件,它应该从给定的服务器上可用,但不是。
  • 使用 添加子模块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中运行一个命令,因为每个模块都包含自己的测试。

于 2012-07-09T07:34:43.447 回答