builder: --swap del toolchain — montar make hammer sobre Alpine (variante b, pieza 1)
Segundo paso del auto-alojamiento *puro* (SDD 11 §7.2b): tras sellar GNU make
4.4.1 desde fuente (commit 749ea9e), ahora el builder puede *usarlo*. El swap
reemplaza una a una las piezas que el builder toma de Alpine por recetas hammer,
con Stage 2 reverificando que el byte-output no cambia.
- `BuilderSpec.swaps: Vec<ToolchainSwap{name,artifact,rel_path}>`: monta el binario
sellado sobre el path Alpine en /toolchain (estático musl ⇒ sin shim del loader).
- `swaps_digest` (ordenado por nombre) entra al hash lógico del builder ⇒ la
procedencia deja de ser "todo Alpine" y se vuelve auditable para el log de
transparencia. Vacío ⇒ digest "" (compat hacia atrás: builder pura-Alpine
conserva su hash previo).
- CLI: `hammer bootstrap builder --swap make=<hash>[:rel_path]` (repetible;
rel_path por defecto usr/bin/<name>).
- selfhost-verify.sh: opt-in `SWAP_MAKE=1` (construye recipes/make.toml y lo
swapea) + `SWAPS="name=hash …"` para swaps extra. Default off ⇒ corrida
pura-Alpine idéntica a la baseline conocida-buena.
Validado en el host contra el store real: pura `b3:8a370f5d…` vs swapped
`b3:e7e2282c…`, y /toolchain/usr/bin/make queda hardlinkeado al artefacto
fbad44ac… (ELF estático, no el dinámico de Alpine). 3 tests nuevos
(swap aplica, hash cambia, error si falta el binario). 37 tests verdes.
Pendiente: correr Stage 2 in-VM con el swap y confirmar que of_tree(stage1') == ref
(el make hammer compila los 4/4 idéntico al de Alpine ⇒ toolchain intercambiable).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -108,13 +108,30 @@ for m in overlay e1000; do
|
||||
fi
|
||||
done
|
||||
|
||||
# 3b) Auto-alojamiento *puro* (variante b, SDD 11 §7.2b): reemplazar piezas del toolchain Alpine por
|
||||
# recetas hammer construidas desde fuente, con Stage 2 reverificando que `of_tree(stage1')` NO
|
||||
# cambia (el make hammer compila los 4/4 igual de bit-a-bit que el de Alpine). Opt-in:
|
||||
# SWAP_MAKE=1 → construye recipes/make.toml y lo monta sobre /toolchain/usr/bin/make.
|
||||
# SWAPS="name=hash …" → swaps explícitos extra (formato del flag --swap).
|
||||
# Por defecto, off ⇒ corrida pura-Alpine (variante a), idéntica a la baseline conocida-buena.
|
||||
SWAP_ARGS=()
|
||||
if [[ "${SWAP_MAKE:-0}" == 1 ]]; then
|
||||
say "variante b — construir make desde fuente (recipes/make.toml) y swapearlo en /toolchain"
|
||||
MAKE_HASH="$("$HAMMER" --store "$STORE" build recipes/make.toml | grep -oE 'b3:[0-9a-f]{64}' | tail -1)"
|
||||
[[ "$MAKE_HASH" == b3:* ]] || die "no obtuve el hash sellado de make"
|
||||
say "make hammer: $MAKE_HASH"
|
||||
SWAP_ARGS+=(--swap "make=$MAKE_HASH")
|
||||
fi
|
||||
for s in ${SWAPS:-}; do SWAP_ARGS+=(--swap "$s"); done
|
||||
|
||||
# 4) Ensamblar el builder con la referencia embebida.
|
||||
say "ensamblar builder (toolchain in-rootfs + hammer baseline + ref)"
|
||||
say "ensamblar builder (toolchain in-rootfs + hammer baseline + ref${SWAP_ARGS:+ + swaps})"
|
||||
"$HAMMER" --store "$STORE" bootstrap builder \
|
||||
--stage1 "$ROOTFS_HASH" --seed-hash "$SEED_HASH" \
|
||||
--hammer-bin "$HAMMER_BIN" \
|
||||
--toolchain "$TOOLCHAIN" --toolchain-tag "$TOOLCHAIN_TAG" \
|
||||
--ref-content "$REF" \
|
||||
"${SWAP_ARGS[@]}" \
|
||||
--work-cache work --out work/builder-rootfs
|
||||
|
||||
# 4b) Preseed opcional para abaratar el rebuild in-VM (sólo hammerd se reconstruye).
|
||||
|
||||
Reference in New Issue
Block a user