CMake:覆盖查找模块

Posted

技术标签:

【中文标题】CMake:覆盖查找模块【英文标题】:CMake: Overriding a find module 【发布时间】:2014-03-13 21:25:17 【问题描述】:

我想知道是否有可能用我自己的覆盖现有的(随 CMake 提供的)查找模块? 这样我就可以在我的项目中提供我稍微更新的模块,而无需强迫任何人替换 CMake 附带的模块。

我尝试了以下操作:

set(CMAKE_MODULE_PATH $CMAKE_MODULE_PATH "cmake/Modules/FindBullet.cmake")

“cmake/Modules/FindBullet.cmake”在我的项目目录中,但它似乎不起作用。

【问题讨论】:

【参考方案1】:

CMAKE_MODULE_PATH 必须设置为包含您的查找模块文件版本的目录:

set(CMAKE_MODULE_PATH $CMAKE_MODULE_PATH "$CMAKE_SOURCE_DIR/cmake/Modules")

【讨论】:

我在使用这种方法时遇到了问题。就我而言,我需要覆盖FindProtobuf.cmake。问题是,它包含SelectLibraryConfigurations.cmake(其中包含更多文件),并且被覆盖的版本尝试在同一位置查找此文件失败。这可能与 CMAKE_MODULE_PATH 在附加我自己的路径之前是一个空列表有关。我最终也复制了所有包含的模块,但这是一个糟糕的解决方案。除了将原始路径添加到CMAKE_MODULE_PATH 之外,知道如何解决它吗? (为什么一开始就不存在?) 顺便说一句,我们使用list 代替:list(APPEND CMAKE_MODULE_PATH $CMAKE_SOURCE_DIR/cmake/Modules) 虽然我认为这最终并不重要。 哦...我自己找到了问题的根源。 FindProtobuf.cmake include($CMAKE_CURRENT_LIST_DIR/SelectLibraryConfigurations.cmake) 这就是我需要复制这些文件的原因。 :(

以上是关于CMake:覆盖查找模块的主要内容,如果未能解决你的问题,请参考以下文章

CMake添加gcov代码覆盖测试支持

从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值

CMAKE_INSTALL_PREFIX如何设置默认值,并且保留从命令行覆盖的能力?

Cmake:将子目录链接模式覆盖为 LINK_PRIVATE

具有覆盖范围的 CMake ninja 将 gcno 文件放在根二进制目录中

如何从我自己的同名查找模块中执行CMake的默认查找模块?