理解 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 构建后端(即,通过pyproject.toml
中的钩子被像pip
或pypa/build
这样的构建前端调用的东西)。这是一个建立在 Meson 之上的薄层,其主要作用是 (a) 与构建前端交互,以及 (b) 生成具有有效文件名和元数据的 sdists 和 wheels。
使用 Meson 构建分阶段进行
配置阶段 (
meson setup
),用于检测编译器、依赖项和构建选项,并创建构建目录和build.ninja
文件,编译阶段 (
meson compile
或ninja
),其中作为构建的 SciPy 包一部分的扩展模块被编译,安装阶段 (
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 链接的最近的演讲也是一个很好的资源。
构建阶段说明#
这仅用于教学目的;无需单独执行这些阶段。存储库根目录中的 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 版本),并且在其他平台上最多只有适度的警告。