【问题标题】:Installing a CMake library: also ship find modules for the dependencies?安装 CMake 库:还为依赖项提供查找模块?
【发布时间】:2017-12-08 18:39:52
【问题描述】:

我的 CMake 库 MyLibrary 具有对 OtherLibrary 的依赖项,我使用 非标准 FindOtherLibrary.cmake 导入。

我的库依赖于 OtherLibrary 公开:

target_link_libraries(MyLibrary PUBLIC OtherLibrary::OtherLibrary)

当我安装MyLibrary(连同MyLibraryConfig.cmake),并且用户想要链接它时,他们需要导入OtherLibrary

是否有关于如何将FindOtherLibrary.cmakeMyLibrary 一起分发的良好做法?


理想情况下,如果 OtherLibrary 包含类似的内容,则可以通过从已安装的配置文件 MyLibraryConfig.cmake 中自动导入 OtherLibrary 来使 MyLibrary 的用户更轻松

include(CMakeFindDependencyMacro)
find_dependency(OtherLibrary)

并且知道FindOtherLibrary.cmake 在哪里。

这可能吗?

【问题讨论】:

  • 不明白你的问题。 When I install 'MyLibrary' (together with 'MyLibraryConfig.cmake') - 在这种情况下,您的配置文件已经包含指向您和其他库的路径以及它们之间的适当关系。所以当用户链接MyLibrary目标时,它会自动链接OtherLibrary。不需要FindOtherLibrary.cmake 脚本。
  • @Tsyvarev 你是对的,只要OtherLibrary 的路径是硬编码的。但是,如果FindOtherLibrary.cmake 定义了我更喜欢的导入目标,MyLibrary 的用户也必须能够“自行”找到OtherLibrary
  • 如果您不想要硬编码路径,您应该提供FindMyLibrary.cmake 脚本而不是MyLibraryConfig.cmake。为了与您的图书馆合作,用户需要使用该脚本发送他(她)的项目,...以及您在文档中描述的所有其他脚本(并相应地调整 CMAKE_MODULE_PATH)。所以你可以提供FindOtherLibrary.cmakeFindMyLibrary.cmake
  • @Tsyvarev 在这种情况下,我有不同的看法:它会打败整个观点!在我看来,MyLibraryConfig.cmake 优于 FindMyLibrary.cmake,因为它能够按照您编译交付的MyLibrary 的方式设置所有依赖项,而在FindMyLIbrary.cmake 中则需要手动指定。理想情况下,OtherLibrary 的开发人员也会提供OtherLibraryConfig.cmake,但事实并非如此,因此我的 SO 问题。

标签: cmake


【解决方案1】:

我最终找到了问题的解决方案。

原则上,它执行@utopia 建议的操作,但以自动化方式:我图书馆的最终用户不需要设置(甚至知道)FindOtherLibrary.cmake。会被MyLibraryConfig.cmake自动导入。

为此,我将FindOtherLibrary.cmakeMyLibraryConfig.cmake 一起安装:

install(FILES
          /path/to/MyLibraryConfig.cmake
        DESTINATION
          lib/cmake/MyLibrary
        )
install(FILES
          /path/to/FindOtherLibrary.cmake
        DESTINATION
          lib/cmake/MyLibrary/Modules
        )

MyLibraryConfig.cmake我设置了如何导入它:

include(CMakeFindDependencyMacro)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_LIST_DIR}/Modules/")
find_dependency(OtherLibrary REQUIRED)

请注意,我设置了变量CMAKE_MODULE_PATH,因为无法在find_packagefind_dependency 中指定查找模块的位置(仅适用于配置模式)。

【讨论】:

  • 您是如何将这些行(find_dependency 等)添加到配置文件中的?你是手动添加的吗?有没有办法从 CMakeLists 添加它?
  • 我手动添加的。据我所知,没有办法自动完成。
【解决方案2】:

不支持模块模式find_package() 的“传递”行为。

事实上,我认为这是不可能的,因为它需要使用您无法获得的信息来修改下游 CMake 模块路径。这就是存在配置模式find_package() 的原因之一(请参阅here)。

需要明确的是,依赖于 FindModule 库的库的用户别无选择,只能知道如何获取 FindModule 脚本的副本并将其添加到他们的 CMake 模块路径中。这通常通过文档完成。作为使用 FindModule 的库的作者,您不能以任何一般方式为最终用户快捷方式。所以,这样的过程没有“好的做法”。

否则,好的做法是仅将 FindModules 用于非 CMake 项目,并将 Config.cmake 用于 CMake 项目。如果依赖的 CMake 库没有 Config.cmake,那么您就不走运了(在错误/问题报告中告诉他们他们需要它来支持 CMake)。

【讨论】:

    猜你喜欢
    • 2018-12-07
    • 2015-02-12
    • 2016-09-16
    • 2013-08-26
    • 2019-12-03
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多