【发布时间】:2021-12-29 05:14:42
【问题描述】:
我正在尝试从cmake 创建一个python 包(deb 和rpm),最好使用cpack。我确实读过
- https://cmake.org/cmake/help/latest/cpack_gen/rpm.html 和,
- https://cmake.org/cmake/help/latest/cpack_gen/deb.html
对于我的共享库,安装工作正常(使用组件安装)。但是,我无法理解安装 python 绑定(胶水)代码的文档。使用标准的 cmake 安装机制,我尝试了:
install(
FILES __init__.py library.py
DESTINATION ${ACME_PYTHON_PACKAGE_DIR}/project_name
COMPONENT python)
然后使用蛮力方法最终得到:
# debian based package (relative path)
set(ACME_PYTHON_PACKAGE_DIR lib/python3/dist-packages)
和
# rpm based package (full path required)
set(ACME_PYTHON_PACKAGE_DIR /var/lang/lib/python3.8/site-packages)
以上来源于:
debian % python -c 'import site; print(site.getsitepackages())'
['/usr/local/lib/python3.9/dist-packages', '/usr/lib/python3/dist-packages', '/usr/lib/python3.9/dist-packages']
同时:
rpm % python -c 'import site; print(site.getsitepackages())'
['/var/lang/lib/python3.8/site-packages']
很明显,蛮力方法将无法移植,并且在 python 的下一个版本中注定会失败。我能想到的唯一可能的解决方案是生成一个临时的setup.py python 脚本(使用setuptools),它将进行安装。通常cmake 会调用following process:
% python setup.py install --root ${ACME_PYTHON_INSTALL_ROOT}
我的问题是:
- 我是否正确理解了 python 包的 cmake/cpack 文档?如果是这样,这意味着我需要生成一个中间
setup.py脚本。 - 我一直在搜索 cmake/cpack 代码库 (
git grep setuptools),但没有找到帮助函数来处理setup.py的生成并将结果文件传递回cpack。是否有可以重复使用的现有cmake模块?
我确实阅读了一些替代解决方案,例如:
这似乎过于复杂,并且面向仅基于 Debian 的系统。我需要处理 RPM。
【问题讨论】:
-
为什么不创建一个wheel包呢?
-
@Mizux 任何关于 cpack+wheel 的文档,谢谢?
-
只是想直接创建一个像 github.com/Mizux/python-native 这样的 whl 包,您可以上传到 pypi.org 等,不涉及 rpm。否则你可能对github.com/google/or-tools/blob/stable/cmake/…感兴趣
-
@Mizux 对于您的建议 #1,我无法将公司代码上传到 pypi.org。至于建议#2,这与我自己的答案非常相似。但是它没有处理与绝对路径 cmake
install()命令相关的复杂性。
标签: python python-3.x cmake setuptools