基于Flit的二进制轮支持。
项目描述
Flit的CPython扩展模块支持
这是一个依赖PEP 517构建后端,通过(并修改)Flit以支持构建C扩展。
主要是一个概念验证,但如果Flit可以更好地支持挂钩到构建系统,则可以进一步开发成更有用的东西。
功能
- 可以构建C扩展。
- 不需要用户预先安装编译器。
- 非常好的缓存;增量编译性能优于setuptools,这是我从完全非科学的观察中得出的结论。
- 生成具有适当标签的轮文件以进行分发。
局限性
- 由于Flit仅支持一个单一的顶层Python模块/包,并强制存在该文件/目录,因此目前只能将扩展作为包的子模块进行构建。
- 由于Flit的自动元数据内省(从模块中读取版本和描述)需要导入顶层模块/包,因此您要么需要跳过一些钩子以使这些工作而不需要扩展可用,或者只能将元数据写入
pyproject.toml
。 - 与setuptools和平台提供的编译器相比,“冷”编译时间较慢。
- 不允许自定义编译器标志(可能实现)。
- 目前仅处理C。我相信它有可能支持C++(和Zig)。
- 可能还有更多,setuptools有多年历史,因此可以涵盖我从未梦想到的许多边缘情况。
特点
- 直接将扩展模块编译到顶层Python包中。这使得可以在不安装的情况下运行扩展,我认为这很有用。但这会使源代码树变得有些混乱(您可能需要偶尔运行
git clean
以保持一切正常)。
如何做
在examples/demo
中有一个最小示例,其中包含所有需要的部分。
[build-system]
requires = ["zlig"]
build-backend = "zlig"
# ... Project metadata declaration.
[tool.flit.sdist]
# Exclude extension modules from sdist.
exclude = ["src/demo/*.so"]
[tool.zlig]
# Declare extensions and its sources.
extensions = [{name = "demo.demo", sources = ["src/**/*.c"]}]
将以下条目添加到您的 .gitignore
/build.zig
/zig-cache/
/zig-out/
# Flit builds things to /dist so add it too.
# Also *.pyd and *.so files but you should've already ignored them.
详细信息
作为PEP 517后端,此模块简单地连接了Flit的构建API的大部分内容,但重新实现了build_wheel
以执行一些额外操作
- 在将包交给Flit之前编译扩展模块,这会将所有文件(包括编译的扩展)添加到轮中。
- 在将文件添加到轮中时,首先检查该文件是否是扩展的源文件,并将其排除。
- 覆盖Flit决定轮文件名的逻辑,使用平台特定的轮标签代替。
编译魔法由Zig的构建系统提供。作为PEP 517构建依赖项,安装了一个可工作的Zig编译器。[PEP 517 build dependency] 在编译过程中,后端从pyproject.toml
生成构建脚本(build.zig
),然后调用Zig编译器完成剩余工作。编译完成后,这些二进制文件被复制到Flit期望找到模块的位置。
项目详情
下载文件
下载适合您平台的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。
源分发
此版本没有可用的源分发文件。请参阅生成分发存档的教程。
构建分发
zlig-0.0.0-py3-none-any.whl (7.7 kB 查看散列)
关闭
zlig-0.0.0-py3-none-any.whl的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | a60a3b7bcef838c28e4cf3aaa984b7c6da8539ac4217783915c80e2a5dfaab23 |
|
MD5 | e51bf2d484b1f88ba92e4099d7758c97 |
|
BLAKE2b-256 | b08e2de2043ded4c40e453c417421de55c1ae91deeda390810548f5b48caed47 |