Files
firmware-lowlevel-development/skills/firmware-lowlevel-bsp-development/references/build-and-evidence.md
T

134 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 构建、Git、imgs 与 PSP 交接证据
## 项目内证据目录
新项目必须包含:
```text
doc/bsp_adaptation/
├── adaptation_report.md
├── inputs/
├── validation/
├── handoff/
│ └── psp_handoff.json
└── status.json
```
`adaptation_report.md` 至少记录参考与目标、芯片/SDK/Flash/系统形态、交付级别、调查范围、验证模式、用户确认、输入依据、修改文件、旧值与新值、继承项、GPIO/DTS 冲突处理、内存/分区检查、未执行验证、风险和真实状态。
小型 GPIO List、内存或分区需求原样复制到 `inputs/`。大型或敏感原理图、芯片手册和工程资料默认不重复复制,只记录受控路径、版本、适用型号和 SHA-256。禁止保存密钥、token、证书内容或许可证凭据。
CSV 只有从原理图提取或重新映射 Pinmux 时才作为派生审核证据写入 `inputs/`;它不是唯一事实源。
## 本地 Git
`EmxRes` 已有 Git worktree 只用于只读状态、参考项目脏文件发现和差异证据。不得执行 `git init`、`add`、`commit`、`stash`、清理、分支切换、历史改写或 `push`。
项目创建本身不需要远端 Git。根仓库其他项目的改动不阻塞;与参考或目标重叠的已有改动必须先确认。
## 项目创建阶段
仅创建 `config-project` 或只读审查时不执行:
- `ep_kernel.sh`;
- `ep_uboot.sh`;
- `EPSYNCSDKConfig.sh`;
- `EMX2_BuildSDKTool`。
这些脚本会将配置复制或 `rsync` 到项目外 SDK,有的还会改变脚本权限或访问远端。仅创建配置项目时只完成目录、配置回读、DTS/GPIO 静态一致性、精确差异白名单和文档检查。任务要求 `bsp-build-artifacts` 或更高交付级别时,静态检查完成后按下一节自动执行标准全量编译。
## 统一编译
需求和实施方案已经确认、任务需要构建产物时,标准流程自动执行:
```bash
cd ~/EapilBsp/EMX2.0/EmxRes
source tools/script_completion.sh
EMX2_BuildSDKTool <项目名> <YYYYMMDD_N> all
```
`YYYYMMDD` 使用 Asia/Shanghai 当前日期;未指定时选择尚不存在的最小正整数序号。默认全量 `all`,只有用户明确要求时使用组件构建。
先运行:
```bash
python3 <BSP Skill>/scripts/bsp/bsp_preflight.py build \
--project <项目名> \
--version <YYYYMMDD_N>
```
只有 `passed=true` 才能自动执行。执行前把工具返回的精确工作目录、完整命令、项目与 SDK 路径、构建范围、最终 imgs 版本路径、工作区状态、配置同步副作用,以及统一脚本中的远端 `git fetch origin` 写入记录,不再请求第二次确认。不得从 `EmxRes` 的父目录启动,也不得依赖登录 Shell 的偶然当前目录。
下列情况不自动处理:预检失败、统一脚本或路径与固定规则不符、输出版本已存在、参考或目标出现新的重叠改动、需要直接运行同步脚本、需要组件构建、需要改变构建参数、需要修改统一脚本,或者构建失败后需要清理和重试。此时停止并向用户说明异常、影响和可选处理方式。
不得修改、注入或静默绕过统一构建脚本的远端检查。本地免远端模式属于独立工具优化任务。
## 输出冲突与权限
输出目录通常为:
```text
/epbuild/EMX2.0/EmxRes/<项目名>/imgs/<构建版本>
```
已存在时默认停止并建议下一序号。绝不自动向“强制删除并继续”回答 `yes`;覆盖需要针对精确绝对路径的独立确认。
构建前记录新项目内同步脚本权限;统一脚本临时 `chmod 777` 后,构建结束恢复已记录的原权限并写入报告。只恢复新项目内的已知文件,不改 SDK 或其他项目权限。
## 构建证据与状态
成功必须同时满足:
- 命令退出码为零;
- 日志到达正常完成阶段;
- 输出目录存在且含非空固件文件;
- 当前项目实际生效的分区表可唯一确定,或已显式指定 `configs/` 内精确文件;
- 最终 imgs 中唯一 `kernel.bin` 和 `rootfs.bin` 相对各自最小对应分区均保留至少 512 KiB(524288 字节);
- 文件名、大小和 SHA-256 清单写入 `validation/`;
- 构建后项目源码差异仍通过白名单。
满足以上条件后运行:
```bash
python3 <BSP Skill>/scripts/bsp/record_build_handoff.py \
--project <项目名> \
--build-version <YYYYMMDD_N> \
--build-exit-code 0 \
--completion-marker-seen \
--risk <仍存在的硬件风险>
python3 <BSP Skill>/scripts/bsp/project_guard.py audit-final \
--target-project <项目名>
```
自动发现多个 `partition*.xml` 时,上述记录命令必须追加:
```bash
--partition-table configs/<实际生效路径>/partition_spinand.xml
```
该参数只接受当前 BSP 项目 `configs/` 内的文件。检查失败时脚本不会生成 `build_passed` handoff。
记录脚本生成或更新:
- `validation/artifact_manifest_<构建版本>.sha256`;
- `validation/image_partition_margin_<构建版本>.json`;
- `handoff/psp_handoff.json`;
- `status.json`。
`psp_handoff.json` 遵循统一入口的 [BSP→PSP 交接契约](../../firmware-lowlevel-development/references/bsp-psp-handoff.md)。`audit-final` 必须在这些文档写入后执行;它使用 prepare 时冻结的参考清单,而不是假定参考项目从未变化。
成功时保存简明摘要、kernel/rootfs 分区余量证据、固件哈希清单和精确 imgs 版本路径;失败时保存完整日志、阶段和关键错误。后续同步或编译失败不删除已经通过静态门禁的正式项目,只更新状态。不得只记录 `imgs` 软链接、父目录或“latest”;交付和 PSP 依赖必须绑定具体构建版本目录。
没有同步和编译时写:
```text
本地 BSP 配置项目已创建;尚未同步 SDK,尚未完成编译验证
```
本地编译成功也不能替代板上 GPIO、电平、时序、外设或负责人验收。
## 最终回复
完成构建时必须显式输出:项目路径、精确 imgs 版本路径、kernel/rootfs 的镜像大小、最小对应分区大小和实际余量、余量证据路径、交接 manifest 路径、产物清单/hash 路径、`audit-final` 结果,以及硬件/负责人/发布状态。没有生成交接 manifest 时不能声称已完成 PSP 交接。