多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

CMake 包预设(Package Presets)output 配置详解:debug 与 verbose 字段的用法与实现原理

CMake 包预设(Package Presets)output 配置详解:debug 与 verbose 字段的用法与实现原理 构建工具开发工具CLI【免费下载链接】CMakeMirror of CMake upstream repository项目地址https://gitcode.com/gh_mirrors/cm/CMake点击查看免费下载导读本篇文章围绕 CMake 的包预设Package Presets中output子对象展开深入解析其下debug与verbose两个布尔字段的语义、与cpack命令行选项的等价关系、JSON 书写规范以及底层解析实现。文中内容以 Help/manual/presets/packageOutput-properties.rst 为骨架并对照仓库中的预设模式定义 Help/manual/presets/schema.yaml 与解析源码 Source/cmCMakePresetsGraphReadJSONPackagePresets.cxx 进行印证。读完本文你将能够在CMakePresets.json/CMakeUserPresets.json中正确配置包预设的输出行为理解其与cpack --debug、cpack --verbose的对应关系并掌握排查打包输出问题的调试手段。一、定位包预设中的 output 子对象在 CMake 的预设体系中packagePresets用于为cpack指定参数。每个包预设对象除了name、inherits、condition、vendor、environment、generators、configurations、variables、configFile、packageName、packageVersion、packageDirectory、vendorName等字段外还包含一个可选对象output用于统一控制打包过程中的输出行为。在模式定义文件 Help/manual/presets/schema.yaml 的packagePresets一节中output被声明为output: id: packageOutput type: object description: An optional object specifying output options. properties: debug: type: boolean description: An optional boolean specifying whether or not to print debug information. A value of true is equivalent to passing --debug on the command line. verbose: type: boolean description: An optional boolean specifying whether or not to print verbosely. A value of true is equivalent to passing --verbose on the command line. unevaluatedProperties: false关键信息有三点output是一个可选的对象type: object其标识符为packageOutput对应的说明文档正是本文主题文档 Help/manual/presets/packageOutput-properties.rst由Utilities/Scripts/regenerate-presets.py从schema.yaml自动生成见文档首部注释因此两者内容始终一致。unevaluatedProperties: false表示该对象只允许debug与verbose两个键任何其他键都会被判定为非法 JSON 键并触发解析错误。两个属性均为可选的布尔值type: boolean省略时按未启用处理。二、字段详解2.1debug打印调试信息debugAn optional boolean specifying whether or not to print debug information. A value oftrueis equivalent to passing :cpack-option:--debugon the command line.类型可选布尔值含义指定是否打印调试debug信息等价关系设置为true等价于在命令行向cpack传入--debug适用场景根据 Help/manual/cpack.1.rst 中对--debug的说明该选项主要用于cpack 自身的开发者排查打包器内部行为普通项目开发者通常不需要开启。2.2verbose打印详细输出verboseAn optional boolean specifying whether or not to print verbosely. A value oftrueis equivalent to passing :cpack-option:--verboseon the command line.类型可选布尔值含义指定是否打印详细verbose输出等价关系设置为true等价于在命令行向cpack传入--verbose短选项为-V适用场景根据 Help/manual/cpack.1.rst 的说明--verbose用于展示更多来自打包工具package generation tools的细节输出适合项目开发者排查打包内容与流程。2.3 两个字段的关系与差异字段类型默认效果等价命令行选项目标用户debug可选 boolean不打印调试信息cpack --debugcpack 自身开发者verbose可选 boolean不打印详细输出cpack -V, --verbose项目开发者两者可以同时为true互不排斥都缺省时等价于在命令行中不传任何输出类选项。从源码结构看这两个字段分别映射到内部预设结构的不同成员DebugOutput与VerboseOutput详见下文说明它们在实现上是独立存储、独立生效的。三、完整配置示例包预设定义在仓库根目录或项目根目录的CMakePresets.json中开发者个人覆盖可写在CMakeUserPresets.json。以下是一个同时使用output.debug与output.verbose的完整示例{ version: 6, configurePresets: [ { name: default, binaryDir: ${sourceDir}/build } ], packagePresets: [ { name: pkg-verbose, configurePreset: default, generators: [TGZ, DEB], output: { verbose: true } }, { name: pkg-debug, configurePreset: default, hidden: true, output: { debug: true } }, { name: pkg-main, inherits: [pkg-debug, pkg-verbose], configurePreset: default } ] }说明version必须为 6 及以上因为packagePresets自预设版本 6 起引入见 Help/manual/presets/schema.yaml 中packagePresets.since: 6output对象只接受debug与verbose两个键多余键会报错通过inherits继承多个包预设时被继承预设中的output设置会一并生效可用作公共调试配置的复用使用cpack --preset pkg-main即可按预设打包等价于在命令行追加--debug --verbose。四、底层实现JSON 解析路径包预设的 JSON 解析逻辑集中在 Source/cmCMakePresetsGraphReadJSONPackagePresets.cxx 中。其中OutputHelper负责解析output子对象auto const OutputHelper cmJSONHelperBuilder::ObjectPackagePreset( JsonErrors::INVALID_NAMED_OBJECT_KEY, false) .Bind(debug_s, PackagePreset::DebugOutput, cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false) .Bind(verbose_s, PackagePreset::VerboseOutput, cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false);可印证的事实debug与verbose使用PresetOptionalBoolHelper解析为可选布尔值与schema.yaml中的type: boolean声明一致两者分别写入PackagePreset::DebugOutput与PackagePreset::VerboseOutput成员实现层面相互独立ObjectPackagePreset(JsonErrors::INVALID_NAMED_OBJECT_KEY, false)中false表示对象非必需对应output是可选对象且该 Helper 未绑定其他键配合schema.yaml的unevaluatedProperties: false额外键会被拒绝在 Source/cmCMakePresetsGraphReadJSON.cxx 中还有面向不同预设版本的兼容性检查如TestOutputTruncation需版本 5、outputJUnitFile需版本 6可见预设解析对版本号敏感——若使用低于 6 的version声明packagePresets会因“版本过旧”而被报错这也是配置时务必把version提升到 6 的原因。五、验证与调试建议校验 schema修改CMakePresets.json后可先运行cmake --list-presets针对 configure/build 预设或直接调用cpack --preset name让解析器按 Help/manual/presets/schema.json 校验 JSON 合法性schema.json是schema.yaml的等价 JSON 版本二者由同一生成脚本维护。对比命令行行为output.debug: true与cpack --debug、output.verbose: true与cpack -V/--verbose在效果上完全等价字段文档与 Help/manual/cpack.1.rst 相互印证因此调试阶段可以先在命令行直接追加选项确认需要哪种输出级别后再固化进预设。区分使用对象项目开发者排查打包内容时优先使用verbosedebug面向 cpack 自身开发者普通项目一般无需开启以免产生过量的内部输出。注意只读仓库约束当前仓库仅用于阅读与学习在实际项目中使用时请在你自己的CMakePresets.json/CMakeUserPresets.json中按上述格式添加配置。六、关联文档速查本文主题文档Help/manual/presets/packageOutput-properties.rst预设模式定义YAMLHelp/manual/presets/schema.yaml预设模式定义JSONHelp/manual/presets/schema.json包预设解析源码Source/cmCMakePresetsGraphReadJSONPackagePresets.cxx预设图解析与版本校验Source/cmCMakePresetsGraphReadJSON.cxxcpack 命令行选项说明Help/manual/cpack.1.rst赞分享构建工具开发工具CLI【免费下载链接】CMakeMirror of CMake upstream repository项目地址https://gitcode.com/gh_mirrors/cm/CMake点击查看免费下载相关推荐CMake Presets 配置调试详解 configurePresets 的 debug 对象output / tryCompile / findCMake Presets 配置调试详解 configurePresets 的 debug 对象output / tryCompile / find 本指构建工具开发工具CLICMake 包预设Package Preset完整指南cpack --preset 配置字段全解析CMake 包预设Package Preset完整指南cpack preset 配置字段全解析 导读 Package Preset包预设是 CMake构建工具开发工具CLICMake Presets 构建预设buildPresets完整参考字段详解、继承与环境继承实战CMake Presets 构建预设buildPresets完整参考字段详解、继承与环境继承实战 导读 CMake Presets 机制自 CMake 3构建工具开发工具CLI上一篇从0到1使用 Solana-py 开发去中心化应用(DApp)实战下一篇Utopia 个人访问令牌PAT实战指南身份来自人、范围来自令牌以及 MCP 之上的每一次鉴权创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表