在 CMake 配置文件中查找次要依赖项

Find secondary dependencies in CMake config files

遵循现代 CMake 指南(例如,参见 https://www.slideshare.net/DanielPfeifer1/effective-cmake,特别是幻灯片 46),我正在尝试为我的 Pkg.

编写一个 PkgConfig.cmake 文件

Pkg 取决于 Foo,后者又取决于 BarFooBar 都没有配置文件 - 我正在使用 FindFoo.cmakeFindBar.cmake 来查找它们。

我的 PkgConfig.cmake 文件看起来像这样

set(Pkg_LIBRARIES Pkg::Pkg)

include(CMakeFindDependencyMacro)

find_dependency(Foo)  # Use FindFoo.cmake find and import as target Foo::Foo
                      # Foo depends on Bar which is similarly imported using
                      # FindBar.cmake as target Bar::Bar

include("${CMAKE_CURRENT_LIST_DIR}/PkgTargets.cmake")

我的结果 PkgTargets.cmake 看起来像

add_library(Pkg::Pkg STATIC IMPORTED_
set_target_properties(Pkg::Pkg PROPERTIES
  INTERFACE_LINK_LIBRARIES "Foo::Foo")

# Load information for each installed configuration
.
.
.

我的问题是如何避免其他包将 Pkg 导入到他们的项目中而不必指定 Foo 的位置,更重要的是 Bar 的位置找到了吗?

如果必须通过变量 Foo_ROOT 和 [=29= 再次指定 FooBar 包的位置,是否会破坏构建传递依赖关系的目的] 或 CMAKE_PREFIX_PATH

我的 Pkg 已经知道它是在哪里找到的,所以我是否应该 parse/set Foo_ROOTBar_ROOT 并将其放入我的 PkgConfig.cmake 文件中?

My question is how can I avoid other packages importing Pkg into their project from having to specify where Foo and more importantly where Bar is to be found?

完全允许 ​​PkgConfig.cmake 指定(提示)其依赖项的位置。

My Pkg already knows where it was found, so should I parse/set Foo_ROOT and Bar_ROOT and put it into my PkgConfig.cmake file?

请注意,XXXConfig.cmake 文件通常是为安装的项目准备的 移动 构建机器上的其他目录 或者,更重要的是,被 复制 其他机器 并在那里使用。

因为 FooBar 其他机器上的 位置 可能不同 来自 构建机器 上的一个,知道它们在构建机器上的位置无助于在目标机器上找到它们。

不过,由您(作为项目的开发人员)指定项目的使用限制。例如,您可以指定该项目只能在构建它的那台机器上使用。在那种情况下,在 PkgConfig.cmake 脚本中重用 FooBar 的构建位置是合理的。

此外,即使允许将已安装的项目复制到其他机器上,您仍然可以使用 FooBar 的构建位置作为 提示PkgConfig.cmake 中搜索它们。因此,如果项目将在构建它的 同一台机器 上使用,则无需用户干预即可找到依赖项。如果项目将被复制到 other machine,它有 FooBar 在与 build 相同的位置机器.