
构建工具【免费下载链接】mesonThe Meson Build System项目地址https://gitcode.com/gh_mirrors/me/meson点击查看免费下载本文基于 Meson 构建系统的 0.55.0 版本发布说明系统梳理该版本在meson compile目标选择、gtest 测试协议与 JUnit 输出、rpath 处理、Wrap 依赖回退、机器文件常量、CMake 子项目配置等方面的核心改进并结合 发布说明原文 与当前仓库源码深入讲解每个新特性的用法、适用场景和底层实现逻辑。读完本文你将能够熟练运用 0.55.0 引入的编译目标语法、回退机制与跨编译辅助能力并理解这些能力在 Meson 源码中的落点。1.meson compile支持指定构建目标0.55.0 之前meson compile只能整包构建从本版本开始可以直接传入目标名只构建所需目标。1.1 目标语法用法为meson compile [TARGET [TARGET...]]其中TARGET的完整语法为[PATH/]NAME[:TYPE]NAME来自meson.build的目标名例如executable(foo, ...)对应fooPATH目标相对于根meson.build的路径。注意定义在根meson.build中的目标其相对路径写作./TYPE目标类型如shared_library、executable、static_library等。PATH与TYPE都可以省略前提是省略后TARGET仍能唯一定位目标。以下述代码为例shared_library(foo, ...) static_library(foo, ...) executable(bar, ...)可以分别或合并执行meson compile foo:shared_library foo:static_library bar1.2 底层实现如何解析目标名目标解析逻辑集中在 mesonbuild/mcompile.py。其核心是ParsedTargetName类mcompile.py#L52-L95先用rsplit(:, 1)切出TYPE并校验合法性再用rsplit(/, 1)切出PATH与NAME最后对NAME再次rsplit(., 1)得到可选的base_name与suffix。_is_valid_type中允许的类型集合包括executable、static_library、shared_library、shared_module、custom、alias、run、jarmcompile.py#L82-L95。解析后的目标需要与构建目录中meson-info/intro-targets.json的 introspection 数据比对parse_introspect_datamcompile.py#L37-L50。当目标不唯一时工具会抛出 ambiguous name 错误并给出建议写法- ./subdir/foo:shared_library即提示你补充PATH与TYPE来消歧。各后端的差异也在这里体现Ninja 后端把 introspection 数据中的输出文件相对路径作为实际构建参数generate_target_names_ninjamcompile.py#L151-L157VS 后端则转换成msbuild -target:...语法generate_target_name_vsmcompile.py#L190-L201且对run类型目标在 VS 后端下限制一次只能指定一个mcompile.py#L216-L227。1.3 向后端透传参数0.55.0 同时支持向后端透传参数meson compile [--vs-argsargs] [--ninja-argsargs]--ninja-args NINJA_ARGS仅对 Ninja 后端生效透传给ninja--vs-args VS_ARGS仅对 VS 后端生效透传给msbuild--xcode-args也在同批实现中提供给 xcode 后端。参数采用逗号分隔字符串语法。例如$ meson compile --ninja-args-n,-d,explain会为 ninja 附加-n、-d与explain三个参数。若参数值本身包含逗号或空格需要用 shell 引号包裹列表形式$ meson compile --ninja-args[a,b, c d]命令行解析处可参见 mcompile.py#L331-L348array_arg通过listify_array_value把字符串展开为参数数组mcompile.py#L27-L28。注意TARGET与--clean不能同时使用mcompile.py#L353-L354。2. gtest 专属测试协议与 JUnit 输出2.1 gtest 协议由于 gtestGoogle Test在 C/C 开发者中广泛使用0.55.0 为test()增加了protocol : gtest支持。启用后Meson 会向 gtest 注入--gtest_outputxml:...参数mesonbuild/mtest.py#L1661-L1664让 gtest 自行输出 JUnit 格式的结果Meson 再读取这些 JUnit 并合并进自己生成的 JUnit 文件中。在JunitBuilder.log中可以看到合并逻辑gtest 注入的 testsuite 会被加上项目名.测试名.套件名前缀同时清理 gtest 产生的非法属性result、timestamp、file、line等保证 JUnit 格式合法mesonbuild/mtest.py#L863-L880。2.2 JUnit 结果文件0.55.0 起meson test会把全部测试结果输出为 JUnit 兼容 XML位于meson-logs/testlog.junit.xml。底层实现是JunitBuilder类mesonbuild/mtest.py#L840-L855由于 JUnit 要求在根元素及各 testsuite 上预先统计 tests/errors/failures/skipped 总数、无法流式输出该类会先逐条记录每个测试用例再统一计算元数据写盘。多结果测试如 TAP 协议会以项目名.测试名作为独立 suite 记录每个子结果普通退出码测试则归入以项目名命名的 suite从而把子项目测试与根项目测试分开排序。JunitBuilder被挂接在 mtest.py#L2113 的 logger 链上文件名前缀即testlog.junit。3. rpath 清理更精确在 Linux 类系统上Meson 会先为构建树中的可执行程序加入 rpath 条目以便直接在构建目录运行安装时再移除这些仅构建期使用的条目。但 rpath 也可能经由LDFLAGS和.pc文件进入二进制旧版本会误删这些用户自带的 rpath。0.55.0 起清理逻辑更加谨慎只移除 Meson 自己加入的构建期路径。实现上链接器在build_rpath_args中返回两个值实际传入的-rpath参数以及需要移除的目录集合rpath_dirs_to_remove例如 mesonbuild/linkers/linkers.py#L784-L819。Ninja 后端通过get_build_rpath_args获取并记录该集合mesonbuild/backend/ninjabackend.py#L3812-L3825安装阶段据此精确移除对应条目避免波及用户经LDFLAGS/pkg-config 传入的 rpath。4. 机器文件常量与表达式4.1[constants]节Native 与 cross 机器文件machine file现在支持字符串/列表拼接和/路径连接。[constants]节中定义的条目可以在任何其他节中使用其他节中定义的条目只能在同一节内、且在其定义之后使用。示例[constants] toolchain /toolchain common_flags [--sysroot toolchain /sysroot] [properties] c_args common_flags [-DSOMETHING] cpp_args c_args [-DSOMETHING_ELSE] [binaries] c toolchain /gcc这里的[properties]中cpp_args复用c_args体现了同节内先定义后引用的规则。机器文件解析实现在 mesonbuild/machinefile.py。4.2 config tool 依赖不再搜索 PATH与机器文件相关的一个重要行为变化0.55.0 之前llvm-config、cups-config等 config tool 类依赖在 cross 文件中未定义时会去搜索宿主系统$PATH这历来是 bug 来源此前已标记弃用本版本正式移除。现在必须把 config tool 的二进制路径显式写进 cross 文件否则依赖将找不到。5. 用subproject_options配置 CMake 子项目cmake.subproject现在可以通过新的 CMake 配置选项对象传入构建选项。该对象与configuration_data()返回的cfg_data对象非常相似由subproject_options函数生成。关键约束所有配置项必须在子项目配置之前设置并通过subproject方法的options键传入配置之后再修改对象对已完成的cmake.subproject调用不生效。同时subproject函数的cmake_optionskwarg 已被弃用统一由新的options体系取代。6.find_program对可执行文件覆盖的修复当程序被meson.override_find_program(foo, exe)覆盖后0.55.0 修复了两个崩溃问题并新增一个一致化方法# 在子项目中 exe executable(foo, ...) meson.override_find_program(foo, exe) # 在主项目中 # 旧版本带 version 校验会直接崩溃 prog find_program(foo, version : 1.0) # 旧版本这会崩溃 message(prog.path()) # 新方法与内建对象保持一致 message(prog.full_path())7.meson.add_*_script接受新类型add_install_script、add_dist_script、add_postconf_script三者现在都能接受find_program返回的ExternalProgram、files()返回的File对象以及configure_file的输出meson.add_install_script(find_program(foo), files(bar)) meson.add_dist_script(find_program(foo), files(bar)) meson.add_postconf_script(find_program(foo), files(bar))dist与postconf因执行时机限制不能接受其他类型dist 理论上可以但需要更大范围的后端改动。add_install_script更进一步还接受custom_target、custom_target索引及构建目标可执行文件、库并支持把构建出的可执行文件作为脚本来运行installer executable(installer, ...) meson.add_install_script(installer, ...) meson.add_install_script(foo.py, installer)8. 响应文件Linux 启用、Windows 收敛0.55.0 之前Meson 在 Windows 上总是使用响应文件response file在 Linux 上从不使用。新版本在两侧取得更合理的平衡只有命令行长度逼近限制、确实必要时才使用响应文件。9. Wrap 系统全面增强0.55.0 对 Wrap 依赖回退做了大量增强这也是本版本最值得关注的方向之一。9.1 隐式依赖回退dependency(foo)现在会自动回退当系统找不到该依赖但存在同名子项目 wrap 文件或目录时Meson 自动使用该子项目。也就是说只需添加subprojects/foo.wrap任何dependency(foo)调用都会获得回退前提是子项目内部调用meson.override_dependency(foo, foo_dep)指明应使用的依赖对象。9.2[provide]节Wrap 文件可以在[provide]节声明它提供的依赖。当foo.wrap声明提供依赖foo-1.0时任何dependency(foo-1.0)调用都会自动回退到该子项目无需fallbackkwarg。解析逻辑位于 mesonbuild/wrap/wrap.py#L316-L338parse_provide_section提供关系会被登记进Resolver的provided_deps/provided_programs查找表mesonbuild/wrap/wrap.py#L383-L387。具体语法见 Wrap 依赖系统手册。9.3find_program()回退与依赖回退对应当系统找不到某个程序、但某个 wrap 文件的[provide]节包含该程序名时该子项目会被用作回退find_program_providermesonbuild/wrap/wrap.py#L544-L552。9.4 强制回退--force-fallback-for新增命令行选项--force-fallback-for可对指定子项目强制启用回退meson setup builddir/ --force-fallback-forfoo,bar该选项在 mesonbuild/options.py#L707 中定义为UserStringArrayOption并在依赖回退判断中被读取interpreter/dependencyfallbacks.py与interpreter/interpreter.py都会检查名字是否命中force_fallback_for列表mesonbuild/interpreter/dependencyfallbacks.py#L328-L346、mesonbuild/interpreter/interpreter.py#L1868-L1877。9.5 备用下载地址source_fallback_url/patch_fallback_urlWrap 文件可以定义source_fallback_url与patch_fallback_url当主服务器临时不可用时使用。下载逻辑在_download中hash 校验失败或主 URL 出错时若存在*_fallback_url则自动降级重试mesonbuild/wrap/wrap.py#L932-L948。9.6 本地源码与补丁文件现在可以只用patch_filename/source_filename而不写*_url从而指定本地源码/补丁文件。所有本地文件必须位于subprojects/packagefiles目录此时*_hash条目可选_get_file_internal中hash_requiredFalsemesonbuild/wrap/wrap.py#L964-L971。9.7 本地补丁目录patch_directoryWrap 文件可以用patch_directory替代patch_filename二者不能同时出现见 mesonbuild/wrap/wrap.py#L974-L986当覆盖文件都在本地时使用。该目录及其子目录中的所有文件会被复制到子项目目录——典型用途是为上游未使用 Meson 的项目补充meson.build文件。补丁目录同样必须放在subprojects/packagefiles下该目录路径常量见 mesonbuild/wrap/wrap.py#L219。9.8patch_*键适用于所有 wrap 类型patch_*系列键不再局限于wrap-filewrap-git等所有 wrap 类型均可指定。10. 编译器与构建行为改进10.1link_language扩展到所有目标此前link_language参数只允许出现在executable上因为主函数所在语言决定链接器但该限制实际上并不工作即使正确实现该参数本应对所有目标有效。0.55.0 移除了限制并修复 bug现在executable及library的各类派生目标均可使用。10.2b_ndebug支持 D 语言编译器D 语言编译器现在会在b_ndebug开启时按编译器类型分别传入-release、--release或-frelease。10.3gnome.generate_gir()的fatal_warningsgnome.generate_gir()新增fatal_warningskwarg一旦产生警告即中止。这对 CI 环境尤其有用可以第一时间暴露潜在问题。10.4 Clang 覆盖率支持当编译器为 clang 时覆盖率信息改用llvm-cov生成。10.5 VS 后端b_vscrt行为对齐此前--buildtypedebugoptimized在 Ninja 后端下 VS CRT 选项为/MD文档化的跨后端行为而 Visual Studio 后端却错误地传入/MT。0.55.0 修正了这一不一致。如需使用 MultiThreaded CRT请显式传递-Db_vscrtmt。11. 命令行与运行时环境细节11.1meson dist --no-testsmeson dist新增--no-tests选项跳过生成包的构建与测试参数声明见 mesonbuild/mdist.py#L59在 mdist.py#L426 处生效。适合在 CI 已自行测试时避免重复耗时。11.2 测试脚本获得 exe wrapperMeson 现在会把MESON_EXE_WRAPPER设置为正确包装并拼接后的表示Unix 类系统使用 Python 的shlex.joinWindows 使用能正确引用参数的实现。这让包装脚本可以真正运行测试二进制而不是直接跳过。例如 wrapper 为[emulator, --script]时传递值为MESON_EXE_WRAPPERemulator --script设置位置见 mesonbuild/mtest.py#L1837。11.3has_exe_wrapper更名为can_run_host_binaries旧名meson.has_exe_wrapper与实际行为不符更名后的meson.can_run_host_binaries语义更清晰。旧名保留为别名行为不变但已标记弃用见 mesonbuild/interpreter/mesonmain.py#L260-L271FeatureDeprecated与FeatureNew分别标注了弃用与新增版本。11.4meson_options.txt字符串拼接meson_options.txt现在支持用拼接字符串便于拆分过长的选项描述option( testoption, type : string, value : optval, description : An option with a very long description that does something in a specific context )11.5unstable-kconfig更名为unstable-keyvalunstable-kconfig模块更名为unstable-keyval预计在积累一定使用经验后下一个或再下一个版本转为稳定模块。11.6 内省 APIAST 导出meson introspect内省新增--ast选项0.55.0 新特性以 JSON 形式打印meson.build的 AST。这为静态分析与工具链开发提供了直接入口。12. 小结Meson 0.55.0 是一个面向开发体验与依赖管理的版本meson compile目标选择与后端参数透传让增量构建更精细gtest 协议与 JUnit 输出打通了与 CI 的对接Wrap 系统的[provide]、隐式回退、强制回退与本地 patch 机制让子项目管理更灵活rpath 清理与响应文件策略的调整则进一步减少了平台差异带来的意外行为。读者可以结合 完整发布说明 以及 mcompile.py、mtest.py、wrap.py 等源码继续深入验证本文涉及的各处实现细节。赞分享构建工具【免费下载链接】mesonThe Meson Build System项目地址https://gitcode.com/gh_mirrors/me/meson点击查看免费下载相关推荐RmsNormBackward 算子深度解析CANN ascend-transformer-boost 中的 RMSNorm 反向实现RmsNormBackward 算子深度解析CANN ascend transformer boost 中的 RMSNorm 反向实现 说明本文以仓库内知识构建工具smithy-go 运行时与代码生成器全解析中间件栈、编码包与 GoWriter 模板体系smithy go 运行时与代码生成器全解析中间件栈、编码包与 GoWriter 模板体系 导读 本文以 smithy go 仓库的 AGENTS.md ht构建工具Meson 0.42.0 新特性深度解析从关键字校验到 Vulkan/MPI 依赖的构建系统升级Meson 0.42.0 新特性深度解析从关键字校验到 Vulkan/MPI 依赖的构建系统升级 导读 本文以 Meson 构建系统 0.42.0 版本的官方构建工具上一篇termtosvg性能监控录制过程中的资源使用情况下一篇从2D到3DPIFuHD纹理重建技术让图像立起来的秘密创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考