内置选项
Meson 提供两种类型的选项:构建文件提供的构建选项 和内置选项,这些选项是通用选项、基本选项、编译器选项之一。
通用选项
所有这些选项可以通过将 -Doption=value
传递给 meson
(又名 meson setup
)来设置,或者通过在 meson.build
中的 project()
的 default_options
中设置它们来设置。某些选项还可以通过 --option=value
或 --option value
设置 -- 运行 meson setup --help
将显示一个列表。
出于兼容性原因,--warnlevel
是 warning_level
选项的命令行参数。
它们也可以在设置后使用 meson configure -Doption=value
进行编辑。
安装选项通常相对于前缀,但不能依赖于此,因为它们在以下情况下可以是绝对路径
- 当前缀为
/usr
时:sysconfdir
默认值为/etc
,localstatedir
默认值为/var
,sharedstatedir
默认值为/var/lib
- 当前缀为
/usr/local
时:localstatedir
默认值为/var/local
,sharedstatedir
默认值为/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
选项,也可以设置 optimization
和 debug
选项,这些选项可以对同一项进行更精细的控制。无论您决定使用哪个,另一个选项将根据它推断出来。例如,-Dbuildtype=debugoptimized
等同于 -Ddebug=true -Doptimization=2
,反之亦然。此表记录了双向映射
buildtype | debug | optimization |
---|---|---|
plain | 否 | plain |
debug | 是 | 0 |
debugoptimized | 是 | 2 |
release | 否 | 3 |
minsize | 是 | s |
debug
和 optimization
的所有其他组合都将 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 环境,但前提是未找到其他编译器(例如,gcc
或 clang
),如果 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
的值可以是:none
、address
、thread
、undefined
、memory
、leak
、address,undefined
,但请注意,某些编译器可能不支持所有这些值。例如,Visual Studio 仅支持地址清理器。
* < 0 表示禁用,== 0 表示自动选择,> 0 设置要使用的特定数字
LLVM 支持 thin
lto,有关更多讨论,请参阅 LLVM 的文档
b_vscrt
的默认值为 from_buildtype
。以下表格在内部使用,用于根据 buildtype
选项的值选择用于 from_buildtype
或 static_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_winlibs
和 cpp_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_std
和 cpp_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_library
和 werror
内置选项可以针对每个子项目定义。例如,当在主项目中构建共享库并在子项目中静态链接时,或者当主项目必须在没有警告的情况下构建,但某些子项目不能时,这很有用。
大多数情况下,这将在父项目中使用,通过设置子项目的 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.relocatable
为 true
并且为生成的 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.platlibdir
和 python.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,并根据需要使用 venv
或 system
(但从不使用 prefix
)。请注意,Conda 环境被视为 system
。此选项与 platlibdir
/purelibdir
相互排斥。
为了向后兼容,默认 install_env
为 prefix
。
自 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
参数的效果。
搜索结果为