axbuild
路径:
scripts/axbuild类型:库 crate 分层:工具层 / 宿主侧构建与测试基础库 版本:0.3.0-preview.3文档依据:Cargo.toml、src/lib.rs、src/arceos/mod.rs、src/arceos/build.rs、src/arceos/ostool.rs、src/arceos/config.rs、src/arceos/features.rs、src/axvisor/image/mod.rs、src/axvisor/xtest/mod.rs
axbuild 是当前工作区里承上启下的宿主侧构建基础库。它不属于目标镜像,也不参与内核热路径;它负责把“应用配置、axplat-dyn target/linker 装配、feature 装配、QEMU 参数、产物路径”这些宿主机侧信息整理成可执行的构建/运行计划,并复用 ostool 构建桥接能力。
架构设计
设计定位
axbuild 的最上层接口很简洁:
lib.rs只暴露两个子域:arceos和axvisorarceos::AxBuild提供build()、run_qemu()、test()这组高层宿主侧动作axvisor子模块提供镜像管理、QEMU 测试、开发空间与 VM 配置相关工具
这说明 axbuild 不是“一个 CLI”,而是“多个 CLI 共享的构建库”。当前根工作区 tg-xtask、以及 os/axvisor 的宿主侧命令,都是建立在它之上的。
1.2 ArceOS 构建链路
arceos::build.rs 展现了当前最关键的构建流程:
其中几个实现细节非常关键:
prepare_artifacts()会先解析架构、SMP、内存、feature 等信息。- 旧平台配置生成路径已经移除;
axplat-dyn是当前唯一维护的构建路径。 PlatformResolver负责决定动态平台 target、链接参数和构建时环境。is_c_app()会读取应用Cargo.toml,通过是否出现ax-libc判断这是 C 应用还是 Rust 应用。
因此,axbuild 是把 BuildInfo 配置、feature 链和实际构建链连接起来的中枢。
1.3 feature 装配的真实策略
axbuild 并不是简单把用户输入的 feature 原样透传给 Cargo,而是做了分层解析:
- 旧别名和已移除的平台选择项会先被归一化或过滤。
- 普通能力 feature,例如
fs、net、multitask,会根据应用实际依赖选择ax-std/、ax-feat/或ax-libc/前缀。 max_cpu_num > 1时才注入对应前缀的smp。
detect_ax_feature_prefix_family() 甚至会通过 cargo metadata 检查应用是否直接依赖 ax-std 或 ax-feat。这一步体现了 axbuild 对真实调用关系的感知,而不是纯字符串拼接。
1.4 宿主环境与目标环境的边界
src/arceos/ostool.rs 显式构造了目标构建所需的宿主环境变量:
AX_ARCHAX_LOGAX_IPAX_GW
同时还会根据 target 选择动态平台 target JSON 和链接脚本参数。由此可以看到:
axbuild本身始终运行在宿主机- 它只负责告诉 Cargo 和下游工具“该怎样构建目标”
- 它并不进入最终镜像,也不会在目标机上运行
1.5 Axvisor 工具子系统
axbuild::axvisor 不是简单附带模块,而是一套较完整的宿主侧工具集:
image:镜像列表、下载、校验、解压、删除、同步xtest:根据架构和 VM 配置自动准备镜像并跑 QEMU 测试- 其他模块:构建目录、VM 配置、命令分发、开发空间管理等
这使得 axbuild 同时服务 ArceOS/StarryOS 的统一构建和 Axvisor 的专用宿主工具链。
核心功能
功能概览
- 解析和合并 ArceOS 构建配置。
- 生成必要的
.qemu.toml等宿主侧中间产物。 - 计算模块 feature 与库 feature 的正确装配方式。
- 调用
ostool完成cargo build或 QEMU 运行。 - 为 Axvisor 提供镜像管理和 QEMU 测试辅助。
2.2 高层 API
在 ArceOS 侧,最核心的高层接口是:
AxBuild::from_overrides(...)AxBuild::build()AxBuild::run_qemu()AxBuild::test()
这些接口都不直接执行复杂逻辑,而是进一步委托给:
BuilderQemuRunnerFeatureResolverPlatformResolverostool桥接模块