ArceOS 构建
cargo xtask arceos build 通过 ArceOS::build()、prepare_arceos_request() 和 arceos/build/ 将 app 选择转换为可执行的 Cargo 配置。共享 Cargo 基础配置以 to_bin = false 创建 ELF,运行命令再按运行器配置准备启动产物。
1. Rust 应用构建
Rust app 的构建路径从请求解析开始,将 package、target 和 Build Config 固化为一次 Cargo 调用;每个阶段都有对应代码锚点,便于排查错误发生的位置。
1.1 请求解析
context/resolve.rs 先读取 Snapshot,再读取存在的显式或可继承 Build Config 中的 package、target 选择器。package 的优先级是 CLI → 配置 → Snapshot;没有任何来源时给出明确错误。显式 arch/target 会抑制不匹配的 Snapshot 搭配,详情见 参数与配置。
1.2 配置装载
默认配置路径是:
tmp/axbuild/config/<package>/build-<target>.toml
对于 build 和 qemu,若默认路径不存在,ensure_default_build_config_for_target() 会查找 os/arceos/configs/board/qemu-<arch>.toml 中 package 与 target 都匹配的文件并复制。找不到匹配 board 时,ensure_build_info() 才会写入 ArceosBuildConfig::default_config()。
普通 ArceOS Build Config 的最小示例:
features = ["net", "ax-driver/virtio-net"]
log = "Info"
max_cpu_num = 2
[env]
BACKTRACE = "y"
Board 文件可以额外带 package 与 target,因此既可作为 defconfig 模板,也可作为显式 --config 的请求选择器。
1.3 特性装配
load_build_config_with_makefile_features() 执行以下操作:
- 校验 Build Config 根字段和 feature;
- 合并
FEATURES环境变量; - 用 CLI
--smp覆盖max_cpu_num; - 再次校验,确保环境变量同样不能绕过规则。
随后共享 BuildInfo 逻辑把裸机 logical target 映射到 scripts/targets/std/pie/ 下的 musl JSON target,设置 build-std=std,panic_abort,准备交叉 C 编译环境、占位库和 linker wrapper。max_cpu_num > 1 会加入 smp;应用 Cargo metadata 决定该 feature 传递给 app、ax-std 或两者。
1.4 产物生成
AppContext::build() 调用 ostool_build::cargo_build(),基础 Cargo 配置中的 to_bin 为 false。生成的 ELF 路径由 ostool 输出;QEMU、U-Boot 或 Board 命令才会根据各自运行配置决定是否准备 raw BIN。