安装CMake库:还为依赖项发送模块?

时间:2017-07-05 08:05:44

标签: cmake

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

我的图书馆公开取决于OtherLibrary

target_link_libraries(MyLibrary PUBLIC OtherLibrary::OtherLibrary)

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

关于如何在FindOtherLibrary.cmake上分发MyLibrary是否有良好做法?

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

的内容
include(CMakeFindDependencyMacro)
find_dependency(OtherLibrary)

并知道FindOtherLibrary.cmake的位置。

这一切都可能吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

否则,良好的做法是仅将FindModules用于非CMake项目,并将Config.cmake用于CMake项目。如果一个依赖的CMake库没有Config.cmake,那么你运气不好(告诉他们需要它来支持Bug / Bug报告中的CMake)。

答案 1 :(得分:1)

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

原则上,它执行@utopia建议的内容,但是以自动方式执行:我的库的最终用户不需要设置(甚至不知道)FindOtherLibrary.cmake。它将由MyLibraryConfig.cmake自动导入。

为此,我在FindOtherLibrary.cmake安装MyLibraryConfig.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中指定查找模块的位置(仅适用于配置模式)。