了解 Meson#
构建 SciPy 依赖于以下工具,它们可被视为构建系统的一部分
meson
:Meson 构建系统,可作为纯 Python 包从 PyPI 或 conda-forge 安装ninja
:Meson 调用的构建工具,用于执行实际构建(例如调用编译器)。也可从 PyPI(在所有常用平台上)或 conda-forge 安装。pkg-config
:用于发现依赖项(特别是 BLAS/LAPACK)的工具。可在 conda-forge(以及 Homebrew、Chocolatey 和 Linux 包管理器)上获取,但未在 PyPI 上打包。meson-python
:Python 构建后端(即,由pip
或pypa/build
等构建前端通过pyproject.toml
中的钩子调用的东西)。这是 Meson 之上的一个薄层,主要作用是 (a) 与构建前端接口,以及 (b) 生成带有有效文件名和元数据的 sdist 和 wheel。
使用 Meson 构建分阶段进行
配置阶段(
meson setup
),用于检测编译器、依赖项和构建选项,并创建构建目录和build.ninja
文件,编译阶段(
meson compile
或ninja
),其中编译作为已构建 SciPy 包一部分的扩展模块,安装阶段(
meson install
),用于将可安装文件从源目录和构建目录安装到目标安装目录,
Meson 具有良好的构建依赖跟踪系统,因此第二次调用构建将仅重新构建其任何源或依赖项已更改的目标。
了解更多关于 Meson 的信息#
Meson 拥有 非常好的文档;阅读它很有益,并且通常是“如何做 X”的最佳答案来源。此外,一本关于 Meson 的详尽 PDF 书籍可以免费获取,网址是 https://nibblestew.blogspot.com/2021/12/this-year-receive-gift-of-free-meson.html
要了解更多关于 Meson 使用的设计原则,mesonbuild.com/Videos 中链接的近期讲座也是一个很好的资源。
构建阶段解释#
这仅用于教学目的;没有必要单独执行这些阶段。仓库根目录下的 dev.py 脚本也包含这些步骤,可以研究以获取见解。
假设我们从一个干净的仓库和一个完全设置好的 conda 环境开始
git clone git@github.com:scipy/scipy.git
git submodule update --init
mamba env create -f environment.yml
mamba activate scipy-dev
现在运行构建的配置阶段,并指示 Meson 将构建产物放入 build/
目录,以及将本地安装放在相对于仓库根目录的 build-install/
下,请执行
meson setup build --prefix=$PWD/build-install
然后运行构建的编译阶段,请执行
ninja -C build
在上述命令中,-C
后跟构建目录的名称。您可以同时拥有多个构建目录。Meson 是完全异地构建的,因此这些构建不会相互干扰。例如,您可以在不同目录中进行 GCC 构建、Clang 构建和调试构建。
然后将 SciPy 安装到前缀中(这里是 build-install/
,但请注意这只是我们在此处选择的一个任意名称)
meson install -C build
然后它将安装到 build-install/lib/python3.11/site-packages/scipy
,这不在您的 Python 路径中,因此要添加它,请执行(再次强调,这仅用于学习目的,明确使用 PYTHONPATH
通常不是最好的主意)
export PYTHONPATH=$PWD/build-install/lib/python3.11/site-packages/
现在我们应该能够导入 scipy
并运行测试。请记住,我们需要移出仓库根目录,以确保我们拾取的是包而不是本地的 scipy/
源目录
cd doc
python -c "from scipy import constants as s; s.test()"
上述命令运行单个模块 constants
的测试。其他运行测试的方式也应该有效,例如
pytest --pyargs scipy
完整的测试套件应该通过,在 Linux 上不应有任何构建警告(至少在 CI 中强制使用 -Werror
的 GCC 版本上),在其他平台上最多只有适量的警告。