El destino de la distro vivía en 2 strings de product-userland-from-repo.sh, 1 de mirada-usb.sh y 55 tandas planas. Ahora en docs/state/targets.toml: un perfil = una imagen enviable, listando sólo las RAÍCES (lo que se pide por nombre); la clausura la calcula el grafo, no un humano. 4 perfiles: base (26), cli (46, hereda base), escritorio-mirada (14), escritorio-kde (7 raíces, cola incoming-kde). scripts/targets.py expande hereda (transitivo, con detección de ciclo) preservando el orden — mirada lo necesita. Lift-and-shift verificado: las 3 listas expandidas son byte-idénticas a los strings que reemplazan. Ninguna imagen cambia de contenido. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
58 lines
3.3 KiB
Bash
Executable File
58 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# product-userland-from-repo.sh — arma el USERLAND del producto HIDRATÁNDOLO desde el REPO FIRMADO
|
|
# (Etapa F+G, cierre del lazo): por cada paquete corre `hammer install --repo <repo> --prefix <rfs>
|
|
# --require-signed`, que verifica la firma del release, reproduce desde el `.swm` (cache-hit si ya
|
|
# está en el store) e hidrata el FHS bajo el prefix. El resultado es un árbol de userland cuya cadena
|
|
# de suministro entera viene del repo firmado, no del bootstrap hardcodeado.
|
|
#
|
|
# Uso: ./scripts/product-userland-from-repo.sh [pkg...] # default: set curado
|
|
# PKGS="bat fd jq" ./scripts/product-userland-from-repo.sh
|
|
# OVER=work/product-image/rootfs ./scripts/product-userland-from-repo.sh # hidratar SOBRE un rootfs base
|
|
# Env: REPO (def dist/repo) TRUST (def dist/keys) RFS (def work/product-userland) STORE (def ./store)
|
|
# OVER (si está, hidrata SOBRE ese dir en vez de uno limpio — p.ej. el product-rootfs base)
|
|
set -euo pipefail
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
|
|
REPO="${REPO:-dist/repo}"; TRUST="${TRUST:-dist/keys}"; STORE="${STORE:-./store}"
|
|
RFS="${OVER:-${RFS:-work/product-userland}}"
|
|
DB="$RFS/var/lib/hammer/installed.json"
|
|
|
|
# Set curado por defecto: el userland "real" que hace usable a la distro. Todos deben estar en el
|
|
# índice del repo firmado. Editá/pasá args para cambiarlo.
|
|
# El set ya NO vive acá: sale del MANIFIESTO DE OBJETIVO (docs/state/targets.toml), perfil `cli` =
|
|
# `base` (userland foundational C, de-Alpinizado, tandas base-system-1..3) + la capa CLI Rust encima.
|
|
# Cambiar el userland del producto = editar el manifiesto, que es también lo que mide el grafo de
|
|
# estado. Env PERFIL para armar otra imagen (`scripts/targets.py --lista` los muestra).
|
|
PERFIL="${PERFIL:-cli}"
|
|
DEFAULT_PKGS="$("$ROOT/scripts/targets.py" "$PERFIL")"
|
|
PKGS_LIST="${PKGS:-${*:-$DEFAULT_PKGS}}"
|
|
|
|
[ -n "${OVER:-}" ] || { rm -rf "$RFS"; mkdir -p "$RFS"; }
|
|
mkdir -p "$(dirname "$DB")"
|
|
|
|
echo "==> hidratando userland desde el repo firmado ($REPO) → $RFS"
|
|
ok=0; skip=0; fail=0; got=""
|
|
for pkg in $PKGS_LIST; do
|
|
# ¿está en el índice del repo? (evita abortar por un nombre ausente)
|
|
if ! grep -q "\"$pkg\"" "$REPO/index.json" 2>/dev/null; then
|
|
printf " - %-16s (no está en el repo, salteado)\n" "$pkg"; skip=$((skip+1)); continue
|
|
fi
|
|
if NO_PROXY=localhost NIX_STORE="${NIX_STORE:-$HOME/.nixstore}" \
|
|
"$ROOT/target/release/hammer" --store "$STORE" install "$pkg" \
|
|
--repo "$REPO" --prefix "$RFS" --trust "$TRUST" --require-signed --db "$DB" \
|
|
>/dev/null 2>"$RFS/.install-$pkg.log"; then
|
|
printf " ✓ %-16s\n" "$pkg"; ok=$((ok+1)); got="$got $pkg"
|
|
else
|
|
printf " ✗ %-16s (ver %s)\n" "$pkg" "$RFS/.install-$pkg.log"; fail=$((fail+1))
|
|
fi
|
|
done
|
|
echo "==> userland: $ok hidratados, $skip ausentes, $fail fallaron"
|
|
|
|
# verificación: cada binario presente + estático
|
|
echo "==> verificación (estático + presente):"
|
|
for pkg in $got; do
|
|
b=$(find "$RFS/usr/bin" -maxdepth 1 -type f \( -name "$pkg" -o -name "*$pkg*" \) 2>/dev/null | head -1)
|
|
[ -n "$b" ] && printf " %-16s %s\n" "$pkg" "$(file -b "$b" 2>/dev/null | grep -oE 'statically linked|dynamically linked' || echo '?')"
|
|
done
|
|
rm -f "$RFS"/.install-*.log 2>/dev/null || true
|
|
echo "==> binarios en $RFS/usr/bin: $(ls "$RFS/usr/bin" 2>/dev/null | wc -l)"
|