Files
takana/scripts/farm/migra-zig.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

67 lines
3.2 KiB
Bash
Executable File

#!/bin/sh
# migra-zig.sh — ¿cuáles de las recetas compiler=gcc migran a zig-cc? (frente matar-gcc)
#
# harkaq nombró 47 recetas que compilan con el gcc de Alpine. Muchas se marcaron cuando zig era
# peor (0.13/0.16 segfaultaban C clásicos); zig mejoró. Este script MIDE cuáles ya migran, no lo
# adivina. Para cada una: build con zig-cc y —lo crítico— SMOKE-TEST del binario, porque el
# motivo del gcc era segfault en RUNTIME, no fallo de build. Un artefacto que sella pero
# segfaultea es peor que gcc.
#
# migra-zig.sh # prueba todas las compiler=gcc
# migra-zig.sh htop less # sólo esas
#
# Salidas: work/migra-zig/{migrable,matraca}.txt
set -u
cd "$(dirname "$0")/../.."
HAMMER="${TAKANA:-${HAMMER:-./target/debug/hammer}}"
OUT="work/migra-zig"; mkdir -p "$OUT"
# ACUMULA entre corridas (no trunca): probar las 47 no cabe en un timeout, así que se corre por
# lotes y cada lote SUMA. `reg` evita duplicar una receta ya clasificada en una corrida previa.
touch "$OUT/migrable.txt" "$OUT/matraca.txt"
ya_hecha() { grep -qE "^$1 " "$OUT/migrable.txt" "$OUT/matraca.txt" 2>/dev/null; }
if [ $# -gt 0 ]; then LISTA="$*"; else
LISTA=$(grep -lE '^\s*compiler\s*=\s*"gcc"' recipes/*.toml | xargs -n1 basename | sed 's/.toml//')
fi
for n in $LISTA; do
r="recipes/$n.toml"
[ -f "$r" ] || continue
ya_hecha "$n" && continue # idempotente: no re-medir lo ya clasificado
tmp="recipes/.mz-$n.toml"
# compiler=zig-cc + nombre nuevo (forzar build real). El sed del name tolera 1+ espacios.
sed -E -e 's/^(\s*compiler\s*=\s*)"gcc"/\1"zig-cc"/' -e "s/^(name\s*=\s*)\"$n\"/\1\"$n-mz\"/" "$r" > "$tmp"
hash=$(timeout "${POR:-200}" "$HAMMER" build "$tmp" --store "$PWD/store" 2>/dev/null | grep -oE '^b3:[a-f0-9]{64}' | head -1)
rm -f "$tmp"
if [ -z "$hash" ]; then
echo "$n build-falla" >> "$OUT/matraca.txt"; echo " ✗ $n (no construye con zig)"; continue
fi
# Smoke-test: si el artefacto trae binarios, correrlos (--version/--help). Static musl ⇒ corren
# directo del store. Si NINGUNO corre limpio ⇒ el gcc estaba por un segfault de runtime real.
art="store/${hash#b3:}-$n-mz"
bins=$(find "$art/usr/bin" "$art/bin" -type f 2>/dev/null)
if [ -z "$bins" ]; then
# Es una lib (sin binario): build OK basta como señal. El consumidor validará el link.
echo "$n lib-build-ok" >> "$OUT/migrable.txt"; echo " ✓ $n (lib, construye con zig)"; continue
fi
ok=0; seg=0
for b in $bins; do
"$b" --version >/dev/null 2>&1 || "$b" --help >/dev/null 2>&1 || "$b" -V >/dev/null 2>&1
rc=$?
# 139=segfault (SIGSEGV+128), 132=SIGILL. Un binario útil suele dar 0/1/2 a --version/--help.
case $rc in 139|132|134|136) seg=1 ;; 0|1|2) ok=1 ;; esac
done
if [ "$seg" = 1 ]; then
echo "$n SEGFAULT-runtime" >> "$OUT/matraca.txt"; echo " ✗ $n (zig lo SEGFAULTEA — el gcc era por esto)"
elif [ "$ok" = 1 ]; then
echo "$n bin-corre" >> "$OUT/migrable.txt"; echo " ✓ $n (construye Y corre con zig)"
else
echo "$n bin-no-verificable" >> "$OUT/matraca.txt"; echo " ? $n (construye, binario no verificable)"
fi
done
echo "─────"
echo "MIGRABLE: $(wc -l < "$OUT/migrable.txt") MATRACA: $(wc -l < "$OUT/matraca.txt")"