构建可再分发的二进制文件#
本节的目标读者是任何希望构建 SciPy 并在自己的机器之外部署的人——从发行版打包者到希望构建轮子以部署到其生产环境的用户
当使用 python -m build
或 pip wheel
来构建 SciPy 轮子时,该轮子将依赖于外部共享库(至少对于 BLAS/LAPACK 和 Fortran 编译器运行时库,可能还有其他库)。因此,这样的轮子只能在构建它们的系统上运行。更多相关内容请参见 pypackaging-native 内容中的“构建和安装或上传工件”部分。
因此,像那样的轮子是生成可分发二进制文件的中间阶段。最终的二进制文件可能是一个轮子 - 在这种情况下,运行 auditwheel
(Linux)、delocate
(macOS)、delvewheel
(Windows) 或 repairwheel
(平台无关) 将所需的共享库打包到轮子中。
最终的二进制文件也可能采用另一种打包格式(例如,.rpm
、.deb
或 .conda
包)。在这种情况下,有特定于打包生态系统的工具首先将 wheel 安装到暂存区域,然后使该安装位置中的扩展模块可重定位(例如,通过重写 RPATH),最后将其重新打包为最终的包格式。
构建和运行时依赖项#
构建 SciPy 所需的 Python 构建和运行时依赖项可以在 pyproject.toml
元数据中找到。请注意,对于 SciPy 的发布版本,依赖项可能会有上限。每个上限上面都有注释;打包者通常可以自由地删除或放宽这些上限(numpy
除外)。例如:
# The upper bound on pybind11 is pre-emptive only
"pybind11>=2.12.0,<2.13.0",
# ...
# 3. The <2.3 upper bound is for matching the numpy deprecation policy,
# it should not be loosened.
"numpy>=2.0.0rc1,<2.3",
非Python构建需求包括:
C、C++ 和 Fortran 编译器
BLAS 和 LAPACK 库
ninja
pkg-config
在顶层的 meson.build
文件中强制执行了常见编译器的最低版本。当前 LAPACK 的最低版本是 3.7.1。关于这些构建依赖项的更多详细信息可以在 工具链路线图 中找到。
从 wheel 或已安装的包中剥离测试套件#
默认情况下,已安装的 scipy
版本包含完整的测试套件。该测试套件,包括仅用于测试的数据文件和编译的扩展模块,在一个轮子文件中占用约 4.5 MB(对于 x86-64,截至 v1.14.0),在磁盘上占用更多。在二进制大小重要的情况下,打包者可能希望移除测试套件。截至 SciPy 1.14.0,有一种方便的方法可以做到这一点,利用 Meson 的安装标签 功能。它只需一行代码:
$ python -m build -wnx -Cinstall-args=--tags=runtime,python-runtime,devel
备注
请注意,在上面的命令中 -wnx
表示 --wheel --no-isolation --skip-dependency-check
。它假设打包者已经设置好了构建环境,这在分发包打包中通常是这种情况。安装标签功能同样适用于隔离构建(例如 pip install scipy --no-binary -Cinstall-args=--tags=runtime,python-runtime,devel
)。
如果你想为测试本身生成一个单独的包,比如说命名为 scipy-tests
,那么请编辑 pyproject.toml
以更改项目名称:
[project]
name = "scipy-tests"
然后使用以下命令构建::
$ python -m build -wnx -Cinstall-args=--tags=tests
上述操作将构建整个包两次;为了以缓存方式重新构建,请使用 -Cbuild-dir=build
构建选项:
$ $ # apply patch to change the project name in pyproject.toml
$ python -m build -wnx -Cbuild-dir=build -Cinstall-args=--tags=tests
最终结果将看起来像这样:
$ ls -lh dist/*.whl
... 20M ... dist/scipy-1.14.0-cp311-cp311-linux_x86_64.whl
... 4,5M ... dist/scipy_tests-1.14.0-cp311-cp311-linux_x86_64.whl