了解 Meson#

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

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

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

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

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

警告

截至 23 年 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 具有 very good documentation ;阅读它是有好处的,并且通常是“如何做 X”的最佳答案来源.此外,可以在 https://nibblestew.blogspot.com/2021/12/this-year-receive-gift-of-free-meson.html 免费获得关于 Meson 的广泛 pdf 书籍.

要了解更多关于 Meson 使用的设计原则的信息,也可以参考 mesonbuild.com/Videos 链接的最近的演讲.

构建阶段说明#

这仅用于教学目的;应该没有必要单独执行这些阶段!

假设我们从一个干净的 repo 和一个完全设置好的 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/ 中,并将本地安装放在相对于 repo 根目录的 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 路径中.要将其添加到 Python 路径,请执行以下操作(同样,这仅用于学习目的,显式使用 PYTHONPATH 通常不是最佳做法):

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

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

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

以上命令运行的是 “fast” numpy 测试套件.其他运行测试的方法也应该有效,例如:

pytest --pyargs numpy

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