Meson 0.40.0 版本新特性全解析:从 VS2017 支持到依赖获取方法定制

📅 发布时间:2026/10/8 7:54:51
Meson 0.40.0 版本新特性全解析:从 VS2017 支持到依赖获取方法定制
构建工具【免费下载链接】mesonThe Meson Build System项目地址https://gitcode.com/gh_mirrors/me/meson点击查看免费下载导读本文基于 Meson 构建系统 0.40.0 版本的官方发布说明docs/markdown/Release-notes-for-0.40.0.md系统梳理该版本引入的核心新特性并结合当前仓库源码逐一验证底层实现。阅读本文后你将掌握如何在 Visual Studio 后端使用生成器输出、用compute_int与get_define在配置期求值、用wrap-mode控制依赖下载、用override_options按目标覆盖全局选项、用link_whole整库链接、按输出分别指定安装目录以及如何为依赖显式指定获取方法等实战能力。一、生成器输出可用于 VS 后端的 custom target在 Ninja 后端中生成器generator产生的输出早已可以作为自定义目标custom target的输入使用。0.40.0 将这一能力扩展到了 Visual Studio 后端现在两种后端行为一致。这意味着使用--backendvs2017、--backendvs2019等 VS 系列后端构建项目时custom_target()可以放心地引用generator.process()生成的中间文件不再受后端差异限制。从源码结构看各 VS 后端统一继承自 vs2010backend.py 中的Vs2010Backend基类后续的 VS2012/2013/2015/2017/2019/2022/2026 后端见该文件 L47-L70都复用同一套生成器与自定义目标处理逻辑因此该特性对所有 VS 版本后端同时生效。二、编译器对象的compute_int方法0.40.0 为编译器对象新增了compute_int()方法用于在配置期直接计算一个 C/C或 Fortran表达式的整数值cc meson.get_compiler(c) two cc.compute_int(1 1) # A very slow way of adding two numbers.底层实现原理从源码看该方法的基类声明位于 mesonbuild/compilers/compilers.py而 C 系编译器的实际实现在 mesonbuild/compilers/mixins/clike.pyMeson 会生成一段包含stddef.h与stdio.h的 C 测试程序用printf(%ld\n, (long)(expression))输出表达式求值结果再解析程序输出得到整数值。Fortran 编译器mesonbuild/compilers/fortran.py则生成program test并用print (i0), expression输出。因此compute_int实际执行的是编译并运行一小段代码而非纯语法解析——这正是文档注释中一种非常慢的加法的由来。该方法常用于在配置期推导平台相关的常量例如cc.compute_int(sizeof(void*))或架构位宽判断。三、Visual Studio 2017 支持与通用 VS 后端0.40.0 带来了两项后端能力专门的--backendvs2017通用的--backendvs自动探测当前环境中激活的 VS 版本。通用后端的版本分派逻辑体现在 vs2010backend.py依次尝试导入Vs2012Backend、Vs2013Backend、Vs2015Backend、Vs2017Backend、Vs2019Backend、Vs2022Backend、Vs2026Backend并返回首个可用的后端类。这使得用户无需关心本机安装的具体 VS 版本一条命令即可完成工程文件生成。四、git submodule 子项目的自动初始化如果subprojects/目录下的某个子目录是 git submodule且构建文件引用了它Meson 会自动初始化该 submodule——无需提供 wrap 文件因为 git 本身已包含全部所需信息。源码级验证该逻辑实现在 mesonbuild/wrap/wrap.py 的resolve_git_submodule()中具体判断流程为检查 git 是否安装GIT变量并确认目录存在通过git rev-parse确认处于 git 仓库中用git submodule status .查询 submodule 状态前缀submodule 可能已过期输出警告但仍继续前缀U存在合并冲突直接抛出异常前缀-未初始化自动执行git submodule update --init .前缀 已初始化但内容可能不完整执行git submodule update .与git checkout .补齐空输出普通目录而非 submodule返回 false。该机制由WrapResolver在解析子项目时自动调用见 wrap.py对用户完全透明。五、Wrap 的禁止下载模式wrap-mode对于发行版打包者和需要严格禁止配置/构建期间联网的场景0.40.0 新增了wrap-mode选项meson setup builddir --wrap-modenodownload当设置为nodownload后任何尝试下载依赖项目的操作都会直接报错。全部取值与语义从 mesonbuild/wrap/init.py 中WrapMode枚举及其注释可以看到完整的模式语义取值含义default默认行为允许下载nofallback禁止为dependency(..., fallback: ...)下载 wrap不执行回退下载nodownload禁止所有subproject()调用的下载包括 fallback即既不下载也不回退forcefallback忽略系统提供的依赖强制使用 fallbacknopromote不自动提升子项目为 copylib注释还给出了选型建议从 release 源码包构建时上游通常已附带全部源码可安全使用nodownload从 git 仓库构建时则建议使用nofallback以便 copylib 类 wrap 仍能按需下载。执行层面wrap.py 在WrapMode.nodownload下直接抛出Automatic wrap-based subproject downloading is disabled错误。另外注意wrap-mode不影响 git submodule 形式的子项目——注释明确说明这些 submodule 仅在 git 仓库中可用几乎总是应当被下载相关判断见 mesonbuild/wrap/wrap.py 上方逻辑。六、按目标覆盖选项override_options构建目标新增了override_options关键字参数允许针对单个目标覆盖 Meson 内置选项。例如某个目标已知无法在-Werror下编译可以这样做executable(foo, foo.c, override_options : [werrorfalse])需要特别注意的是它只影响来自 Meson 自身的选项语言标准、unity 构建等不影响项目自定义选项即在meson_options.txt中定义的 option。从实现看override_options贯穿解释层与后端其类型定义与校验位于 mesonbuild/interpreter/type_checking.py 与 mesonbuild/interpreter/kwargs.py目标对象在 mesonbuild/build.py 中保存覆盖值而后端在展开编译参数时例如 mesonbuild/backend/backends.py 的选项读取路径会优先采用目标级覆盖结果从而实现全局配置 目标级豁免的灵活组合。七、编译器对象get_define方法get_define()返回指定预处理宏的字符串值cc meson.get_compiler(c) one cc.get_define(__linux__) # 在 Linux 主机上返回 1如果宏未定义则返回None。该方法对跨平台特性探测非常实用——例如在配置期区分_WIN32、__APPLE__等平台宏。实现细节实现在 mesonbuild/compilers/mixins/clike.pyMeson 生成如下预处理代码用两个特殊分隔符夹住目标宏#define MESON_GET_DEFINE_DELIMITER_START #ifdef __linux__ # define __linux__ MESON_GET_DEFINE_UNDEFINED_SENTINEL #endif MESON_GET_DEFINE_DELIMITER_START__linux__MESON_GET_DEFINE_DELIMITER_END以CompileCheckMode.PREPROCESS模式交给编译器预处理再解析分隔符之间的文本即为宏值。注意代码中先用#ifndef ... #define dname MESON_GET_DEFINE_UNDEFINED_SENTINEL兜底未定义宏会落入哨兵值并被识别为None。同时该方法支持结果缓存disable_cache参数与extra_args/dependencies参数保证与其他编译器检测函数一致的接口风格。基类声明见 mesonbuild/compilers/compilers.py。八、Cygwin 支持0.40.0 起 Meson 可在 Cygwin 环境下正常工作并已加入 CI 测试矩阵见仓库 ci 目录下的持续集成配置。这意味着在 Windows 上通过 Cygwin 使用 POSIX 风格工具链的开发者可以直接用 Meson 构建项目。九、多个安装目录按输出分别指定此前 custom target 的多个输出只能安装到同一目录。0.40.0 起可以为每个输出分别指定安装目录custom_target(two_out, output : [diff.h, diff.sh], command : [creator, OUTDIR], install : true, install_dir : [dir1, dir2])输出列表与install_dir列表按位置一一对应为了向后兼容与简洁若只指定一个目录则所有输出都安装到该目录该特性在源码中以FeatureNew标注自 0.40.0 引入见 mesonbuild/interpreter/interpreter.py。Vala 目标的扩展用法同一能力也适用于 Vala 构建目标。例如把 valac 构建的共享库、生成的头文件和生成的 VAPI 分别安装到默认位置shared_library(valalib, mylib.vala, install : true, install_dir : [true, true, true])规则为true表示安装到该类型的默认目录字符串表示安装到自定义目录false表示不安装。三个元素分别对应共享库、生成头文件与生成 VAPI。若像旧版那样只传一个字符串则只会安装库本身——这是一个完全向后兼容的变更。十、显式指定依赖获取方法method关键字某些依赖有多种提供方式例如 Qt 既可以通过pkg-config检测也可以通过qmake检测。此前 Meson 依靠启发式算法选择偶尔会选错。0.40.0 起可用method关键字显式指定qt5_dep dependency(qt5, modules : core, method : qmake)method的取值由DependencyMethods枚举定义如auto、pkgconfig、qmake、system、config-tool等默认值为AUTO相关解析逻辑见 mesonbuild/dependencies/base.py 与 mesonbuild/dependencies/detect.py。以 Qt 为例mesonbuild/dependencies/qt.py 中会按指定的qmake路径执行检测从而精确控制依赖的来源避免启发式误判。十一、整库链接link_whole静态库的默认链接行为会丢弃未被直接引用的符号这可能丢失导出符号。多数编译器支持whole archive链接把静态库的全部符号与代码都纳入最终产物。0.40.0 通过link_whole关键字暴露该能力shared_library(foo, foo.c, link_whole : some_static_library)可用于将静态库整体并入共享库或可执行文件典型场景是确保插件/导出符号不丢失注意Visual Studio 编译器仅在 VS2015 及更新版本支持该功能。后端实现佐证后端在生成链接命令时专门处理link_whole_targetsNinja 后端在 mesonbuild/backend/ninjabackend.py 的get_link_whole_args()中收集目标的link_whole_targets并通过linker.get_link_whole_for()生成平台相关的整库链接参数例如 GCC/Clang 的-Wl,--whole-archive ... -Wl,--no-whole-archiveMSVC 的/WHOLEARCHIVEVS 后端在 mesonbuild/backend/vs2010backend.py 中同样将link_whole_targets中的静态库标记为整库链接。十二、Unity 构建仅用于子项目此前 unity 构建要么对所有目标生效、要么全部关闭。0.40.0 起可将unity选项设为subprojects让更新频率低的子项目启用 unity 合并编译而频繁改动的主项目保持普通编译从而在享受 unity 构建加速的同时减少主项目变更引发的整体重编译meson setup builddir -Dunitysubprojects该选项的类型定义见 mesonbuild/options.pyUserComboOption(unity, Unity build, off, choices[on, off, subprojects])。解释器在判断某目标是否采用 unity 编译时会依据unity subprojects且目标属于子项目tobj.subproject ! 来判定见 mesonbuild/interpreter/interpreterobjects.py。十三、脚本可用的MESONINTROSPECT环境变量Meson 运行脚本时除了设置MESON_SOURCE_ROOT等变量外现在还会设置MESONINTROSPECT环境变量保证它指向正确的mesonintrospect脚本——这对于从 git 未安装状态运行 Meson或PATH配置不正确的情况尤为重要。具体地以下 Meson 函数会设置该变量meson.add_install_script()meson.add_postconf_script()run_command()run_target()从源码看该变量在多个执行路径中被注入环境后端在生成运行目标命令时设置MESONINTROSPECT: self.get_introspect_command()mesonbuild/backend/backends.py解释器层在构造脚本执行环境时以shlex.quote转义后写入mesonbuild/interpreter/interpreterobjects.py安装阶段mesonbuild/minstall.py同样在meson.add_install_script()执行环境中设置该变量。因此自定义脚本内部可以放心地通过os.environ[MESONINTROSPECT]调用 introspection 接口获取目标的源文件、编译参数等构建信息。小结Meson 0.40.0 是一个面向后端完善与配置灵活性的版本Visual Studio 生态获得了 VS2017 支持、通用vs后端与生成器输出的一致处理配置期编程能力通过compute_int、get_define得到增强依赖管理在wrap-mode、method与 git submodule 自动初始化三个维度上更加可控构建目标层面新增override_options、link_whole、多安装目录与unitysubprojects等实用特性同时补齐了 Cygwin 支持与MESONINTROSPECT环境变量。上述全部特性在当前仓库源码中均有对应实现可查证相关代码路径已在各小节中给出便于读者深入研读。赞分享构建工具【免费下载链接】mesonThe Meson Build System项目地址https://gitcode.com/gh_mirrors/me/meson点击查看免费下载相关推荐Slang 诊断目录测试包为每个诊断代码生成 DIAGNOSTIC_TEST 的系统化方案Slang 诊断目录测试包为每个诊断代码生成 DIAGNOSTIC_TEST 的系统化方案 导读 Slang 编译器将用户可见的诊断错误、警告、提示组织成构建工具Meson 依赖系统完全指南dependency() 的查找机制、检测方法与内置特殊依赖详解Meson 依赖系统完全指南dependency 的查找机制、检测方法与内置特殊依赖详解 导读 本文围绕 Meson 构建系统中 dependency 函数及构建工具MOOTDXPython量化投资的终极通达信数据接口完整指南MOOTDXPython量化投资的终极通达信数据接口完整指南 MOOTDX是一个专为Python量化投资设计的开源数据接口它提供了简单高效的通达信数据访问能金融科技数据分析上一篇3分钟上手Webhook.site让HTTP测试变得如此简单下一篇RxJavaSample项目实战如何用响应式编程实现高效的图片加载与处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考