我的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
的位置。
这一切都可能吗?
答案 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_package
或find_dependency
中指定查找模块的位置(仅适用于配置模式)。