ax-config-macros 技术文档
路径:
components/axconfig-gen/axconfig-macros类型:过程宏库 分层:组件层 / 编译期配置展开层 版本:0.2.1文档依据:Cargo.toml、src/lib.rs、tests/example_config.rs、README.md、os/arceos/modules/axconfig/src/lib.rs、components/axplat_crates/platforms/axplat-aarch64-qemu-virt/src/lib.rs
ax-config-macros 把 TOML 配置文本直接变成 Rust 常量定义,是 axconfig* 链路中的“编译期翻译器”。它不生成配置文件,也不保存任何运行时状态;它的职责是在宏展开阶段读取配置文本,调用 ax-config-gen 解析后输出等价的 Rust 代码。
1. 架构设计分析
1.1 设计定位
从源码可见,ax-config-macros 只暴露两个过程宏:
parse_configs!:把一段 TOML 文本直接展开成 Rust 常量代码。include_configs!:按路径或环境变量读取 TOML 文件,再把文件内容交给parse_configs!。
这两个宏组成了一条非常清晰的编译期链路:
1.2 宏内部工作流程
src/lib.rs 中的真实流程如下:
-
parse_configs!- 解析输入 token 为字符串字面量。
- 在
nightlyfeature 下先执行expand_expr(),从而支持include_str!(...)这类表达式先展开再解析。 - 调用
ax_config_gen::Config::from_toml()解析 TOML。 - 再调用
dump(OutputFormat::Rust)生成 Rust 常量代码。 - 若任何一步失败,则通过
syn::Error生成编译错误。
-
include_configs!- 解析三种入参形式:
include_configs!("path/to/config.toml")include_configs!(path_env = "AX_CONFIG_PATH")include_configs!(path_env = "AX_CONFIG_PATH", fallback = "defconfig.toml")
- 以
CARGO_MANIFEST_DIR为根目录拼接路径。 - 读取文件内容后,重新生成一段
::ax_config_macros::parse_configs!(...)调用。
- 解析三种入参形式:
这个设计使得 include_configs! 本质上只是文件读取包装层,而真正的 TOML 解析与代码生成统一落到 parse_configs!。
1.3 参数语法与错误模型
IncludeConfigsArgs 的解析逻辑也值得注意:
- 允许纯路径字面量。
- 允许
path_env与fallback命名参数。 - 对重复参数、未知参数和缺失
path_env都会给出编译期报错。
因此它不是“宽松的配置宏”,而是严格约束输入语法的编译期接口。
1.4 真实使用场景
在当前仓库里有两类典型消费者:
axconfig- 使用
include_configs!(path_env = "AX_CONFIG_PATH", fallback = "dummy.toml") - 作用是把最终配置文件展开成系统常量。
- 使用
- 各平台 crate,例如
ax-plat-aarch64-qemu-virt- 使用
include_configs!(path_env = "AX_CONFIG_PATH", fallback = "axconfig.toml") - 作用是把板级默认配置或外部覆盖配置编进平台 crate。
- 使用
这说明 ax-config-macros 既服务“最终常量模块”,也服务“平台自身配置模块”。