排除 cmake 自己的带有 'find_package()' 的分发模块



Cmake包括各种分发模块(即,填充在Cmake安装的Modules/目录中;例如,/usr/share/cmake-3.5/Modules/FindBoost.cmake(。

这在开发包含名称与这些分发模块冲突的内部库的代码时带来了挑战,因为find_package(Xyz)找到的是分发模块(/usr/share/cmake-3.5/Modules/FindXyz.cmake(而不是用户模块(/home/user/opt/lib/cmake/Xyz-config.cmake(。我试过设置CMAKE_FIND_ROOT_PATHCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY,但都没有用。

在评估find_package()时,如何强制cmake排除其自己的分发模块?

作为项目的作者,您可能会发现"遗留">发现脚本(FindXXX.cmake(不适合您;现代的">config脚本(XXXConfig.cmakeconfig-xxx.cmake(。在这种情况下,您可以将额外的CONFIGNO_MODULE选项传递给find_package:

find_package(Boost NO_MODULE)

这将阻止CMake搜索FindBoost.cmake脚本,并强制它搜索BoostConfig.cmake(或config-boost.cmake(。

如果使用NO_MODULECONFIG选项找不到config脚本,则即使存在相应的find剧本,CMake也会报告错误。

或者,您可以设置CMAKE_FIND_PACKAGE_PREFER_CONFIG变量:

set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)

因此CMake将首先检查config脚本。但如果缺少此脚本,则CMake将尝试使用find脚本。


作为项目的用户,您可能会发现某些包的config脚本比find更好。。。但在这种情况下,最好不做任何更改:可能是您正在使用的项目只能使用find脚本,而不能使用config。(例如,项目使用变量,这些变量由find脚本创建以引用库,但config剧本通常会创建IMPORTED目标(。

相关内容

最新更新