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_PATH
和CMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY
,但都没有用。
在评估find_package()
时,如何强制cmake排除其自己的分发模块?
作为项目的作者,您可能会发现"遗留">发现脚本(FindXXX.cmake
(不适合您;现代的">config脚本(XXXConfig.cmake
或config-xxx.cmake
(。在这种情况下,您可以将额外的CONFIG
或NO_MODULE
选项传递给find_package
:
find_package(Boost NO_MODULE)
这将阻止CMake搜索FindBoost.cmake
脚本,并强制它搜索BoostConfig.cmake
(或config-boost.cmake
(。
如果使用NO_MODULE
或CONFIG
选项找不到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目标(。