如何通过Python postbuild脚本访问CMakeLists.txt中的CMake变量?
实现方法
方法1:将CMake变量写入配置文件,Python读取
CMake可以在构建过程中生成包含变量信息的配置文件(比如JSON、INI格式),Python脚本读取该文件即可获取变量值。
示例步骤:
- 在CMakeLists.txt中添加代码,导出变量到JSON文件并调用Python脚本:
# 生成JSON配置文件,写入需要的CMake变量 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/cmake_vars.json" "{ \"CMAKE_PROJECT_NAME\": \"${CMAKE_PROJECT_NAME}\", \"CMAKE_BUILD_TYPE\": \"${CMAKE_BUILD_TYPE}\", \"CMAKE_INSTALL_PREFIX\": \"${CMAKE_INSTALL_PREFIX}\" }") # 配置postbuild步骤,执行Python脚本 add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/postbuild.py" "${CMAKE_CURRENT_BINARY_DIR}/cmake_vars.json" )
- 对应的Python脚本(postbuild.py)读取配置文件:
import json import sys if __name__ == "__main__": if len(sys.argv) < 2: print("请传入配置文件路径") sys.exit(1) config_path = sys.argv[1] with open(config_path, 'r') as f: cmake_vars = json.load(f) print("CMake项目名称:", cmake_vars["CMAKE_PROJECT_NAME"]) print("构建类型:", cmake_vars["CMAKE_BUILD_TYPE"]) # 此处可添加变量的后续处理逻辑
方法2:直接将CMake变量作为命令行参数传给Python脚本
如果需要传递的变量数量不多,可以直接在CMake的postbuild命令中把变量作为参数传递,Python通过sys.argv或参数解析库获取值。
示例:
- CMakeLists.txt中的配置:
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/postbuild.py" --project-name "${CMAKE_PROJECT_NAME}" --build-type "${CMAKE_BUILD_TYPE}" --install-prefix "${CMAKE_INSTALL_PREFIX}" )
- Python脚本处理命令行参数:
import argparse if __name__ == "__main__": parser = argparse.ArgumentParser(description='Postbuild处理脚本') parser.add_argument('--project-name', required=True, help='CMake项目名称') parser.add_argument('--build-type', required=True, help='CMake构建类型') parser.add_argument('--install-prefix', required=True, help='CMake安装路径前缀') args = parser.parse_args() print("项目名称:", args.project_name) print("构建类型:", args.build_type) # 后续业务逻辑处理
方法3:使用CMake的configure_file生成Python模块
利用CMake的configure_file功能,将模板Python文件中的占位符替换为实际CMake变量值,生成可直接运行的Python脚本。
示例:
- 创建模板文件
postbuild_template.py.in:
# 此文件由CMake自动生成,请勿手动修改 CMAKE_PROJECT_NAME = "@CMAKE_PROJECT_NAME@" CMAKE_BUILD_TYPE = "@CMAKE_BUILD_TYPE@" CMAKE_INSTALL_PREFIX = "@CMAKE_INSTALL_PREFIX@" if __name__ == "__main__": print("项目名称:", CMAKE_PROJECT_NAME) print("构建类型:", CMAKE_BUILD_TYPE) # 添加自定义处理逻辑
- 在CMakeLists.txt中配置生成脚本并调用:
# 替换模板中的占位符,生成实际的Python脚本 configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/postbuild_template.py.in" "${CMAKE_CURRENT_BINARY_DIR}/postbuild.py" @ONLY ) # 配置postbuild步骤执行生成好的脚本 add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/postbuild.py" )
内容的提问来源于stack exchange,提问作者Saravanan_Rk
相关产品推荐
相关产品推荐

