CMake find_package 不处理多配置

Sta*_*ine 5 c++ cmake jenkins multi-configuration

我们使用 Jenkins 2.60.2 和 CMake 3.9.1 来自动化我们的构建系统。这对于多个版本的构建工具、架构和调试/发布目标都适用(如果所有配置都已构建并安装,那么调试发布都适用)。

使用find_package ()的仅调试配置通常会在发现时忽略CMAKE_BUILD_TYPE。脚本在内部搜索文件和库并将位置存储在变量中。在脚本末尾,将扫描变量中的_NOTFOUND字符串,这是在所有引用路径/提示中未找到文件或库的结果。因此,如果找不到 Release 库,find_package ()基本上会失败,并将整个包标记为未正确安装,即使构建仅对Debug目标严格感兴趣。

通常,XXXConfig.cmake文件使用对find_package_handle_standard_args (.. PATH_TO_LIB) 的调用来扫描库的路径变量中的_NOTFOUND字符串。这些变量通常通过早期调用find_library (PATH_TO_LIB libname ..)设置为_NOTFOUND。有关更多信息,我参考 CMake 文档。

用户确实可以用“debug”标记调试库并用“optimized”发布库,但这似乎在库发现期间没有帮助,并且仅在链接期间使用。

有人知道如何正确处理这个问题吗?

亲切的问候

Com*_*sMS 5

这是经典使用的不幸的缺点之一find_package

请注意,find_package允许基于配置文件包的不同操作模式,这非常适合解决这个特定问题,但需要对构建系统进行一些更改。您将需要所有库的配置脚本(如果库本身也是由 CMake 构建的,CMake 可以为您生成它们;如果不是,这可能会有点麻烦),并且依赖的目标将通过导入的目标引用这些库而不是变量(这通常会让那些依赖目标的事情变得更容易)。我强烈建议您采用此作为长期解决方案。

如果由于某种原因您无法执行此操作,则必须修改查找脚本。一种常见的技术是分别搜索调试和发布二进制文件,然后将这些调用中的查找库组合到单个变量中(与 和debug说明optimized符一起),然后将该变量作为find_package_handle_standard_args. 这样,只要找到两者之一,您的查找脚本就会很高兴,尽管您最终可能无法构建所有可能的配置。或者,您也可以完全跳过调用find_package_handle_standard_args并手动实现您自己的逻辑来检测是否找到该库。正如您从该函数的联机帮助页中看到的,它主要执行样板内容,并且如果需要,可以轻松地用更灵活的手写实现替换。