不包括cmake';s自己的带有“find_package”()的分发模块`
Cmake包括各种分发模块(即,在Cmake安装的不包括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
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提供了定义良好的机制来表达您的偏好。但这些机制是另一回事。