为什么 PIG 默认构建调试包
决策日期: 2026-09-03
状态: Released(已发布),随 v1.8.1 交付。
当前参考:pig build
范围:pig build ext与pig build pkg的调试包策略;单个包的产物仍以其配方为权威。
决策
pig build ext 与 pig build pkg 默认请求平台的正常调试包产物。普通构建时,PIG
不再传入禁用参数;只有需要更小或更快产物集合的用户,才显式使用 --nodbg 退出。
在 RPM 系统上,普通构建保留发行版的 debuginfo 与 debugsource 机制;--nodbg
把 debug_package 定义为空。在 Debian 与 Ubuntu 上,--nodbg 会在保留已有选项的同时,
向 DEB_BUILD_OPTIONS 追加 noautodbgsym。旧的 -s|--symbol 继续作为弃用的兼容空操作
被接受,因为调试产物已经不需要额外启用。
背景
旧命令通过 --symbol 显式启用 RPM 调试产物,否则主动注入 debug_package %{nil}。
这与平台惯例相反,也让默认产物不利于事后故障分析。Debian 的 Debhelper 已经在满足条件时
默认创建自动 dbgsym 包,并提供 noautodbgsym 作为显式退出机制。
调试包会增加构建时间、存储和仓库容量,但这些成本可见且可管理。等到精确源码、编译器和二进制 已经变化后,再重建匹配符号通常困难得多。
考虑过的方案
- 继续用
--symbol显式启用。 不采用,因为发布质量的产物默认就应保留匹配的诊断材料。 - 强制所有构建都必须有调试包。 不采用,因为快速本地构建和受限产物流仍需要明确的退出方式。
- 由 PIG 改写包配方。 不采用,因为 spec 与
debian/rules负责包内容;运行时改写既意外又难审计。 - 用
nostrip退出 DEB 调试包。 不采用,因为它会改变主二进制,而不只是省略独立的自动调试包。
契约
- 未指定
--nodbg时,PIG 不添加任何禁用调试包的宏或环境选项; - RPM 上,
--nodbg为rpmbuild添加--define "debug_package %{nil}"; - DEB 上,
--nodbg向DEB_BUILD_OPTIONS追加noautodbgsym,且不丢弃已有的parallel=N、nocheck等值; --symbol为兼容继续可解析,但被隐藏、弃用且不再有必要;- 结构化命令结果新增
nodbg,并保留symbol作为实际行为的反向值; - 普通安装包仍是构建成功的判据;调试包是附加产物,不能替代主包;
- 纯 SQL、
noarch或其它不满足条件的构建无需生成空调试包; - 包配方或操作者提供的构建环境中的显式决定仍然具有最终权威。命令默认值是一项策略请求, 不是改写配方的许可。
影响
包含编译产物的扩展通常会生成更多文件,占用更多构建与仓库存储。作为回报,默认构建可以直接用于
栈回溯、core 分析和符号服务,不必再做一次重建。已有的 --symbol 脚本仍能运行;有意保留旧式
精简产物集合的脚本应改用 --nodbg。
配方仓库应删除那些不代表具体包约束的全局调试禁用语句。这必须作为独立改动审查,因为部分包是 架构无关包、无法完成调试信息提取,或使用自定义构建系统。
验证与演进
已被取代的显式启用行为可在此前固定版本的
build 参数注册
和
rpmbuild 命令构造
中复核。替代实现由
1c6f524
固定。命令测试保证 --nodbg 可见、兼容参数已弃用;构建器测试保证默认 RPM argv 不含禁用宏、
退出模式包含该宏,并保证 DEB 环境保留已有选项且只追加一次 noautodbgsym。
平台验证应在一个 EL builder 与一个 DEB builder 上各抽样一个含编译产物的扩展,同时检查默认
调试产物以及使用 --nodbg 后不再生成调试产物。配方级例外必须单独报告,不能据此声称 PIG
忽略了自己的参数。
当前状态
该实现已进入经过验证的 v1.8.1 标签 与正式发布制品。上述实现与本地验证的证据范围保持不变。 软件仓库发布、公开文档部署与既有系统升级仍是独立交付阶段。