如何通过CMake/CPack构建兼容多平台的Python deb、rpm安装包
问题解答
1. 不需要必须生成中间setup.py脚本
你对文档的理解有偏差,硬编码路径的问题完全可以通过CMake动态查询解决,不需要绕setuptools流程:
- CMake 3.15及以上版本自带的
FindPython3模块已经提供了预定义的Python3_SITELIB变量,直接返回当前环境下Python第三方包的安装绝对路径,不需要你手动执行命令查询。 - 针对DEB和RPM生成器对路径的不同要求,你可以通过判断CPack生成器类型动态调整路径格式:DEB生成器默认会给相对路径自动添加
/usr前缀,你只需要把查询到的绝对路径去掉前缀即可;RPM生成器支持直接使用绝对路径,不需要修改。
2. 现成的可复用实现方案
不需要找额外的第三方模块,用CMake自带功能就能实现全平台适配,参考配置如下:
# 查找Python3环境 find_package(Python3 REQUIRED COMPONENTS Interpreter) # 动态获取Python站点包绝对路径 set(ACME_PYTHON_PACKAGE_DIR "${Python3_SITELIB}/project_name" CACHE PATH "Python包安装路径") # 适配不同CPack生成器的路径要求 if(CPACK_GENERATOR STREQUAL "DEB") # Debian系需要相对路径,去掉开头的/usr/前缀 string(REPLACE "/usr/" "" ACME_PYTHON_PACKAGE_DIR "${ACME_PYTHON_PACKAGE_DIR}") endif() # 安装Python胶水代码 install( FILES __init__.py library.py DESTINATION ${ACME_PYTHON_PACKAGE_DIR} COMPONENT python )
如果你确实需要使用setuptools流程(比如要处理复杂的Python依赖、字节码编译等场景),可以用以下配置直接调用安装命令,不需要手动生成setup.py:
install(CODE " execute_process( COMMAND ${Python3_EXECUTABLE} setup.py install --root \$ENV{DESTDIR}/ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) " COMPONENT python)
该配置会自动适配DEB和RPM的构建流程,不需要针对发行版做额外修改。
内容的提问来源于stack exchange,提问作者malat
相关产品推荐
相关产品推荐

