构建过程
从用户输入 cargo xtask <os> build 到编译产物的完整过程。构建过程分为八个阶段,依次完成上下文初始化、参数解析、架构映射、配置加载、Feature 解析、平台配置生成、Cargo 参数组装和最终编译执行。构建配置细节见 配置,底层执行见 运行。
构建过程的核心目标是将用户友好的高层参数(如 --arch aarch64、--smp 4)转换为 Cargo 能理解的底层编译参数(target triple、features、环境变量、链接器脚本等)。三套子系统共享前四个阶段的逻辑,在 Feature 解析和 axconfig 生成阶段开始分化,最终都汇聚到统一的 ostool cargo_build() 调用。
流程总览
八个阶段从前到后构成一条连续的流水线,每阶段以上一阶段的输出为输入。以下展示初次构建(无任何已有配置文件)的完整流程:
后续构建时,三类配置文件均已存在,流程简化为:
- 阶段 2:从已有 Snapshot 加载参数,与 CLI 合并
- 阶段 4:直接 TOML 反序列化已有 Build Info 文件(用户可手动编辑该文件调整配置)
- 阶段 6:axconfig 重新生成(每次构建都会重新生成,确保与平台包配置同步)
1. 初始化 AppContext
每个子系统的入口(ArceOS::new()、Starry::new()、Axvisor::new())创建 AppContext:
pub struct AppContext {
tool: Tool, // ostool Tool 实例
build_config_path: Option<PathBuf>,
root: PathBuf, // workspace 根目录
axvisor_dir: Option<PathBuf>, // Axvisor 源码目录(惰性初始化)
original_path: OsString, // 原始 PATH(用于 LoongArch 恢复)
debug: bool,
}
初始化步骤:
- 通过编译期常量
env!("CARGO_MANIFEST_DIR")获取 axbuild crate 所在目录,向上两级定位 workspace root。注意env!是编译期宏(非std::env::var),路径在编译时即已固定 support::logging::init_logging()配置 tracing subscriberTool::new(ToolConfig::default())初始化 ostool 底层工具
AppContext 是构建和运行的执行上下文,贯穿整个生命周期。tool 字段持有 ostool 的 Tool 实例,封装了与 cargo、QEMU 等外部工具的交互;original_path 保存原始 PATH 环境变量,用于 LoongArch LVZ QEMU 临时修改 PATH 后恢复;debug 控制是否输出详细日志。member_dirs(HashMap<String, PathBuf>)惰性缓存已解析的 workspace member 目录路径,避免同一包在多次构建/测试流程中重复调用 cargo metadata。