boot2 release — @ARCH@
This tarball is a self-contained input bundle for the boot2 bootstrap
chain on @ARCH@. Extract it, run ./verify.sh, and the chain will be
re-run from boot0 through boot7 using only the bundled inputs. Stage
outputs are sha256-compared against OUTPUT_MANIFEST.txt; every file in
the final installed toolchain is checked against TOOLCHAIN_MANIFEST.txt.
The tarball is content-addressed: its sha256 reflects only the bundled
inputs + manifests. Provenance (the git rev it was built from, build
date, build host arch) lives in the sidecar <tarball>.provenance
file in the same directory as the tarball, not inside it. Validated
releases also publish <name>.outputs.sha256, an external copy of the
artifact hashes bundled as OUTPUT_MANIFEST.txt, and
<name>.toolchain.sha256, the detailed installed-tree hashes.
Contents
boot2-@ARCH@/
├── README.md this file
├── verify.sh build + diff driver
├── INPUT_MANIFEST.txt sha256 of every file under src/ + boot/
├── OUTPUT_MANIFEST.txt sha256 of expected per-stage artifacts
├── TOOLCHAIN_MANIFEST.txt sha256 of every file installed by boot7
├── src/ sealed source tree (canonical inputs)
│ ├── bin/hex0-seed vendored ELF seed (the only opaque input)
│ ├── src/ all textual sources: P1, M1pp, hex2pp,
│ │ scheme1, cc, tcc, mes-libc, musl, kernel
│ └── run/ run.scm files driving boot3..boot6
└── boot/ boot0..boot7 stage drivers + libs
├── boot{0..7}.sh
├── lib-{arch,pipeline,runscm}.sh
└── containers/ Containerfile.{busybox,empty} (DRIVER=podman)
There is no bootprep/ and no vendor/ — every input the chain needs
is already inside src/. bootprep/ exists in the upstream repo to
populate src/; this tarball ships the populated tree directly.
Trust path
src/bin/hex0-seed is the only opaque artifact in the chain (a few
hundred bytes; vendored from live-bootstrap's stage0-posix). Every
other file under src/ is text and is hashed in INPUT_MANIFEST.txt.
You can audit the manifest end-to-end before running anything.
Running
macOS note: with
DRIVER=podman, the podman VM only sees host paths under/Users/. Extract the tarball under$HOME(not/tmpor/private/tmp), or boot0 will fail with astatfs ... no such file or directoryerror.verify.shchecks this and aborts early with a clearer message.
tar xzf boot2-@ARCH@.tar.gz
cd boot2-@ARCH@
# Default: DRIVER=podman. Builds container images on first run.
./verify.sh
# After that podman pass, re-run inside its boot6-built kernel under qemu
# to close the loop:
DRIVER=seed ./verify.sh
verify.sh does three things:
- Stages
src/intobuild/@ARCH@/src/(the layout the boot stage scripts expect). - Runs
boot/boot0.sh…boot/boot7.shin order under the selected driver. - Hashes each artifact listed in
OUTPUT_MANIFEST.txt, then checks the complete installedboot7/toolchain/tree againstTOOLCHAIN_MANIFEST.txt.
Exit status is 0 iff every artifact matches.
After verification, the ready-to-use static toolchain is at:
build/@ARCH@/<driver>/boot7/toolchain/
├── bin/tcc
├── lib/{libc.a,crt1.o,crti.o,crtn.o}
├── lib/tcc/libtcc1.a
├── lib/tcc/include/stdarg.h compiler-owned varargs ABI
├── include/
└── MANIFEST.sha256
The compiler resolves this layout relative to bin/tcc. A normal static
compile and link therefore needs no explicit include, CRT, or library paths:
build/@ARCH@/<driver>/boot7/toolchain/bin/tcc hello.c -o hello
Drivers
| DRIVER | runtime | prereqs |
|---|---|---|
podman |
each stage runs in a minimal container | podman (rootless ok), qemu-user-static for cross-arch |
seed |
boot0..6 run in seed-kernel; boot7 installs their outputs |
one prior DRIVER=podman pass to mint the boot6 kernel; qemu-system-@ARCH@ |
The output manifest is driver-agnostic: the same artifacts must
hash identically under both drivers. The upstream repo's
tests/seed-accept.sh harness verifies this byte-equivalence.
Verifying input integrity
# macOS:
shasum -a 256 -c INPUT_MANIFEST.txt
# Linux:
sha256sum -c INPUT_MANIFEST.txt
Re-running just the diff
If you've already built and just want to re-check the manifest:
./verify.sh --check-only
Useful env vars (passthrough to boot/boot.sh)
| var | default | meaning |
|---|---|---|
BOOT3_TIMEOUT |
1800 | scheme1-driven boot3, seconds |
BOOT4_TIMEOUT |
5400 | tcc1/tcc2 self-host chain |
BOOT5_TIMEOUT |
7200 | musl build |
BOOT6_TIMEOUT |
1200 | seed-kernel link |
QEMU_MEM |
3072M | guest RAM for DRIVER=seed |