是否可以从 CMake 命令行更改 CMAKE_MODULE_PATH?

Mar*_*cka 9 cmake

编辑:接受的答案实际上表明通常可以将 CMAKE_MODULE_PATH 设置为任何其他 CMake 变量,例如通过-DCMAKE_MODULE_PATH pathCLI 参数。在我的情况下,似乎有一些包含的 CMake 脚本调用set(CMAKE_MODULE_PATH /library_path),它会删除所有先前设置为变量的路径。这就是为什么我不能让变量做我想要它做的事情。如果其他人面临这种​​情况,我会将问题留在这里。


我正在构建一个使用 Protobuf 库的(第 3 方)项目(但这个问题是通用的)。我的系统在系统范围内安装了比项目兼容的更新版本的 Protobuf。所以我从源代码下载并编译了旧版本的 Protobuf。

该项目使用 CMake,在其 CMakeLists.txt 中,有:

find_package(Protobuf REQUIRED)
Run Code Online (Sandbox Code Playgroud)

但是,它会找到(不兼容的)系统安装。当然,CMake 不知道我对 Protobuf 的自定义构建。但是我该怎么说呢?

例如,我已经在其中创建了一个FindProtobuf.cmake文件,~/usr/share/cmake-3.0/Modules/并希望构建过程使用这个文件来查找 Protobuf。但是我没有成功地迫使 CMake 选择这个而不是系统一个。我认为原因从 CMake 文档中很明显find_package

该命令有两种搜索包的模式:“模块”模式和“配置”模式。当使用上述简化签名调用命令时,模块模式可用。CMake 在 CMAKE_MODULE_PATH 中搜索名为 Find<package>.cmake 的文件,然后是 CMake 安装。如果找到该文件,则由 CMake 读取并处理该文件。... 如果未找到模块且未提供 MODULE 选项,则命令进入配置模式。

所以,直到成功来改变CMAKE_MODULE_PATH,CMake的将刚刚拿起FindProtobuf.cmake安装到系统默认路径和永远不会进入“配置”模式,我大概可以使用CMAKE_PREFIX_PATH

对我来说重要的是不要编辑CMakeLists.txt它,因为它属于我不维护的第 3 方项目。

我尝试过的(都没有成功):

  • 调用CMAKE_MODULE_PATH=~/usr/share/cmake-3.0/Modules cmake ...(env. 变量不会“转移”到具有相同名称的 CMake 变量)
  • 调用cmake -DCMAKE_MODULE_PATH=~/usr/share/cmake-3.0/Modules ...(不起作用,可能是设计使然?)
  • 调用Protobuf_DIR=path/to/my/protobuf cmake ...(该项目不支持 Protobuf 的这种覆盖)

在我看来,不幸CMAKE_MODULE_PATHfind_package是,改变used by的唯一方法是从内部改变它CMakeLists.txt,这正是我想要避免的。

您有什么想法/解决方法可以不触碰CMakeLists.txt并且仍然说服find_package我找到我的自定义 Protobuf?

作为参考,这个项目的 CMake 部分在 github 上

Ale*_*ing 5

作为对您问题的直接回答,是的,您可以CMAKE_MODULE_PATH通过运行在命令行中进行设置cmake -DCMAKE_MODULE_PATH=/some/path -S /path/to/src -B /path/to/build

但这可能不会达到您想要的效果;见下文。


您提供的 Bitbucket 链接已失效,但这里有一些可能有帮助的建议。

  1. 避免编写自己的查找模块,尤其是当上游提供 CMake 配置模块时。
  2. CMAKE_PREFIX_PATH您可以通过将或Protobuf_ROOT(v3.12+)之一设置为 Protobuf 安装根目录,将 CMake 定向到自定义Protobuf 安装。
  3. 您可以通过设置为 true (v3.15+)来告诉首先find_package尝试模式。然后设置为包含.CONFIGCMAKE_FIND_PACKAGE_PREFER_CONFIGProtobuf_DIRProtobufConfig.cmake
  4. 如果一切失败,您可以手动设置 CMake 自己的FindProtobuf模块中记录的变量,此处: https: //cmake.org/cmake/help/latest/module/FindProtobuf.html

所有这些变量都可以在配置命令行中使用-D标志进行设置。

填充 CMake 变量以启动的环境变量非常少,我会避免依赖它们。这里有一个详尽的列表: https: //cmake.org/cmake/help/latest/manual/cmake-env-variables.7.htmlCMAKE_MODULE_PATH不在其中。