跳转到主要内容

基于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 查看散列)

上传时间 Python 3

由以下支持

AWSAWS 云计算和安全赞助商 DatadogDatadog 监控 FastlyFastly CDN GoogleGoogle 下载分析 MicrosoftMicrosoft PSF赞助商 PingdomPingdom 监控 SentrySentry 错误日志 StatusPageStatusPage 状态页面