内置选项

Meson 提供两种类型的选项:构建文件提供的构建选项 和内置选项,这些选项是通用选项、基本选项、编译器选项之一。

通用选项

所有这些选项可以通过将 -Doption=value 传递给 meson(又名 meson setup)来设置,或者通过在 meson.build 中的 project()default_options 中设置它们来设置。某些选项还可以通过 --option=value--option value 设置 -- 运行 meson setup --help 将显示一个列表。

出于兼容性原因,--warnlevelwarning_level 选项的命令行参数。

它们也可以在设置后使用 meson configure -Doption=value 进行编辑。

安装选项通常相对于前缀,但不能依赖于此,因为它们在以下情况下可以是绝对路径

  • 当前缀为 /usr 时:sysconfdir 默认值为 /etclocalstatedir 默认值为 /varsharedstatedir 默认值为 /var/lib
  • 当前缀为 /usr/local 时:localstatedir 默认值为 /var/localsharedstatedir 默认值为 /var/local/lib
  • 当用户/发行版提供前缀之外的绝对路径时。

目录

选项 默认值 描述
prefix 见下文 安装前缀
bindir bin 可执行文件目录
datadir share 数据文件目录
includedir include 头文件目录
infodir share/info Info 页面目录
libdir 见下文 库目录
licensedir 见下文 许可证目录(自 1.1.0 版本起)
libexecdir libexec 库可执行文件目录
localedir share/locale 区域设置数据目录
localstatedir var 本地状态数据目录
mandir share/man 手册页目录
sbindir sbin 系统可执行文件目录
sharedstatedir com 与体系结构无关的数据目录
sysconfdir etc Sysconf 数据目录

prefix 在 Windows 上默认为 C:/,在其他平台上默认为 /usr/local。您应该始终覆盖此值。

libdir 是根据您的平台自动检测到的,在进行“本地”编译(构建机器 == 主机机器)时,它应该正确。对于交叉编译,Meson 会尝试猜测正确的 libdir,但这可能不准确,特别是在 Linux 上,因为不同的发行版有不同的默认值。使用 交叉文件,尤其是路径部分可能很有必要。

licensedir 默认情况下为空。如果设置,它定义了安装依赖关系清单和项目许可证的默认位置。有关更多详细信息,请参阅 meson.install_dependency_manifest()

核心选项

在表格中标有“每台机器”的选项是针对每台机器设置的。有关详细信息,请参阅 指定每台机器的选项 部分。

选项 默认值 描述 是否每台机器 是否每个子项目
auto_features {enabled, disabled, auto} auto 覆盖所有“自动”功能的值
backend {ninja, vs,
vs2010, vs2012, vs2013, vs2015, vs2017, vs2019, vs2022, xcode, none}
ninja 要使用的后端
genvslite {vs2022} vs2022 设置多构建类型 ninja 构建目录和 Visual Studio 解决方案
buildtype {plain, debug,
debugoptimized, release, minsize, custom}
debug 要使用的构建类型
debug 启用调试符号和其他信息
default_both_libraries {shared, static, auto} shared both_libraries 的默认库类型
default_library {shared, static, both} shared 默认库类型
errorlogs 是否打印失败测试的日志。
install_umask {preserve, 0000-0777} 022 应用于已安装文件的权限的默认 umask
layout {mirror,flat} mirror 构建目录布局
optimization {plain, 0, g, 1, 2, 3, s} 0 优化级别
pkg_config_path {OS 分隔路径} '' pkg-config 在内置路径之前搜索的附加路径
prefer_static 是否在共享链接之前尝试静态链接
cmake_prefix_path [] cmake 在内置路径之前搜索的附加前缀
stdsplit 在测试日志中拆分 stdout 和 stderr
strip 在安装时剥离目标
unity {on, off, subprojects} off 统一构建
unity_size {>=2} 4 统一文件块大小
warning_level {0, 1, 2, 3, everything} 1 设置警告级别。从 0 = 编译器默认值到 everything = 最高
werror 将警告视为错误
wrap_mode {default, nofallback,
nodownload, forcefallback, nopromote}
default 要使用的包装模式
force_fallback_for [] 强制为这些依赖项回退
vsenv 激活 Visual Studio 环境

backend 的详细信息

几种构建文件格式被支持作为命令运行器来构建配置的项目。Meson 默认情况下首选 ninja,但平台特定的后端也可用,以更好地与原生工具集成:Windows 的 Visual Studio 和 macOS 的 xcode。也可以配置为完全不使用后端,如果您有要构建的目标,这将是一个错误,但对于需要配置 + 测试 + 安装的项目,它允许更轻量级的自动化构建管道。

genvslite 的详细信息

设置多个构建类型后缀的 ninja 后端构建目录(例如,[builddir]_[debug/release/etc.]),并生成 [builddir]_vs,其中包含一个 Visual Studio 解决方案,该解决方案具有多个配置,这些配置会调用 meson 编译已设置的构建目录,以适合当前配置(构建类型)。

这与使用一组不同的 buildtype 值的多个“meson setup …”调用的简单设置宏具有相同的效果。例如,meson setup ... --genvslite vs2022 somebuilddir 执行以下操作 -

meson setup ... --backend ninja --buildtype debug somebuilddir_debug
meson setup ... --backend ninja --buildtype debugoptimized somebuilddir_debugoptimized
meson setup ... --backend ninja --buildtype release somebuilddir_release

此外,还会创建一个名为“somebuilddir_vs”的目录,其中包含一个生成的多分支 Visual Studio 解决方案和项目,这些项目设置为使用适合解决方案所选构建类型配置的 somebuilddir_[...] 进行构建/编译。

buildtype 的详细信息

要设置优化级别和切换调试,您可以设置 buildtype 选项,也可以设置 optimizationdebug 选项,这些选项可以对同一项进行更精细的控制。无论您决定使用哪个,另一个选项将根据它推断出来。例如,-Dbuildtype=debugoptimized 等同于 -Ddebug=true -Doptimization=2,反之亦然。此表记录了双向映射

buildtype debug optimization
plain plain
debug 0
debugoptimized 2
release 3
minsize s

debugoptimization 的所有其他组合都将 buildtype 设置为 'custom'

warning_level 的详细信息

每个警告级别的确切标志特定于编译器,但对于大多数常见编译器,有一个近似表。

警告级别 GCC/Clang MSVC
0
1 -Wall /W2
2 -Wall -Wextra /W3
3 -Wall -Wextra -Wpedantic /W4
everything -Weverything /Wall

Clang 的 -Weverything 在 GCC 上通过传递所有已知警告标志来模拟。

vsenv 的详细信息

--vsenv 参数自 0.60.0 版本起受支持,-Dvsenv=true 语法自 1.1.0 版本起受支持。

0.59.0 版本起,meson 会在 Windows 上自动为其所有子命令激活 Visual Studio 环境,但前提是未找到其他编译器(例如,gccclang),如果 Visual Studio 激活失败,则会静默继续。

vsenv 选项设置为 true 会强制激活 Visual Studio,即使找到其他编译器也是如此。它还会在激活失败时使 Meson 中断并显示错误消息。

当使用 vs 后端时,vsenv 默认情况下为 true

default_both_libraries 的详细信息

1.6.0 版本起,您可以选择使用 both_libraries 对象时选择的默认库类型。它可以是“shared”(默认值,与以前的 meson 版本兼容)、“static”或“auto”。对于 auto,将使用 default_library 选项的值,除非它是“both”,在这种情况下将改用“shared”。

default_both_libraries 为“auto”时,在 both_libraries() 中传递 both_libs 依赖项将使用静态库链接静态依赖项,使用共享库链接共享依赖项。

基本选项

这些选项的设置方式与通用选项相同,可以使用 -Doption=value 或在 meson.build 中的 project()default_options 中设置它们。但是,它们不会显示在 meson setup --help 的输出中,因为它们取决于当前平台和将选择的编译器。查看它们的唯一方法是设置一个 builddir,然后在不带选项的情况下对其运行 meson configure

以下选项可用。请注意,它们可能并非在所有平台上或使用所有编译器都可用

选项 默认值 可能的值 描述
b_asneeded true, false 在链接时使用 -Wl,--as-needed
b_bitcode true, false 嵌入 Apple 位码,见下文
b_colorout always auto, always, never 使用彩色输出
b_coverage true, false 启用覆盖范围跟踪
b_lundef true, false 链接时不允许未定义的符号
b_lto true, false 使用链接时优化
b_lto_threads 0 任何整数* 为 lto 使用多线程。(在 0.57.0 版本中添加)
b_lto_mode default default, thin 在 lto 模式之间选择,thin 和 default。(在 0.57.0 版本中添加)
b_thinlto_cache true, false 启用 LLVM 的 ThinLTO 缓存,以加快增量构建速度。(在 0.64.0 版本中添加)
b_thinlto_cache_dir (内部构建目录) true, false 指定存储 ThinLTO 缓存对象的位置。(在 0.64.0 版本中添加)
b_ndebug true, false, if-release 禁用断言
b_pch true, false 使用预编译头文件
b_pgo off off, generate, use 使用配置文件引导优化
b_sanitize none 见下文 要使用的代码清理器
b_staticpic true, false 将静态库构建为位置无关的库
b_pie true, false 构建位置无关的可执行文件(自 0.49.0 版本起)
b_vscrt from_buildtype none, md, mdd, mt, mtd, from_buildtype, static_from_buildtype 要使用的 VS 运行时库(自 0.48.0 版本起)(static_from_buildtype 自 0.56.0 版本起)

b_sanitize 的值可以是:noneaddressthreadundefinedmemoryleakaddress,undefined,但请注意,某些编译器可能不支持所有这些值。例如,Visual Studio 仅支持地址清理器。

* < 0 表示禁用,== 0 表示自动选择,> 0 设置要使用的特定数字

LLVM 支持 thin lto,有关更多讨论,请参阅 LLVM 的文档

b_vscrt 的默认值为 from_buildtype。以下表格在内部使用,用于根据 buildtype 选项的值选择用于 from_buildtypestatic_from_buildtype (自 0.56 版本起) 的 CRT 编译器参数

buildtype from_buildtype static_from_buildtype
debug /MDd /MTd
debugoptimized /MD /MT
release /MD /MT
minsize /MD /MT
自定义 错误! 错误!

关于 Apple Bitcode 支持的说明

b_bitcode 将在编译时传递 -fembed-bitcode,并在链接时传递 -Wl,-bitcode_bundle。这些选项与 b_asneeded 不兼容,因此该选项将被静默禁用。

shared_module() 将不会嵌入 bitcode,因为 -Wl,-bitcode_bundle-bundle-Wl,-undefined,dynamic_lookup 不兼容,而这些选项对于共享模块的正常工作是必要的。

编译器选项

与上面的基本选项相同。

以下是可用的选项。可以通过将 -Doption=value 传递给 meson 来设置它们。请注意,选项本身及其可以接受的值将取决于目标平台或使用的编译器。

选项 默认值 可能的值 描述
c_args 自由格式的逗号分隔列表 要使用的 C 编译参数
c_link_args 自由格式的逗号分隔列表 要使用的 C 链接参数
c_std none none, c89, c99, c11, c17, c18, c2x, c23, gnu89, gnu99, gnu11, gnu17, gnu18, gnu2x, gnu23 要使用的 C 语言标准
c_winlibs 见下文 自由格式的逗号分隔列表 要链接的标准 Windows 库
c_thread_count 4 整数,≥ 0 使用 emcc 时使用线程时要使用的线程数量
cpp_args 自由格式的逗号分隔列表 要使用的 C++ 编译参数
cpp_link_args 自由格式的逗号分隔列表 要使用的 C++ 链接参数
cpp_std none none, c++98, c++03, c++11, c++14, c++17, c++20
c++2a, c++1z, gnu++03, gnu++11, gnu++14, gnu++17, gnu++1z,
gnu++2a, gnu++20, vc++14, vc++17, vc++20, vc++latest
要使用的 C++ 语言标准
cpp_debugstl true, false C++ STL 调试模式
cpp_eh default none, default, a, s, sc C++ 异常处理类型
cpp_rtti true, false 是否启用 RTTI(运行时类型识别)
cpp_thread_count 4 整数,≥ 0 使用 emcc 时使用线程时要使用的线程数量
cpp_winlibs 见下文 自由格式的逗号分隔列表 要链接的标准 Windows 库
fortran_std none [none, legacy, f95, f2003, f2008, f2018] 要使用的 Fortran 语言标准
cuda_ccbindir 文件系统路径 要使用的 CUDA 非默认工具链目录(-ccbin)(在 0.57.1 中添加)

c_winlibscpp_winlibs 的默认值采用编译器特定的参数形式,但库为:kernel32, user32, gdi32, winspool, shell32, ole32, oleaut32, uuid, comdlg32, advapi32.

所有这些 <lang>_* 选项都是针对每台机器指定的。有关如何在交叉构建中执行此操作,请参见下面的 指定每台机器的选项 部分。

当使用 MSVC 时,cpp_eh=[value] 将导致传递 /EH[value]。神奇值 none 将转换为 s-c- 以禁用异常。自 0.51.0 起 default 转换为 sc。当使用 gcc 风格的编译器时,不会传递任何内容(允许异常工作),而 cpp_eh=none 会传递 -fno-exceptions

自 0.54.0 起 <lang>_thread_count 选项可用于控制在使用 emcc 时传递给 -s PTHREAD_POOL_SIZE 的值。其他 c/c++ 编译器不支持此选项。

自 0.63.0 起 所有编译器选项都可以针对每个子项目设置,有关默认值如何从主项目继承的详细信息,请参见 此处。例如,当主项目需要 C++11,但子项目需要 C++14 时,这很有用。子项目的 default_options 中的 cpp_std 值现在将被尊重。

自 1.3.0 起 c_stdcpp_std 选项现在接受值列表。更喜欢 GNU C 但可以回退到 ISO C 的项目现在可以设置例如 default_options: 'c_std=gnu11,c11',它将在可用时使用 gnu11,但在其他情况下回退到 c11。只有当当前编译器不支持任何值时才会出现错误。同样,可以利用 c++17 但仍然可以使用 c++11 构建的项目可以设置 default_options: 'cpp_std=c++17,c++11'。这使我们能够弃用 MSVC 编译器中的 gnuXX 值。这意味着 default_options: 'c_std=gnu11' 现在将在 MSVC 中打印警告,但会回退到 c11。如果至少有一个值有效,则不会打印警告,例如 default_options: 'c_std=gnu11,c11'。将来,该弃用警告将变成硬错误,因为 c_std=gnu11 应该意味着需要 GNU,例如对于不能使用 MSVC 构建的项目。

指定每台机器的选项

自 0.51.0 起,某些选项是针对每台机器指定的,而不是针对所有机器配置全局指定的。在选项前加 build. 仅影响构建机器配置,而保留不带前缀的选项仅影响主机配置。例如

  • build.pkg_config_path 控制 pkg-config 将搜索的路径,用于 native: true(构建机器)依赖项。

  • pkg_config_path 控制 pkg-config 将搜索的路径,用于 native: false(主机机器)依赖项。

这对于交叉构建很有用。在原生构建中,构建机器和主机机器相同,仅使用不带前缀的选项就足够了。

在 0.51.0 之前,这些选项仅在命令行上指定时影响原生构建,因为没有 build. 前缀。交叉文件中 [properties] 部分中具有类似名称的字段会影响交叉编译器,但代码路径相当不同,允许行为差异出现。

指定每个子项目的选项

自 0.54.0 起 default_librarywerror 内置选项可以针对每个子项目定义。例如,当在主项目中构建共享库并在子项目中静态链接时,或者当主项目必须在没有警告的情况下构建,但某些子项目不能时,这很有用。

大多数情况下,这将在父项目中使用,通过设置子项目的 default_options(例如 subproject('foo', default_options: 'default_library=static')),或者通过用户通过命令行使用:-Dfoo:default_library=static

按以下顺序覆盖该值

  • 父项目中的值
  • 如果设置了子项目的 default_options 中的值
  • 如果设置了 subproject()default_options 中的值
  • 如果设置了命令行中的值

自 0.56.0 起 warning_level 也可以针对每个子项目定义。

模块选项

一些 Meson 模块有内置选项。可以通过在选项前添加模块名称来设置它们:-D<module>.<option>=<value>(例如 -Dpython.platlibdir=/foo)。

Pkgconfig 模块

选项 默认值 可能的值 描述
relocatable true, false 以可重定位的方式生成 pkgconfig 文件(自 0.63.0 起)

自 0.63.0 起 pkgconfig.relocatable 选项由 pkgconfig 模块使用,即 pkg.generate(),并影响生成的 pkgconfig 文件中 prefix(不要与 安装前缀 混淆)的设置方式。当它为 true 时,prefix 将相对于 install_dir,这允许 pkgconfig 文件移动并在仍然工作,只要相对路径没有断开。通常,这允许将整个已安装的包放置在系统上的任何位置,并仍然可以作为依赖项正常工作。当它设置为 false 时,prefix 将与安装前缀相同。

如果 pkgconfig.relocatabletrue 并且为生成的 pkgconfig 文件指定的 install_dir 指向安装前缀之外,则将引发错误。例如:如果安装前缀为 /usr 并且 pkgconfig 文件的 install_dir/var/lib/pkgconfig

Python 模块

选项 默认值 可能的值 描述
bytecompile 0 -1 到 2 之间的整数 要使用的字节码优化级别(自 1.2.0 起)
install_env prefix {auto,prefix,system,venv} 要安装到的 Python 环境(自 0.62.0 起)
platlibdir 目录路径 特定于站点的特定于平台的文件的目录(自 0.60.0 起)
purelibdir 目录路径 特定于站点的非特定于平台的文件的目录(自 0.60.0 起)
allow_limited_api true, false 禁用项目范围内的 Python Limited API 使用(自 1.3.0 起)

自 0.60.0 起 python.platlibdirpython.purelibdir 选项由 python 模块方法 python.install_sources()python.get_install_dir() 使用;Meson 尝试检测正确的安装路径并默认使它们相对于安装 prefix,这通常会导致解释器找不到已安装的 python 模块,除非 prefix 在 Linux 上为 /usr,或者,例如,在 Windows 上为 C:\Python39。这些选项可以是 prefix 之外的绝对路径。

自 0.62.0 起 python.install_env 选项用于检测正确的安装路径。设置为 system 将避免使路径相对于 prefix,而是直接使用所选 python 解释器的全局站点包,即使它是 venv 也是如此。设置为 venv 将改为使用找到的 python 安装所在的 virtualenv 的路径(如果它不是 virtualenv,则会失败)。设置为 auto 将检查找到的安装是否为 virtualenv,并根据需要使用 venvsystem(但从不使用 prefix)。请注意,Conda 环境被视为 system。此选项与 platlibdir/purelibdir 相互排斥。

为了向后兼容,默认 install_envprefix

自 1.2.0 起 python.bytecompile 选项可用于启用编译 python 字节码。字节码有 3 个优化级别

  • 0,没有优化的字节码
  • 1,有一些优化的字节码
  • 2,有一些更多优化的字节码

对此,Meson 添加了级别 -1,即完全不尝试编译字节码。

自 1.3.0 起 python.allow_limited_api 选项会影响是否尊重 extension_module 方法的 limited_api 关键字参数。如果设置为 false,则会禁用 limited_api 参数的效果。

搜索结果为