编译器选择和自定义构建#

选择特定的编译器#

Meson 支持标准的环境变量 CCCXXFC 来选择特定的 C、C++ 和/或 Fortran 编译器。这些环境变量在Meson 文档的参考表格中有记录。

请注意,环境变量仅在全新构建时应用,因为它们会影响配置阶段(即 meson setup)。增量重建不会对环境变量的变化做出反应 - 您必须运行 git clean -xdf 并进行完整重建,或者运行 meson setup --reconfigure

添加自定义编译器或链接器标志#

Meson 的设计偏好是通过传递给 meson setup 的命令行选项来配置构建。它提供了许多内置选项

  • 有关启用调试构建和优化级别,请参阅下一节“构建类型”

  • 以可移植的方式启用 -Werror 通过 -Dwerror=true 完成

  • 启用警告级别通过 -Dwarning_level=<val> 完成,其中 <val>{0, 1, 2, 3, everything} 之一

  • 还有许多其他内置选项,从激活 Visual Studio (-Dvsenv=true) 和使用链接时优化 (-Db_lto) 进行构建,到更改默认的 C++ 语言级别 (-Dcpp_std='c++17') 或链接器标志 (-Dcpp_link_args='-Wl,-z,defs')。

有关选项的全面概述,请参阅Meson 的内置选项文档页面

Meson 还支持标准的环境变量 CFLAGSCXXFLAGSFFLAGSLDFLAGS 来注入额外的标志 - 与上一节中关于这些环境变量仅在全新构建而不是增量构建时才会被拾取的注意事项相同。

使用 Meson 的不同构建类型#

Meson 在配置项目时提供了不同的构建类型。您可以在Meson 文档的“核心选项”部分中查看可用的构建类型选项。

假设您正在从头开始构建(如果需要,请执行 git clean -xdf),您可以将构建配置如下以使用 debug 构建类型

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

现在,您可以使用 dev.py 接口来进一步构建、安装和测试 SciPy

python dev.py -s linalg

这将起作用,因为在初始配置之后,Meson 将记住配置选项。

控制构建并行性#

默认情况下,ninja 将启动 2*n_cpu + 2,其中 n_cpu 是物理 CPU 核心的数量,并行构建作业。这在绝大多数情况下都很好,并且可以实现接近最佳的构建时间。在某些情况下,在 RAM 相对于 CPU 核心数量较小的机器上,这会导致作业耗尽内存。如果发生这种情况,请降低作业数 N,以便每个作业至少有 2 GB RAM。例如,要启动 6 个作业

python -m pip install . -Ccompile-args="-j6"

python dev.py build -j6

并行使用 GCC 和 Clang 构建#

在同一个仓库中拥有 SciPy 的多个构建可能很有用,例如为了比较两个编译器之间的差异以诊断问题。如前所述,Meson 是完全异地的,因此不同的构建不会相互干扰。在本节的其余部分中,我们假设 GCC 是默认值。例如,让我们使用 GCC 和 Clang 进行构建。

  1. 使用 GCC 构建

    python dev.py build
    

使用上面的命令,meson 将使用 build 目录中的(默认)GCC 编译器进行构建,并安装到 build-install 目录中。

  1. 使用 Clang 构建

    CC=clang CXX=clang++ FC=gfortran python dev.py --build-dir=build-clang build
    

使用上面的命令,Meson 将使用 build-clang 目录中的 Clang、Clang++ 和 Gfortran 编译器进行构建,然后将 SciPy 安装到 build-clang-install 中。

Meson 将记住 build-clang 目录的编译器选择,并且无法更改,因此每次将来调用 python dev.py --build-dir=build-clang <command> 时,它都会自动使用 Clang。

提示:使用别名使其更易于使用,例如 alias dev-clang="python dev.py --build-dir=build-clang",然后 dev-clang build

拥有两个构建的常见原因是比较它们之间的差异。例如,要运行使用两个编译器构建的 scipy.linalg 测试,请执行

python dev.py -s linalg                          # run tests for the GCC build
python dev.py --build-dir build-clang -s linalg  # run tests for the Clang build