ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Meson 0.64.0 新特性全解析:汇编语言支持、优化选项重构与构建效率改进

Meson 0.64.0 新特性全解析:汇编语言支持、优化选项重构与构建效率改进 构建工具【免费下载链接】mesonThe Meson Build System项目地址https://gitcode.com/gh_mirrors/me/meson点击查看免费下载导读Meson 0.64.0 是一次以“构建能力扩展”与“开发体验优化”为核心的版本更新。本文基于官方发布说明 docs/markdown/Release-notes-for-0.64.0.md并结合当前仓库源码系统梳理该版本的 18 项新特性从新增nasm/masm汇编语言支持、optimization新增plain取值到fs.copyfile()、compiler.preprocess()等新 API以及 WrapDB 自动回退、--maxfail快速失败等 CI 友好改进。读完本文你将掌握这些特性的使用姿势、适用平台与底层实现原理并能据此完成项目迁移与配置升级。优化选项新增plain取值构建类型与优化彻底解耦0.64.0 之前optimization内建选项的可选值不包含“不设置任何优化标志”的语义。本次更新为optimization新增plain值表示不附加任何优化标志不传入-O相关参数。它现在是buildtypeplain时的默认取值对发行版distro打包方尤其友好这些发行版通常通过其他途径如全局 CFLAGS、发行版级加固策略设置优化与加固标志不希望 Meson 再画蛇添足地追加-O。从源码看该选项的定义位于 mesonbuild/options.pyUserComboOption(optimization, Optimization level, 0, choices[plain, 0, g, 1, 2, 3, s])可见合法取值集合为plain、0、g、1、2、3、s。各编译器后端会按此取值映射实际参数。以 D 语言编译器为例mesonbuild/compilers/d.py 中多处出现if optimization_level ! plain的分支判断即仅在非plain时才追加优化标志。兼容性警示如果你在meson.build脚本中读取get_option(optimization)的值并直接拼进编译器参数例如假设其值可直接用于-O标志请务必修正此类假设——plain这类取值不应被当作-O的参数传递。新增汇编语言支持nasm与masm0.64.0 为 Meson 新增了两个可直接声明的语言nasm与masm对应的实现集中在 mesonbuild/compilers/asm.py。NASMx86 / x86_64在project()中声明nasm语言后.asm文件会被自动交给 NASM 汇编器处理project(test, nasm) exe executable(hello, hello.asm) test(hello, exe)平台限制NasmCompiler._SUPPORTED_ARCHES {x86, x86_64}仅支持 x86 与 x86_64 两大 CPU 家族不满足时会抛出EnvironmentException见ASMCompiler.__init__的架构检查逻辑。yasm 回退若环境中找不到nasm命令Meson 会自动回退到YasmCompiler继承自NasmCompiler。由于 yasm 与 nasm 的优化参数不兼容YasmCompiler.get_optimization_args()直接返回空列表。平台相关参数NasmCompiler.get_always_args()会根据目标平台自动推导汇编格式与宏定义例如 Linux 上使用-f elf64与-DELFWindows 上使用-f win64与-DWIN64等开发者无需手动指定。优化映射nasm_optimization_args字典将 Meson 的优化等级映射为 NASM 参数如1: [-O1]、2/3/s: [-Ox]、plain: []。依赖文件支持生成 depfile后缀.d并可通过-MD/-MQ生成依赖信息。MASMx86 / x86_64 / ARM / AARCH64声明masm语言后.masm文件由 Microsoft 宏汇编器ml/ml64处理在 x86/x86_64 上对应MasmCompilerid ml_SUPPORTED_ARCHES {x86, x86_64}使用 MSVC 风格参数语法/nologo、/Fo、/c等。在 ARM/AARCH64 上对应MasmARMCompilerid armasm_SUPPORTED_ARCHES {arm, aarch64}。与既有 GNU 汇编的关系文档特别提醒GNU 汇编源文件通常使用.s/.S扩展名此前已通过 C 编译器GCC、Clang构建与本次新增的nasm/masm语言互不冲突。仓库中也提供了配套测试用例可参考 test cases/nasm/ 目录中的实际项目结构。meson configure输出分页与着色meson configure打印全部选项的输出现在会自动使用分页器默认less并带颜色长输出不再刷屏。分页器可通过PAGER环境变量自定义也可以用--no-pager命令行选项显式关闭分页。命令行选项解析位于 mesonbuild/mconf.pyparser.add_argument(--no-pager, actionstore_false, destpager, ...)随后在print_conf(options.pager)中决定是否调用分页。分页器启动逻辑在 mesonbuild/mlog.py优先读取PAGER环境变量否则查找lessWindows 下还会尝试从 Git 自带的usr/bin下寻找。若未设置LESS环境变量会默认注入LESSRXFR支持颜色、X退出不清屏、F内容一屏放得下时自动跳过并支持LV-c以兼容lv分页器。install_*函数不再处理 sticky bit将 sticky 位sticky bit赋予普通文件在跨平台上是不可移植的而且即便可行通常也毫无意义。0.64.0 起向除install_emptydir之外的任何函数通过install_mode:关键字参数传递 sticky 位权限Linux 上无实际效果Solaris 上该权限位会被操作系统静默忽略FreeBSD 上设置该权限位会被视为错误。因此 Meson 现在会对这类用法发出警告并忽略该权限位。若你的安装脚本仍在使用此功能建议清理。fs.copyfile()取代configure_file(copy : true)fs模块新增copyfile()方法用于替代configure_file(copy : true)但只做文件拷贝与configure_file()不同copyfile()在构建期build time执行而非配置期。输出文件名可选默认取输入文件的 basename。fs.copyfile(src/file.txt)上述写法会在当前构建目录生成file.txtfs.copyfile(file.txt, outfile.txt)上述写法会生成重命名后的副本outfile.txt。从实现看mesonbuild/modules/fs.py该方法是 0.64.0 新增的FeatureNew内部基于CustomTarget实现执行meson --internal copy INPUT OUTPUT输出路径不允许包含路径分隔符且支持install/install_dir/install_mode/install_tag等安装相关参数install_dir在开启安装时必填。由于它在构建期运行拷贝目标可用作构建产物参与依赖图这是其相对configure_file(copy: true)的核心优势。gnome.post_install()新增update_mime_database安装包含mime-type声明的.xml文件的应用程序需要在安装后刷新 MIME 数据库缓存。过去多数应用要自写脚本现在 Meson 可直接完成gnome.post_install( update_mime_database: true, ... )该参数的解析见 mesonbuild/modules/gnome.pyKwargInfo(update_mime_database, bool, defaultFalse, since0.64.0)即默认关闭、自 0.64.0 起可用开启后会记录内部状态并在安装阶段触发 MIME 数据库更新。install_data新增preserve_path参数install_data()新增可选参数preserve_path: true允许用一条命令安装与源码目录结构一致的多层目录数据文件install_data( data/icons/hicolor/32x32/apps/app.png, data/icons/hicolor/64x64/apps/app.png, preserve_path: true, )启用后文件的安装路径会保留其在源码树中的相对子目录结构。实现位于 mesonbuild/interpreter/interpreter.py启用时按每个文件的目录名分组build.Headers以os.path.join(install_subdir, childdir)作为安装子目录从而实现结构化安装。该参数同样适用于 Python 模块的py_installation.install_sources()方法方便把多级目录的.py包结构原样安装。jni依赖支持所有 BSD 系统jni系统依赖现已覆盖 Meson 支持的全部 BSD 系统FreeBSD、NetBSD、OpenBSD 以及 DragonFly BSDJava 原生接口JNI开发者在这些平台上可更顺畅地完成依赖探测。通过~/.netrc提供httpsURL 凭据当子项目通过https://URL 下载时Meson 现在会读取~/.netrc中的凭据避免把登录名和密码明文硬编码进 URL。基础支持 oneAPI 编译器Linux 与 Windows0.64.0 开始支持 Intel oneAPI 工具链Linux 与 Windows。Linux 上的典型用法source /opt/intel/oneapi/setvars.sh CCicx CXXicpx FCifx meson setup builddir通过环境变量将 C/C/Fortran 编译器指向 oneAPI 的icx、icpx、ifx后直接进行meson setup即可。编译器对象新增preprocess()方法编译器对象新增preprocess()方法支持所有 C/C 编译器只对源文件做预处理preprocess不进行编译。预处理器会收到与正常编译相同的参数include 目录、宏定义等包括add_project_arguments()添加的参数以及命令行-Dc_args-DFOO传入的参数。cc meson.get_compiler(c) pp_files cc.preprocess(foo.c, bar.c, output: PLAINNAME) exe executable(app, pp_files)实现见 mesonbuild/interpreter/compiler.py该方法经FeatureNew(compiler.preprocess, 0.64.0)标记内部调用编译器的预处理器并以CustomTargetIndex形式返回预处理产物output默认值为PLAINNAME.i即默认生成.i后缀文件。返回值可直接作为executable()等目标的输入。python.find_installation()支持pure参数py.install_sources()与py.get_install_dir()中pure:的默认值现在可通过在find_installation()时显式传入pure:关键字来全局改变py import(python).find_installation(python3, pure: false)这样可确保多次install_sources()调用不必每次重复指定该关键字减少遗漏。有 Rust 目标时自动生成rust-project.json当项目包含 Rust 目标时Meson 会自动在构建目录生成rust-project.json。该格式与compile_commands.json类似但专门服务于 Rust 官方 LSP——rust-analyzer。后端实现见 mesonbuild/backend/ninjabackend.pygenerate_rust_project_json()会把每个 Rust 目标的源文件与编译参数写入build_dir/rust-project.json开发者可直接在 rust-analyzer 中指向该文件获得精确的工程感知无需手工维护。summary()接受 disablersummary()现在可以把 Disabler 对象作为要打印的值传入。结合 Disabler 的“一切操作静默返回 disabler 自身”的语义可以在条件未满足时优雅地在概要中输出 disabler 值而无需先写一层if判断。meson test --maxfail1快速失败meson test --maxfail1会在第一个测试用例标记失败后取消或中断所有进行中/待执行的测试。这对 CI 场景非常实用一旦已知整体返回状态必然失败就立即停止测试避免继续烧钱烧时间。meson test --maxfail1--maxfail可配合其他meson test选项如--suite、-j使用用于尽早结束失败的 CI 任务。增量 ThinLTOb_thinlto_cache通过-Db_thinlto_cachetrue可启用 Clang 的增量 ThinLTOmeson setup builddir -Db_thinlto_cachetrue缓存能够在保留 ThinLTO 全部运行时性能收益的同时显著加速增量构建。缓存默认位于 Meson 管理的构建目录内子目录可用b_thinlto_cache_dir自定义位置。meson wrap update批量更新 WrapDB 包meson wrap update在不带额外参数时会将该版本更新为更新所有来自 WrapDB 的 wrap 文件到最新版附加--force参数时即使某个 wrap 并非来自 WrapDB只要 WrapDB 中有对应包也会被替换。同时行为变化meson subprojects update不再从 WrapDB 下载新的 wrap 文件。Wayland 模块scan_xml新增include_core_onlywayland.scan_xml()新增可选布尔参数include_core_onlywayland.scan_xml( my-protocol.xml, include_core_only: true, )开启后wayland-scanner 生成的头文件只包含wayland-client-core.h而非完整的wayland-client.h适用于只需要核心客户端接口的场景。新增meson wrap update-db与 WrapDB 自动回退0.64.0 新增命令meson wrap update-db它会下载 WrapDB 中可用包的列表并保存到本地subprojects/wrapdb.json。meson wrap update-db此后当出现两种情况时Meson 会自动执行回退subprojects/wrapdb.json已存在某个依赖在系统中找不到但 WrapDB 中有对应包。满足条件时 Meson 会自动下载该 wrap实现“找不到依赖就自动从 WrapDB 获取”的流水线体验。命令解析入口见 mesonbuild/wrap/wraptool.py实际执行逻辑在update_db()同文件 L213。升级建议与兼容性要点优化选项任何依赖get_option(optimization)取值的脚本都要兼容plain这一新取值切勿假设其可直接用于-O标志。sticky bit清理install_mode:中的 sticky 位用法改用install_emptydir或直接省略。文件拷贝新项目优先使用fs.copyfile()从configure_file(copy: true)迁移时注意二者执行时机配置期 vs 构建期与安装参数差异。wrap 流程如需批量升级依赖改用meson wrap update如需自动回退先运行meson wrap update-db生成subprojects/wrapdb.json。Rust 项目构建后直接在构建目录使用rust-project.json接入 rust-analyzer。赞分享构建工具【免费下载链接】mesonThe Meson Build System项目地址https://gitcode.com/gh_mirrors/me/meson点击查看免费下载相关推荐Slang 诊断目录测试包为每个诊断代码生成 DIAGNOSTIC_TEST 的系统化方案Slang 诊断目录测试包为每个诊断代码生成 DIAGNOSTIC_TEST 的系统化方案 导读 Slang 编译器将用户可见的诊断错误、警告、提示组织成构建工具Nim 0.19.0 更新全解析语言特性演进、标准库重构与编译器能力升级Nim 0.19.0 更新全解析语言特性演进、标准库重构与编译器能力升级 导读 本文基于仓库内 changelogs/changelog_0_19_0.md编程语言编译器语言运行时标准库jQuery 4.0新特性解析ES模块支持与现代化改进jQuery 4.0新特性解析ES模块支持与现代化改进 jQuery 4.0作为这个经典JavaScript库的重要里程碑版本带来了革命性的 ES模块支持前端UI组件上一篇FastScriptReload限制与解决方案泛型、嵌套类与内部接口处理下一篇InstructLab与其他AI工具对比为什么它是模型训练的革命性选择创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表