了解 Meson#

构建 NumPy 依赖于以下工具,这些工具可以被认为是构建系统的一部分

  • meson:Meson 构建系统,可作为纯 Python 包从 PyPI 或 conda-forge 安装

  • ninja:由 Meson 调用以进行实际构建(例如,调用编译器)的构建工具。也可以从 PyPI(在所有常见平台上)或 conda-forge 安装。

  • pkg-config:用于发现依赖项(特别是 BLAS/LAPACK)的工具。在 conda-forge(以及 Homebrew、Chocolatey 和 Linux 包管理器)上可用,但未在 PyPI 上打包。

  • meson-python:Python 构建后端(即通过 pyproject.toml 中的挂钩由 pippypa/build 等构建前端调用的东西)。这是 Meson 之上的一个薄层,其主要作用是(a)与构建前端交互,以及(b)生成具有有效文件名和元数据的 sdist 和 wheel。

警告

截至 2023 年 12 月,NumPy 供应商提供 Meson 的自定义版本,这是 SIMD 和 BLAS/LAPACK 功能所必需的,这些功能尚未在 upstream Meson 中提供。因此,无法直接使用 meson 可执行文件。相反,无论何处说明 meson xxx,请改为使用 python vendored-meson/meson/meson.py xxx

使用 Meson 构建分阶段进行

  • 配置阶段 (meson setup),用于检测编译器、依赖项和构建选项,并创建构建目录和 build.ninja 文件,

  • 编译阶段 (meson compileninja),在此阶段,作为构建的 NumPy 包一部分的扩展模块将被编译,

  • 安装阶段 (meson install),用于将可安装文件从源目录和构建目录安装到目标安装目录,

Meson 具有良好的构建依赖项跟踪系统,因此第二次调用构建将仅重建任何源代码或依赖项已更改的目标。

要了解有关 Meson 的更多信息#

Meson 有 非常好的文档;阅读它是有益的,并且通常是解决“如何执行 X”问题的最佳来源。此外,可以在 https://nibblestew.blogspot.com/2021/12/this-year-receive-gift-of-free-meson.html 免费获得一本关于 Meson 的广泛的 PDF 书籍。

要了解有关 Meson 使用的设计原则的更多信息,从 mesonbuild.com/Videos 链接的最近演讲也是很好的资源。

构建阶段说明#

这仅用于教学目的;无需单独执行这些阶段!

假设我们从一个干净的仓库和一个完全设置的 conda 环境开始

git clone git@github.com:numpy/numpy.git
git submodule update --init
mamba env create -f environment.yml
mamba activate numpy-dev

要现在运行构建的配置阶段并指示 Meson 将构建工件放在 build/ 和仓库根目录下的本地安装在 build-install/ 中,请执行以下操作

meson setup build --prefix=$PWD/build-install

要运行构建的编译阶段,请执行以下操作

ninja -C build

在上面的命令中,-C 后面跟着构建目录的名称。您可以同时拥有多个构建目录。Meson 是完全独立于位置的,因此这些构建不会相互干扰。例如,您可以在不同的目录中拥有一个 GCC 构建、一个 Clang 构建和一个调试构建。

要将 NumPy 安装到前缀(这里为 build-install/,但请注意,这只是一个我们在这里选择的任意名称)

meson install -C build

然后它将安装到 build-install/lib/python3.11/site-packages/numpy,该目录不在您的 Python 路径上,因此要添加它,请执行以下操作(*再次,这是用于学习目的,显式使用 ``PYTHONPATH`` 通常不是最好的主意*)

export PYTHONPATH=$PWD/build-install/lib/python3.11/site-packages/

现在,我们应该能够导入 numpy 并运行测试。请记住,我们需要从仓库的根目录中移出,以确保我们拾取的是包而不是本地 numpy/ 源代码目录

cd doc
python -c "import numpy as np; np.test()"

以上运行“快速”numpy 测试套件。其他运行测试的方法也应该有效,例如

pytest --pyargs numpy

完整的测试套件应该通过,在 Linux 上不会出现任何构建警告(至少使用 GCC 版本,其中在 CI 中强制执行 -Werror),并且在其他平台上最多只会出现适度的警告。