CMake find_package不处理多配置

时间:2017-08-28 14:09:29

标签: c++ jenkins cmake multi-configuration

我们正在使用Jenkins 2.60.2和CMake 3.9.1来自动化我们的构建系统。这一切都适用于多个版本的构建工具,体系结构和调试/发布目标(如果已经构建和安装了所有配置,那么 Debug AND Release )。

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

通常 XXXConfig.cmake 文件使用对 find_package_handle_standard_args (.. PATH_TO_LIB)的调用来扫描路径变量中的 _NOTFOUND 字符串图书馆。这些变量通常通过先前对 find_library (PATH_TO_LIB libname ..)的调用设置为 _NOTFOUND 。有关更多信息,请参阅CMake文档。

用户确实可以使用' debug'标记调试库。并使用&optimize?优化'释放libs,但这在lib发现期间似乎没有帮助,仅在链接期间使用。

任何人都知道如何妥善处理这个问题?

亲切的问候

1 个答案:

答案 0 :(得分:3)

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

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

如果由于某种原因你不能这样做,你将不得不修改你的查找脚本。一种常见的技术是分别搜索调试和发布二进制文件,然后将这些调用中的查找库合并为一个变量(与debugoptimized说明符一起),然后使用 变量作为find_package_handle_standard_args的参数。这样,只要找到其中一个,您的查找脚本就会很开心,尽管您最终可能无法构建所有可能的配置。或者,您也可以完全跳过对find_package_handle_standard_args的调用,并手动实现自己的逻辑,以检测是否找到了库。从manpage for that function可以看出,它主要是样板文件,如果需要,可以通过更灵活的手写实现轻松替换。