CMake:检测python模块和包
- 导言
- 项目结构
- CMakeLists.txt
- 相关源码
导言
上一篇,我们基本了解了如何去检测python的解释器和python库。通常,代码是依赖于特定的python模块,无论是python工具、嵌入python的程序,还是扩展python的库。例如,numpy包。依赖于python模块或包的项目中,确定满足对这些python模块的依赖非常重要。
项目结构
.
├── CMakeLists.txt
├── py3_pure_embedding.cpp
└── use_numpy.py
项目地址:
https://gitee.com/jiangli01/tutorials/tree/master/cmake-tutorial/chapter3/03
CMakeLists.txt

execute_process(
COMMAND ${PYTHON_EXECUTABLE} "-c" "import re, numpy; print(re.compile('/__init__.py.*').sub('',numpy.__file__))"
RESULT_VARIABLE numpy_status
OUTPUT_VARIABLE numpy_location
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
使用了CMake的execute_process函数来运行一个python脚本。该脚本导入了re和numpy模块,然后使用re.compile函数来替换numpy模块路径中的一个模式。RESULT_VARIABLE用于捕获python脚本执行的状态,而OUTPUT_VARIABLE用于捕获修改后的numpy模块文件的位置。通过使用ERROR_QUIET来抑制进程生成的任何错误,并且使用OUTPUT_STRIP_TRAILING_WHITESPACE来移除输出中的尾随空格。
if(NOT numpy_status)
set(NumPy ${numpy_location} CACHE STRING "Location of NumPy")
endif()
如果numpy_status不为空,那么设置了一个名为NumPy的CMake缓存变量,其值为numpy_location,这个变量用于存储NumPy库的位置信息。这个操作允许在CMake配置过程中指定NumPy的位置,以便后续的构建过程可以使用它。如果numpy_status为空,则不进行任何操作。
execute_process(
COMMAND ${PYTHON_EXECUTABLE} "-c" "import numpy; print(numpy.__version__)"
OUTPUT_VARIABLE numpy_version
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
这段代码使用execute_process命令来执行一个python脚本。
${PYTHON_EXECUTABLE}是一个CMake变量,用于指定python可执行文件的路径。-c选项告诉python解释器后面紧跟着的字符串是要执行的python代码。- 在这个
python代码中,首先导入了numpy库,然后使用print函数输出了numpy库的版本号。 OUTPUT_VARIABLE选项用于捕获python代码的输出,即numpy库的版本号。ERROR_QUIET选项用于忽略可能的错误信息。OUTPUT_STRIP_TRAILING_WHITESPACE选项用于移除输出字符串末尾的空格。
通过这个操作,可以在CMake配置过程中获取并保存numpy库的版本号,以便后续的构建过程可以使用。
add_custom_command(
OUTPUT
${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py
COMMAND
${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/use_numpy.py
${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/use_numpy.py
)
使用 CMake 中的 add_custom_command 命令,用于定义自定义的构建步骤,以及生成相应的输出文件。
OUTPUT指定了生成的输出文件,这里是${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py。COMMAND指定了生成输出文件所需要执行的命令,这里是将${CMAKE_CURRENT_SOURCE_DIR}/use_numpy.py复制到${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py。DEPENDS列出了生成输出文件所依赖的文件,这里是${CMAKE_CURRENT_SOURCE_DIR}/use_numpy.py。
这段代码的作用是在构建过程中,如果 ${CMAKE_CURRENT_SOURCE_DIR}/use_numpy.py 发生变化,就执行指定的命令来将该文件复制到构建目录 ${CMAKE_CURRENT_BINARY_DIR} 下的相同路径。这可以确保在构建过程中,始终使用最新的 use_numpy.py 文件。
target_sources(pure-embedding
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py
)
在 CMake 的构建过程中为名为 pure-embedding 的目标(通常是一个可执行文件或库)指定了源文件。在这里,并没有直接添加 C++ 源代码,而是添加了一个 python 脚本文件 ${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py。
这意味着在构建 pure-embedding 目标时,CMake 会将 ${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py 视为目标的源文件之一,并确保在构建过程中该文件已经生成。
相关源码
py3_pure_embedding.cpp

use_numpy.py

最后:希望大家都勇于向邪恶势力作斗争!!!














![[C初阶笔记]P1](https://img-blog.csdnimg.cn/16541d45b4934e33b959eeaad4aafe16.png)




