选定提供者装配门禁¶
维护中的门禁通过既有 CMake 工程链接显式编写的软件夹具。TOML 与唯一配置解析器选择精确料号、Board 包、后端、路由、模式及预算。门禁不改写后端、不建立提供者注册表、不选择源码目标,也不推断物理 Board 接线。
python scripts/ci/provider_assemblies.py \
--fixture tests/contracts/usb_assembly/stm32-zg.toml \
--family stm32f407 \
--compiler arm-none-eabi-gcc \
--output build/provider-assemblies/usb-stm32
重复 --fixture 指定已审阅 TOML 列表。各文件须位于 tests/contracts、有同目录维护的 CMakeLists.txt,且解析为 MCU 配置。可选系列断言比较真实解析结果。不同后端必须使用不同的维护中 TOML;门禁没有独立 OS 覆盖。CMake 使用 NEXUS_SOURCE_ROOT 与 NEXUS_ASSEMBLY_FILE 构建各夹具默认目标图。所选源码根必须是执行门禁及其导入工具所属 checkout;拒绝其他源码 checkout 的工具。
输出目录必须不存在。既有证据、符号链接目标和源码目录均拒绝。每条真实命令记录 argv、工作目录、时间戳、返回码和原始 stdout/stderr 字节。缺失工具、非零退出、超时或后台产物写入者使矩阵失败并保留失败报告。空矩阵或重复矩阵不能算成功工作。
每次真实构建后,门禁要求恰好一个固件 ELF 与一个完整生成包。它比较已构建的规范配置摘要与原始作者输入解析结果,复核全部声明输入,并使用既有 ELF 资源工具重新计算内存分配。原始链接后报告须与重算相符。Flash LOAD 字节、Flash 占用、各物理 RAM 域、MSP 和 heap 保持既有预算语义。
选定 I/O 的既有保留检查工具独立追踪实际接口面指针、具体方法表及 ELF LOAD 中每个非 NULL 方法。链接后报告须与重算相符。刻意为空的夹具则证明零作者控制器/器件、零生成接口声明,且真实 ELF 不含具体 I/O 提供者表与接口面。这是实际执行的空选择 GC 检查,不是跳过保留检查,也不声称所有无关运行时代码都不存在。
真实编译数据库与 Ninja 依赖日志把编译源码、生成头文件、所选厂商头文件和编译器头文件绑定至文件身份。维护的图/配置源码及所选锁定 SDK 输入字节在执行前快照,执行后复核。矩阵拒绝源码、Git revision、工具或产物变更。脏 checkout 可以提供显式标识的开发证据,但不能仅凭此门禁取得 clean 发布候选资格。
report.json 记录 selected_provider_assembly_matrix、真实夹具/命令数量、源码身份、工具身份、各夹具配置摘要、ELF/BIN/map/bundle/report 身份、RAM 域和保留方法。全部成功夹具均须通过,没有跳过即通过的结果。CI 持有显式夹具列表,并与报告一同上传原始命令及产物。
本门禁建立软件图、编译/链接、预算及所选提供者保留证据,不执行 MCU 启动、中断、DMA、USB 枚举、Ethernet 流量、timer 波形或电气控制。物理状态保持 not_executed,周期和延迟保持 not_measured。模型测试与后续 HIL 资格范围独立。
工具回归测试命令:
python -m unittest scripts.ci.test_provider_assemblies -v