我正在编写一个链接 C++ 库的 Python 扩展,并且我正在使用 cmake 来帮助构建过程。这意味着现在,我知道如何捆绑它的唯一方法是,我必须先用 cmake 编译它们,然后才能运行 setup.py bdist_wheel。一定会有更好的办法。
我想知道是否可以(或任何人尝试过)调用 CMake 作为 setup.py ext_modules 构建过程的一部分?我猜有一种方法可以创建某些东西的子类,但我不确定在哪里看。
我之所以使用 CMake,是因为它让我可以更好地控制构建 c 和 c++ 库扩展,并完全按照我的需要进行复杂的构建步骤。另外,我可以使用 findPythonLibs.cmake 中的 PYTHON_ADD_MODULE() 命令直接使用 cmake 轻松构建 Python 扩展。我只希望这只是一步。
原文由 loneraver 发布,翻译遵循 CC BY-SA 4.0 许可协议
您基本上需要做的是在您的
setup.py
中覆盖build_ext
命令类并将其注册到命令类中。在build_ext
的自定义 impl 中,配置并调用cmake
来配置然后构建扩展模块。不幸的是,官方文档对于如何实现自定义distutils
命令相当简洁(参见 扩展 Distutils );我发现直接研究命令代码更有帮助。例如,这里是build_ext
命令 的源代码。示例项目
我准备了一个简单的项目,由一个 C 扩展
foo
和一个 python 模块spam.eggs
:用于测试设置的文件
这些只是我为测试设置脚本而编写的一些简单存根。
spam/eggs.py
(仅用于测试库调用):spam/foo.c
:spam/foo.h
:CMakeLists.txt
:设置脚本
这就是魔法发生的地方。当然,还有很大的改进空间 - 如果需要,您可以将其他选项传递给
CMakeExtension
类(有关扩展的更多信息,请参阅 构建 C 和 C++ 扩展),制作 CMake 选项通过setup.cfg
通过覆盖方法initialize_options
和finalize_options
等进行配置。测试
构建项目的轮子,安装它。测试库是否安装:
从
spam.eggs
模块运行包装函数: