CMake 系列(十二):检测 Python 解释器

Python 是一种非常流行的语言。许多项目使用 Python 编写的工具来打包主程序和库,或者在配置或构建过程中使用 Python 脚本。在这些情况下,需要确保运行时对 Python 解释器的依赖也得到满足。本示例将展示如何检测和使用 Python 解释器。

我们将介绍 find_package 命令,这个命令将贯穿本章。

注意:本示例在 CMake 3.5 或更高版本中有效,并已在 GNU/Linux、macOS 和 Windows 上测试通过。

具体步骤

find_package 是用于发现和设置包的 CMake 模块命令。这些模块包含 CMake 命令,用于标识系统标准位置中的包。CMake 模块文件称为 Find<name>.cmake,当调用 find_package(<name>) 时,模块中的命令将会运行。

除了在系统上实际查找包之外,查找模块还会设置一些有用的变量,反映实际找到了什么,我们也可以在自己的 CMakeLists.txt 中使用这些变量。对于 Python 解释器,相关模块为 FindPythonInterp.cmake,它会附带设置一些 CMake 变量。

可以强制 CMake 查找特定版本的包。例如,要求 Python 解释器的版本大于或等于 2.7,可以使用 find_package(PythonInterp 2.7)。

也可以强制满足依赖关系:

find_package(PythonInterp REQUIRED)

如果在查找位置中没有找到合适的 Python 解释器可执行文件,CMake 将中止配置。

提示:CMake 提供了很多查找软件包的模块。建议使用 Find<package>.cmake 模块之前,先详细阅读它们的文档;一个很好的替代方法是直接浏览 CMake 自带的模块源代码——它们记录了模块会使用哪些变量,以及哪些变量可以在 CMakeLists.txt 中使用。

当软件包没有安装在标准位置时,CMake 无法正确定位它们。用户可以通过 CLI 的 -D 参数传递相应的选项,告诉 CMake 查看特定的位置。对于 Python 解释器,可以使用以下配置:

$ cmake -D PYTHON_EXECUTABLE=/custom/location/python ..

这将指定非标准安装目录 /custom/location/python 中的 Python 可执行文件。

注意:每个包都是不同的,Find<package>.cmake 模块试图提供统一的检测接口。当 CMake 无法找到包时,建议阅读相应检测模块的文档,以了解如何正确地使用该模块。可以在终端中直接浏览文档,本例中可使用 cmake --help-module FindPythonInterp 查看。

更多信息

除了检测包之外,还有一个便于打印变量的 helper 模块值得了解。本示例中,我们使用了以下方法:

message(STATUS "RESULT_VARIABLE is: ${_status}")
message(STATUS "OUTPUT_VARIABLE is: ${_hello_world}")

使用 CMakePrintHelpers 模块进行调试:

include(CMakePrintHelpers)
cmake_print_variables(_status _hello_world)

将产生以下输出:

-- _status="0" ; _hello_world="Hello, world!"

系列导航


   转载规则


《CMake 系列(十二):检测 Python 解释器》 由 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
CMake 系列(十三):检测 Python 库 CMake 系列(十三):检测 Python 库
可以使用 Python 工具来分析和操作程序的输出。然而,还有更强大的方法可以将解释语言(如 Python)与编译语言(如 C 或 C++)组合在一起使用。一种是扩展 Python,通过编译成共享库的 C 或 C++ 模块为 Python
2022-06-07
下一篇 
CMake 系列(十一):处理与编译器相关的源代码 CMake 系列(十一):处理与编译器相关的源代码
这个方法与前面的方法类似:我们将使用 CMake 来编译依赖于环境的条件源代码,本例中该依赖是编译器。为了可移植性,我们应尽量避免编写新代码,但遇到有依赖的情况也要去解决,特别是在使用历史代码或处理编译器相关工具(如 sanitizers)
2022-05-24
  目录