Repository navigation
Build System
Z User edited this page Oct 24, 2026
·
4 revisions
语言:简体中文 | Build-System-EN
这里是构建系统的开发者视角。用户级指南见仓库根目录的 Building-from-Source——本页补充开发者工作流的细节。
make -j$(nproc) kernel # fast inner loop: ELF only
make iso # + bootable ISO
make test # host unit tests (no QEMU needed)
make run-bios # boot the ISO
make clean # start fresh
make reproducible-check # two clean builds -> byte-identical ELF
tools/oc_cc.sh 给每条编译规则包了一层内容寻址缓存:
键 = 编译器身份 + 完整旗标集 + 源文件内容哈希
- 每个头文件依赖的内容哈希(依赖探测是一次
gcc -MM -MG扫描,并剥掉 -MMD/-MP 旗标,让两者互不打架)。
- 发布树冷构建:46.6 秒。热构建:14.4 秒(186/186 命中, 3.2 倍提速)。热对象与冷对象逐字节一致。
-
make cache-stats/make cache-clear负责管理它。 - 过期缓存条目不可能存在:任何头文件改动都会改变键。
-
OC_RELEASE_VERSION默认取 Makefile 中的1.0.0字面量(见 Versioning);在命令行 覆盖(make OC_RELEASE_VERSION=1.0.1-test1 iso),否则它会 进入横幅、uname -a、OTA 清单与 ISO 卷标。 - 构建号是提交计数(
git rev-list count)——它供给uname以及发布时 update.json 的 "build" 字段。
-
SRC zip(
make src-zip):一次git archive——目录树 顺序、提交时间戳、索引权限全固定;同一提交产出逐字节一致。 经由SRC_EXCLUDE排除 website/out/build/deliverables 树。 -
OTA(
make ota):内核 ELF + 清单;清单携带构建日 (UTC),使包在同一天内逐字节可复现。 -
ELF:全树任何位置都没有 DATE/TIME/TIMESTAMP
(一道 make 门禁专门 grep 它们)、链接顺序固定、
strip --strip-debug移除携带路径的节。
make defconfig # .config with everything on
make menuconfig # interactive (tools/oc_menuconfig.sh)
make CONFIG_TUI=n CONFIG_CHINESE=n iso # 216-command image
make ARCH=arm64 # PL011 bring-up shell ELF
make ARCH=riscv # NS16550A bring-up shell ELF
配置器生成带比较保护的宏到 kernel/generated/config_gen.h;
被关闭的特性会路由到真正的 ASCII 等价物(console_cn ->
screen_console),而不是删代码。GNU make 的 % 通配符限制
(一条模式里只有第一个 % 生效)正是 TUI/中文源码过滤器长成
那个样子的原因——不要去"简化"它们。
tools/build.sh 同时是一个函数库:
source tools/build.sh
build_all; build_iso; config_load; cache_lookup; cross_compile ...
tools/build.sh api-selftest # verifies the 8 spec'd interfaces
发布自动化(见 Release-Process) 直接组合这些函数,而不是去解析 make 输出。