用途:在 Filament 代码库中维护严格、无环的头文件包含分层,用于优化编译时间、防止头文件污染并识别缺失依赖。适用于新增或修改 C++ 文件的 #include 指令时。
主要能力与规则:包含需按层次分组,层与层之间恰好用一个空行分隔,自上而下依次为——Layer 0 对应头文件(如 details/Foo.h,置于最上方并隔离);Layer 0.5 Windows 清理头(<utils/unwindows.h>,仅在需要时固定第二位);Layer 1 私有/本地头文件(使用双引号,仅限本地目标 src/ 下的私有头);Layer 2 内部专有库(公有与私有均用尖括号,如 <filaflat/...>、<backend/...>、<utils/...>、<math/...>,其优先级顺序由 CMakeLists.txt 目标链接动态计算);Layer 3 第三方库(<tsl/...>、<absl/...>、<jni.h>);Layer 4 C++ 标准库(含 <c...> 包装);Layer 5 POSIX 系统头(<unistd.h>、<sys/stat.h>,位于 C++ 标准库下、C 标准库上);Layer 6 C 标准库(以 .h 结尾的旧式 C 系统头,如 <stdint.h>、<stddef.h>)。Layer 1 另有排序与间距规则:无子目录前缀的平铺头排在嵌套子目录头之上,并按第一级子目录前缀分组,组间恰好一个空行。
使用方式:不要手动排序或猜测目标依赖,修改 C++ 文件后必须运行仓库自带的动态拓扑包含格式化工具:./tools/reorganize-headers/run.py <file_or_directory>。
限制:该工具会解析 CMakeLists.txt 以拓扑排序专有库,并含有预处理安全检查,避免破坏平台条件包含守卫;除此之外的其他限制暂未提供。