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!"