不包括cmake';s自己的带有“find_package”()的分发模块`

不包括cmake';s自己的带有“find_package”()的分发模块`,cmake,cmake-modules,Cmake,Cmake Modules,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>)。我已尝试设置CM

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\u FIND\u ROOT\u PATH
CMAKE\u FIND\u ROOT\u PATH\u MODE\u PACKAGE=ONLY
,但没有效果


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

作为项目的作者,您可能会发现“遗留”查找脚本(
FindXXX.cmake
)不适合您,并且更喜欢使用“现代”配置脚本(
XXXConfig.cmake
config xxx.cmake
)在这种情况下,您可以将附加的
config
无模块
选项传递到
查找包

find_package(Boost NO_MODULE)
这将阻止CMake搜索
FindBoost.CMake
脚本,并强制它搜索
BoostConfig.CMake
(或
config boost.CMake

如果无法使用
NO_MODULE
config
选项找到配置脚本,则即使存在相应的查找脚本,CMake也会报告错误

或者,您可以设置
CMAKE\u FIND\u PACKAGE\u preference\u CONFIG
变量:

set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
所以CMake会首先检查配置脚本。但如果这个脚本丢失,CMake会尝试使用find脚本



作为项目的用户,您可能会发现某些包的配置脚本比find脚本更好……但在这种情况下,最好不要更改任何内容:可能是您正在使用的项目只能使用find脚本,而不能使用config脚本。(例如,项目使用变量,这些变量由查找脚本创建以引用库,但配置脚本通常创建导入的目标).

只需将
CONFIG
NO_MODULE
传递给
find_package
调用即可。这样它就不会搜索
FindXXX.cmake
MODULE.@Tsyvarev哦,太好了!非常感谢,错过了这一点。想要添加一个答案以便我可以接受吗?理想情况下,我不想改变调用find_package()的方式,因为我可能无法访问它(例如,第三方存储库)。你的评论让我找到了
CMAKE\u FIND\u PACKAGE\u preference\u CONFIG
,我很确定这就是我想要的。@Tsyvarev啊,非常有趣,谢谢!你的评论解决了我的挫折,非常感谢!如果你把它们放在答案中,我会标记为接受。嗯,实际上
Boost\u NO\u Boost\u CMAKE
变量有相反的效果:Be如果设置为“开”,则会阻止cmake附带的
FindBoost.cmake
script搜索配置脚本(
boost config.cmake
)。我已经删除了之前的注释,因为它是错误的。谢谢;关于用户为什么不想这样做,这是非常有趣的一点。请注意,我的答案是关于在“查找”之间进行选择(
FindXXX.cmake
)和配置(
XXXConfig.cmake
)脚本。或者,更准确地说,关于在
find_package
的模块和配置模式之间进行选择。我的答案不是关于在包的多个安装之间进行选择。作为需要某些包的项目的用户,您可能希望CMake查找此包的特定安装,而不是“默认”(系统)CMake提供了定义良好的机制来表达您的偏好。但这些机制是另一回事。