编译器选择与自定义构建#
选择特定的编译器#
Meson 支持标准环境变量 CC
、CXX
和 FC
来选择特定的 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 也支持标准的 CFLAGS
、CXXFLAGS
、FFLAGS
和 LDFLAGS
环境变量来注入额外的标志 - 与上一节中关于这些环境变量仅在干净构建时被拾取,而在增量构建时不被拾取的注意事项相同。
使用 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核心的数量。这在绝大多数情况下是合适的,并且能接近最优的构建时间。在某些情况下,对于内存相对于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 进行构建。
使用 GCC 构建:
python dev.py build
使用上述命令,meson 将在 build
目录中使用(默认)GCC 编译器进行构建,并安装到 build-install
目录中。
使用 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