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),仅供参考

相关新闻

深入解读 @automattic/calypso-build:WordPress.com 的统一前端构建工具链

深入解读 @automattic/calypso-build:WordPress.com 的统一前端构建工具链

前端CMS 【免费下载链接】wp-calypso The JavaScript and API powered WordPress.com 项目地址: https://gitcode.com/gh_mirrors/wp/wp-calypso 点击查看 免费下载 automattic/calypso-build 是 Automattic 在 wp-calypso 仓库中维护的一套 Webpack/Babel/PostCSS…

2026/10/9 9:55:06 阅读更多 →
抖音矩阵云混剪系统源码:多账号批量出片与去重调度实战

抖音矩阵云混剪系统源码:多账号批量出片与去重调度实战

简介:这份资源是面向短视频运营者与PHP开发者的抖音矩阵云混剪系统源码,聚焦多平台、多账号的一站式内容管理与发布场景。它试图解决矩阵账号切换繁琐、内容产出效率低、客户线索分散等痛点,适合具备一定PHP基础、希望自建或二次开发矩阵管理…

2026/10/9 9:55:23 阅读更多 →
Flagsmith 自托管环境变量完全参考指南:API 与前端配置速查手册

Flagsmith 自托管环境变量完全参考指南:API 与前端配置速查手册

后端前端 【免费下载链接】flagsmith Flagsmith is an open-source feature flag platform with remote config, experimentation, and self-hosted or cloud deployment options. 项目地址: https://gitcode.com/gh_mirrors/fl/flagsmith 点击查看 免费下载 本指南…

2026/10/8 7:54:22 阅读更多 →

最新新闻

智能客服系统落地指南:从FAQ到RAG的工程实践与避坑

智能客服系统落地指南:从FAQ到RAG的工程实践与避坑

简介:面向政府、企业及金融机构客服系统规划者、产品经理和技术人员的智能客服系统解决方案PDF文档,重点解决移动互联网时代全渠道服务响应慢、知识库构建周期长、人工客服成本高等难题。内容基于中科汇联三千余家行业客户的交付运维经验,系统…

2026/10/9 9:55:18 阅读更多 →
2024五一数学建模C题:基于LSTM与XGBoost的用户行为预测建模实战

2024五一数学建模C题:基于LSTM与XGBoost的用户行为预测建模实战

简介:这是一份2025年五一数学建模竞赛C题的完整参赛作品,内容聚焦社交媒体平台用户行为预测与内容推荐优化。作者基于2024年7月中旬的用户与博主互动数据,系统求解四个子问题:用LSTM模型预测博主新增关注数;用LSTM结合…

2026/10/9 9:55:18 阅读更多 →
用友T6凭证批量导入全流程:解决辅助核算导入失败问题

用友T6凭证批量导入全流程:解决辅助核算导入失败问题

简介:本资源是一份面向企业财务信息化人员、用友T6系统实施顾问及ERP二次开发工程师的实操型技术指南,聚焦解决多源电子凭证批量导入难题,尤其适用于需处理带供应商往来等辅助核算的复杂凭证场景。文档以完整流程为主线,覆盖基础数…

2026/10/9 9:55:18 阅读更多 →
k-means-LSTM组合预测:多输入多输出时序建模实战

k-means-LSTM组合预测:多输入多输出时序建模实战

简介:本资源是一份面向具备Python编程与机器学习基础的研发人员、数据科学家及进阶学习者的时间序列预测实战项目,聚焦k均值聚类与LSTM深度结合的多输入多输出组合建模方法,有效提升能源管理、气象预测、金融分析等场景下的预测精度与鲁棒性。…

2026/10/9 9:55:18 阅读更多 →
符号回归实战:用遗传编程从噪声数据中发现可解释数学公式

符号回归实战:用遗传编程从噪声数据中发现可解释数学公式

简介:本资源是一份面向计算机科学研究人员、机器学习爱好者及进化计算初学者的符号回归实践指南,聚焦遗传编程(GP)在非线性数学表达式发现与建模中的系统实现与优化。内容涵盖GP基础框架搭建、精英主义策略、自定义遗传算子等增强…

2026/10/9 9:55:18 阅读更多 →
php正则表达式学习笔记

php正则表达式学习笔记

前言 先说一件容易混淆的事:PHP 里的「正则表达式」其实分两套历史,一套是已经消失的 POSIX 扩展,一套是现在唯一在用的 PCRE。POSIX 那套函数(ereg()、eregi()、ereg_replace()、eregi_replace()、split()、spliti()、sql_regcas…

2026/10/9 9:54:17 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →