【问题标题】:Find secondary dependencies in CMake config files在 CMake 配置文件中查找辅助依赖项
【发布时间】:2020-01-30 05:06:28
【问题描述】:

按照现代 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_ROOTBar_ROOTCMAKE_PREFIX_PATH 再次指定FooBar 包的位置,这是否会破坏构建传递依赖关系的目的?

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

【问题讨论】:

    标签: cmake configuration cmake-modules


    【解决方案1】:

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

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

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

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

    因为 另一台机器上的FooBar位置 可能与构建机器上的位置不同 /em>,知道它们在构建机器上的位置无助于在目标机器上找到它们。

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

    此外,即使允许将已安装的项目复制到其他机器,您仍然可以使用FooBar 的构建位置作为提示,以便在PkgConfig.cmake 中搜索它们。因此,如果项目将在构建它的同一台机器上使用,那么将在没有用户干预的情况下找到依赖关系。如果项目将被复制到 其他机器,这也是同样的情况,该机器在与 构建机器相同的位置上具有 FooBar

    【讨论】:

    • 我从来没有将配置文件复制到另一台机器并使用它的用例。即使我这样做了,它也可能无法正常工作,因为它包含的 Targets 文件可能已经硬编码了 CMake 自动生成的包含和链接目录位置。所以,根据你的建议,提示在哪里可以找到包应该可以正常工作
    • “它包含的 Targets 文件可能已经硬编码了 CMake 自动生成的包含和链接目录位置。” - 如果您正确设置导出目标的包含目录,则 CMake 不会在配置文件中为它们生成绝对路径。
    • 我在配置文件中没有我的项目包含和库的硬编码路径;但是依赖库位置是硬路径,我不知道如何防止 CMake 将它们放入
    • "但依赖库位置是硬路径" - 确保此类依赖项位于 IMPORTED 目标之后(即,允许 IMPORTED 目标的属性是安装前缀之外的路径)。 CMake 不会将 IMPORTED 目标“导出”到自动生成的导出文件中。相反,它允许配置文件手动创建这些目标并填充它们的属性。
    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2013-04-30
    • 2018-12-04
    • 1970-01-01
    相关资源
    最近更新 更多