Skip to content

refactor(tool): 移除旧 Tool 兼容 API#118

Open
MRNIU wants to merge 2 commits into
drivercraft:mainfrom
MRNIU:upstream/r1h-remove-tool-api
Open

refactor(tool): 移除旧 Tool 兼容 API#118
MRNIU wants to merge 2 commits into
drivercraft:mainfrom
MRNIU:upstream/r1h-remove-tool-api

Conversation

@MRNIU
Copy link
Copy Markdown
Contributor

@MRNIU MRNIU commented Jun 1, 2026

摘要

  • 删除旧的 Tool / ToolConfig facade、ctx 模块以及 legacy AppContext 桥接层。
  • 将 CLI、cargo-osrun、build、QEMU、U-Boot、board 和 menuconfig 流程统一改为通过 Invocation 与模块级 helper 组织。
  • .build.toml 加载改为纯解析:调用方先合成最终配置,再显式激活 active build state。
  • 确保 CLI --package / --bin 覆盖先于 board/QEMU/U-Boot 配置变量展开和 someboot build-info.toml 参数注入生效。
  • 移除 runner 侧已经不再起作用的兼容字段,例如 show_output 和空的 U-Boot options 结构。
  • 补充 public API trybuild 和 CLI selector 回归覆盖,锁定新的模块级调用方式,并移除旧 Tool API fixture。

整体思路

这个 PR 是 #117 的后续切片。#117 已经把 QEMU、U-Boot、board 和 TFTP 的核心运行入口拆成模块级函数,同时保留 Tool 作为兼容 facade。本 PR 进一步完成迁移:不再同时维护 ToolInvocation 两套入口,而是把 public Rust API 收敛到 InvocationInvocationOptions 以及 build/run/board 模块级 helper。

一次 ostool 调用应该只有一个明确的状态来源。Invocation 负责持有项目布局、运行选项和最终 active build/runtime state;build 与 runner 模块只接收自己需要的显式输入,不再通过 legacy AppContextTool::ctx* 间接读取状态。

build config source path 继续显式传递给需要解析相对路径的地方,但 .build.toml 的加载本身不再激活 Invocation。CLI 会先加载配置,再应用 --package / --bin,最后激活最终 BuildConfig。这样 board/QEMU/U-Boot 的 ${package} 展开和 someboot 自动参数注入都基于同一个最终 Cargo selection,避免 raw config package 与 CLI override 不一致。

*_for_cargo runner/config helper 也改为直接从传入的 Cargo config 计算 package 变量作用域,不再为了读配置而替换 Invocation 的 active build state。真正会写 active build state 的入口收敛到 activate_build_configbuild_with_configcargo_buildcargo_run 和 board run 等构建/运行路径。

变更模块

  • ostool/src/lib.rs: 移除 ToolToolConfigManifestContextctx 的 public export,只保留新的 invocation/module-level API。
  • ostool/src/tool.rs, ostool/src/ctx.rs, ostool/src/legacy_context.rs: 删除旧兼容 facade、legacy context 和 AppContext 桥接层。
  • ostool/src/invocation.rs: 让 invocation state 直接承载 build/runtime 所需状态,并提供模块级流程需要的访问入口。
  • ostool/src/build/mod.rs, ostool/src/build/config_loader.rs, ostool/src/build/cargo_pipeline.rs: 拆分 build config 纯加载、最终配置激活和 Cargo pipeline 参数注入。
  • ostool/src/run/qemu.rs, ostool/src/run/uboot.rs: runner config/run helper 改为依赖 Invocation 与显式输入,移除旧兼容字段和空 options。
  • ostool/src/board/mod.rs, ostool/src/board/config.rs: board run/config flow 改为使用 invocation/module-level helper,不再经由 Tool 状态桥接。
  • ostool/src/main.rs, ostool/src/bin/cargo-osrun.rs, ostool/src/menuconfig.rs: CLI 与 cargo-osrun 入口迁移到新的调用方式,并修正 Cargo selector 覆盖顺序。
  • README.md, README.en.md: 说明 --package / --bin 会影响最终变量展开和 someboot 自动参数注入。
  • ostool/tests/public_api.rs 和 trybuild fixtures: 删除旧 Tool API 覆盖,新增 invocation/module-level API 的通过用例。

破坏性 API 变更

本 PR 包含面向 ostool library 调用方的破坏性 Rust API 变更,不只是内部重构。请在 review、合并和后续发布说明中按 breaking change 处理。

  • ToolToolConfigManifestContextctx 和 legacy AppContext 访问入口被移除。
  • library caller 需要迁移到 InvocationInvocationOptions,以及 buildrunboard 模块提供的显式 helper。
  • load_build_config_from_dir / load_build_config_from_path 现在只返回解析后的 BuildConfig,不会隐式激活 Invocation;需要变量展开或后续运行的调用方应先合成最终配置,再调用 activate_build_config 或构建/运行 helper。
  • QEMU/U-Boot/board 的 *_for_cargo helper 不再接受 build_config_path,也不再替换 active build state;它们只基于传入的 Cargo config 计算变量作用域。
  • RunUbootOptions 和 no-op 的 show_output 字段/flag 被移除;调用方不应再依赖这些兼容入口。

CLI / 配置兼容性

  • 用户侧 .build.toml 配置格式保持不变。
  • CLI --package / --bin 的最终行为更明确:覆盖后的 Cargo selection 会同时影响 runner config 变量展开和 someboot 参数注入。
  • cargo-osrun --show-output 之前不会改变运行时行为;本 PR 删除该 no-op flag 后,继续传入该参数的脚本需要移除它。

验证

已运行并通过:

  • git diff --check
  • cargo fmt --all -- --check
  • cargo clippy -p ostool --all-targets --all-features -- -D warnings
  • cargo test -p ostool
  • cargo clippy --target x86_64-unknown-linux-gnu --all-features -- -D warnings
  • cargo build --target x86_64-unknown-linux-gnu --all-features
  • cargo test --target x86_64-unknown-linux-gnu -- --nocapture

风险 / 后续

  • 本 PR 只做 host-side Rust 验证,没有实际启动 QEMU、U-Boot 或远程开发板 session。
  • 该变更会影响直接依赖 ostool library public API 的调用方;如果上游希望分阶段发布,需要在 release note 或迁移说明中明确旧 Tool API 已删除,并说明 build config load/activate 拆分后的调用方式。

Remove the legacy Tool facade and route CLI/library flows through Invocation and module-level helpers.

Co-authored-by: OpenAI Codex <codex@openai.com>
Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
@MRNIU MRNIU changed the title refactor(tool): 移除 Tool 兼容 API refactor(tool): 移除旧 Tool 兼容 API Jun 1, 2026
让 build config 加载保持纯解析,不再写入 Invocation active build state,也不再在加载阶段注入 someboot args。CLI 在应用 --package/--bin 后才激活最终 BuildConfig,runner 和 board 的 *_for_cargo helper 直接基于传入的 Cargo 配置计算变量作用域。

删除已经没有 wiring 的 cargo-osrun --show-output 解析,并新增覆盖占位 package 被 CLI selector 覆盖的回归测试。

Co-authored-by: OpenAI Codex <codex@openai.com>
Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
@MRNIU MRNIU marked this pull request as ready for review June 1, 2026 08:48
Copy link
Copy Markdown

@mai-team-app mai-team-app Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review 结果:✅ Approve

验证步骤

所有自动化验证均通过:

  • cargo fmt -p ostool -- --check — 格式无误
  • cargo clippy -p ostool --all-targets --all-features -- -D warnings — 无警告
  • cargo test -p ostool — 169 个测试全部通过(144 单元测试 + 2 bin 测试 + 16 main 测试 + 1 trybuild 集成测试 + 3 qemu 测试 + 3 文档测试)
  • git diff --check — 无空白问题

代码审查

这是一个高质量的重构 PR,整体设计清晰、执行干净。主要亮点:

  1. 状态管理简化:移除了 AppContext / legacy_context 双重状态桥接,消除了潜在的状态不一致风险。InvocationState 现在是唯一的真相来源。

  2. 构建配置加载与激活分离load_build_config 变为纯解析,不再写入 Invocation 的 active build state;activate_build_config 显式地将最终配置注册为活跃状态。这使得 CLI --package/--bin 覆盖的执行顺序更加清晰正确。

  3. CLI 覆盖顺序修复:新增的回归测试 cargo_selector_overrides_config_package_before_activation 验证了占位 package 被 CLI selector 覆盖后,board/QEMU/U-Boot 配置变量展开使用的是正确的最终 Cargo selection。

  4. todo!() 替换uboot.rs 中 FIT image 生成的架构匹配从 _ => todo!() 改为 anyhow::bail!(),避免了生产环境中的 panic。

  5. 破坏性 API 变更文档完善:PR 描述详细列出了所有破坏性变更、迁移路径和 CLI 兼容性影响。

  6. 测试覆盖充分:旧 Tool API 测试全部替换为 Invocation/模块级 API 测试,并新增了覆盖场景。

未发现阻塞性问题。

Powered by mimo-v2.5-pro

@MRNIU
Copy link
Copy Markdown
Contributor Author

MRNIU commented Jun 1, 2026

AI,轻而易举哇!

@MRNIU
Copy link
Copy Markdown
Contributor Author

MRNIU commented Jun 1, 2026

@ZR233 hi,麻烦 review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant