Files
takana/scripts/kde/hydrate-fhs.sh
T
Sergio 1c3e185167 takana: las variables de entorno leen las dos formas, gana la nueva
TAKANA_X con caída a HAMMER_X (ADR 0016). No es un sed: estas variables son
contrato de usuario —knobs del instalador, el entorno del worker, mirror-env.sh—
y viven en perfiles de shell y units FUERA del repo, así que un renombre duro no
falla ruidosamente: la variable no aparece, se toma el default y el build se
comporta distinto sin que nada lo diga.

Rust: takana_core::env::{var,var_os} toma el nombre canónico y deriva el viejo
cambiando el prefijo — se le pasa TAKANA_* para que un grep del nombre nuevo
encuentre todas las lecturas. 5 tests, con DOS controles negativos: sin ninguna
de las dos no hay valor, y un nombre sin prefijo no inventa una caída.
Migrados los 17 sitios directos y los indirectos que el grep no mostraba
(bases_de_mirror, las constantes de kernel_cmd, ROOT_ENV de qorpa, env_path de
recover). takana-recover lleva la caída inline: es un mini-binario que se copia
a /usr/sbin y no vale arrastrarle una dep entera por dos líneas.

Scripts: 30 lecturas pasan a default, manteniendo el
nombre INTERNO de la variable para no tocar sus 190 usos.

Y donde el script EXPORTA en vez de leer, se ponen LAS DOS (mirror-env.sh y el
fragmento in-VM de bootstrap): ahí el lector puede ser un binario viejo —worker
sin recompilar, el /usr/bin/hammer pinado del baseline— que sólo conoce HAMMER_*.
La caída sirve para lectores nuevos; los viejos necesitan que la vieja siga puesta.

Verificado de punta a punta con el binario, no sólo con unit tests: HAMMER_LAB
sigue surtiendo efecto, TAKANA_LAB hace lo mismo, y con las dos gana TAKANA_LAB.
605 tests en verde y el hash de zlib sigue en b3:dc363f26… , intacto.

Cambio de comportamiento que va aparte y hay que decir: el hostname por defecto
de una instalación nueva pasa de 'hammer' a 'takana' (sólo si no se fija ninguna
de las dos variables).

NO se tocan: las rutas /var/lib/hammer de sistemas instalados, el volid
HAMMER_LIVE del ISO, ni el namespace HARKAQ_*, que es de otro subsistema.
2026-09-09 19:14:49 +00:00

71 lines
3.5 KiB
Bash

#!/usr/bin/env bash
# hydrate-fhs.sh — hidrata un FHS runtime KDE desde el repo firmado, instalando el CIERRE completo.
#
# `hammer install <pkg> --prefix P` sólo hidrata los archivos de <pkg>, NO de su cierre. Para un
# rootfs runtime usable (que capture todas las `.so`), hay que instalar cada paquete del cierre en el
# MISMO prefix (igual que product-userland-from-repo.sh). El store del worker está caliente ⇒ cache-hit.
#
# Las recetas de LIBS KDE declaran `target_bin=/usr/bin/<pkg>` que no existe (son libs, no binarios):
# `install` hidrata los ficheros y LUEGO falla la aserción con exit 1. Lo toleramos: contamos éxito si
# el paquete dejó ficheros en el prefix.
#
# Uso: TARGET=qt6-qtdeclarative ./hydrate-fhs.sh (default)
set -uo pipefail
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
REPO="${REPO:-work/repo-kde}"; TRUST="${TRUST:-dist/keys}"; STORE="${STORE:-./store}"
RFS="${RFS:-work/kde-rootfs}"
# TARGETS = uno o varios paquetes tope (unión de cierres). TARGET (singular) sigue soportado.
TARGETS="${TARGETS:-${TARGET:-qt6-qtdeclarative}}"
HAMMER="${TAKANA:-${HAMMER:-./target/release/takana}}"
DB="$RFS/var/lib/hammer/installed.json"
# cierre transitivo de TODOS los targets, leído del índice (deps + aliases ya resuelven). Excluimos
# herramientas puramente de build (no aportan runtime) para acelerar; si algo falta lo delata ldd.
CLOSURE=$(python3 - "$REPO/index.json" $TARGETS <<'PY'
import json,sys
idx=json.load(open(sys.argv[1])); targets=sys.argv[2:]
by={p['name']:p for p in idx['packages']}
BUILD_ONLY={'cmake','samurai','meson','ninja','bison','flex','gperf','util-macros','xorgproto',
'xcb-proto','wayland-protocols','pkgconf','mako','markupsafe','packaging','python3','extra-cmake-modules',
'qttools','qt6-qttools','intltool','perl','perl-xml-parser','gettext-tiny','m4','autoconf','automake',
'libtool','util-macros'}
# PREFERIR el nombre real qt6-* sobre el alias qt-corto: install nombra el artefacto por la clave del
# índice, y sólo `<hash>-qt6-qtdeclarative` está sellado (no `<hash>-qtdeclarative`) ⇒ instalar el alias
# fuerza cache-miss+rebuild. El alias existe sólo para resolver deps DENTRO del .swm, no para instalar.
def canon(n):
if n.startswith('qt') and not n.startswith('qt6-') and ('qt6-'+n) in by:
return 'qt6-'+n
return n if n in by else ('qt6-'+n if 'qt6-'+n in by else n)
seen=set(); order=[]
def visit(n):
n=canon(n)
if n in seen or n not in by: return
seen.add(n)
for d in by[n].get('deps',[]): visit(d)
order.append(n)
for t in targets: visit(t)
for n in order:
if n not in BUILD_ONLY: print(n)
PY
)
mkdir -p "$(dirname "$DB")"
echo "==> hidratando cierre runtime de [$TARGETS] → $RFS ($(echo "$CLOSURE"|wc -w) pkgs)"
ok=0; fail=0
for pkg in $CLOSURE; do
before=$(find "$RFS" -type f 2>/dev/null | wc -l)
NO_PROXY=localhost NIX_STORE="${NIX_STORE:-$HOME/.nixstore}" \
"$HAMMER" --store "$STORE" install "$pkg" --repo "$REPO" --prefix "$RFS" \
--trust "$TRUST" --require-signed --db "$DB" >"$RFS/.h-$pkg.log" 2>&1
rc=$?
after=$(find "$RFS" -type f 2>/dev/null | wc -l)
if [ "$after" -gt "$before" ] || grep -q "hidratados" "$RFS/.h-$pkg.log"; then
printf " ✓ %-22s (+%s ficheros%s)\n" "$pkg" "$((after-before))" \
"$([ $rc -ne 0 ] && echo ', target_bin tolerado')"
ok=$((ok+1))
else
printf " ✗ %-22s rc=%s (ver %s)\n" "$pkg" "$rc" "$RFS/.h-$pkg.log"; fail=$((fail+1))
fi
done
echo "==> $ok hidratados, $fail fallaron; .so totales: $(find "$RFS" -name '*.so*'|wc -l)"