构建可再发行二进制文件#

本节的目标读者是希望构建 SciPy 并将其部署到其自身机器以外的任何人——从发行版打包人员到希望构建轮子并将其部署到生产环境的用户。

当使用 python -m buildpip wheel 构建 SciPy 轮子时,该轮子将依赖于外部共享库(至少对于 BLAS/LAPACK 和 Fortran 编译器运行时库,可能还有其他库)。因此,此类轮子只能在构建它们的系统上运行。有关这方面的更多背景信息,请参阅 pypackaging-native 内容中的“构建和安装或上传工件”

因此,这样的轮子是生成可分发二进制文件的中间阶段。最终的二进制文件可能是一个轮子——在这种情况下,运行 auditwheel(Linux)、delocate(macOS)、delvewheel(Windows)或 repairwheel(平台无关)将所需的共享库供应商到轮子中。

最终的二进制文件也可能采用其他打包格式(例如 .rpm.deb.conda 包)。在这种情况下,有一些特定于打包生态系统的工具,可以先将轮子安装到暂存区,然后使该安装位置中的扩展模块可重定位(例如,通过重写 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。有关这些构建依赖项的更多详细信息,请参阅 工具链路线图

从轮子或已安装包中剥离测试套件#

默认情况下,已安装的 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