【发布时间】:2017-05-11 20:15:28
【问题描述】:
编辑:接受的答案实际上表明通常可以将 CMAKE_MODULE_PATH 设置为任何其他 CMake 变量,例如通过-DCMAKE_MODULE_PATH path CLI 参数。在我的情况下,似乎包含一些调用 set(CMAKE_MODULE_PATH /library_path) 的 CMake 脚本,它会删除所有以前设置为变量的路径。这就是为什么我不能让变量做我想做的事。我会把问题留在这里,以防其他人遇到这种情况。
我正在构建一个使用 Protobuf 库的(第 3 方)项目(但这个问题很笼统)。我的系统在系统范围内安装了比项目兼容的更新版本的 Protobuf。所以我从源代码下载并编译了一个旧版本的 Protobuf。
项目使用CMake,在其CMakeLists.txt中有:
find_package(Protobuf REQUIRED)
但是,它会找到(不兼容的)系统安装。当然,CMake 不知道我自定义的 Protobuf 构建。但是我该怎么说呢?
我在~/usr/share/cmake-3.0/Modules/ 中创建了一个FindProtobuf.cmake 文件,并希望构建过程使用这个文件来查找Protobuf。但是我没有成功强迫 CMake 选择这个而不是系统一个。我认为原因在find_package 的 CMake 文档中非常明显:
该命令有两种搜索包的模式:“模块”模式和“配置”模式。当使用上述简化签名调用命令时,模块模式可用。 CMake 在 CMAKE_MODULE_PATH 中搜索名为 Find
.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 ...(环境变量未“转移”到同名的CMake变量) - 调用
cmake -DCMAKE_MODULE_PATH=~/usr/share/cmake-3.0/Modules ...(不起作用,可能是设计使然?) - 调用
Protobuf_DIR=path/to/my/protobuf cmake ...(项目不支持这种对Protobuf的覆盖)
不幸的是,在我看来,更改find_package 使用的CMAKE_MODULE_PATH 的唯一方法是从CMakeLists.txt 内部更改它,这正是我想要避免的。
对于如何不碰CMakeLists.txt 并仍然说服find_package 找到我的自定义 Protobuf,您有任何想法/解决方法吗?
作为参考,这个项目的CMake部分是on github。
【问题讨论】:
-
你使用错误的方式来强制 CMake 使用 protobuf 的非默认安装。您需要提示现有脚本以找到您的 Protobuf 安装,而不是替换
FindProtobuf.cmake脚本。例如。您可以设置 CMAKE_PREFIX_PATH 变量。有关此类“提示”的更多信息,请参阅问题stackoverflow.com/questions/34795816/…。 -
谢谢@Tsyvarev,根据您的建议,我说服了项目编译。但是你能指出我的来源解释为什么我想做的事情是错误的吗?
-
这只是一个通用的方法:如果您可以调整环境以使现有代码工作,那么就这样做而不是修改代码。
标签: cmake