sergio/takana
> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…
matar-gcc: migra-zig.sh + veredicto medido — las C-puras SON granjeables (~85%)
1#!/bin/sh
2# migra-zig.sh — ¿cuáles de las recetas compiler=gcc migran a zig-cc? (frente matar-gcc)
3#
4# harkaq nombró 47 recetas que compilan con el gcc de Alpine. Muchas se marcaron cuando zig era
5# peor (0.13/0.16 segfaultaban C clásicos); zig mejoró. Este script MIDE cuáles ya migran, no lo
6# adivina. Para cada una: build con zig-cc y —lo crítico— SMOKE-TEST del binario, porque el
7# motivo del gcc era segfault en RUNTIME, no fallo de build. Un artefacto que sella pero
8# segfaultea es peor que gcc.
9#
10# migra-zig.sh # prueba todas las compiler=gcc
11# migra-zig.sh htop less # sólo esas
12#
13# Salidas: work/migra-zig/{migrable,matraca}.txt
14set -u
15cd "$(dirname "$0")/../.."
16HAMMER="${HAMMER:-./target/debug/hammer}"
17OUT="work/migra-zig"; mkdir -p "$OUT"
18# ACUMULA entre corridas (no trunca): probar las 47 no cabe en un timeout, así que se corre por
19# lotes y cada lote SUMA. `reg` evita duplicar una receta ya clasificada en una corrida previa.
20touch "$OUT/migrable.txt" "$OUT/matraca.txt"
21ya_hecha() { grep -qE "^$1 " "$OUT/migrable.txt" "$OUT/matraca.txt" 2>/dev/null; }
22
23if [ $# -gt 0 ]; then LISTA="$*"; else
24 LISTA=$(grep -lE '^\s*compiler\s*=\s*"gcc"' recipes/*.toml | xargs -n1 basename | sed 's/.toml//')
25fi
26
27for n in $LISTA; do
28 r="recipes/$n.toml"
29 [ -f "$r" ] || continue
30 ya_hecha "$n" && continue # idempotente: no re-medir lo ya clasificado
31 tmp="recipes/.mz-$n.toml"
32 # compiler=zig-cc + nombre nuevo (forzar build real). El sed del name tolera 1+ espacios.
33 sed -E -e 's/^(\s*compiler\s*=\s*)"gcc"/\1"zig-cc"/' -e "s/^(name\s*=\s*)\"$n\"/\1\"$n-mz\"/" "$r" > "$tmp"
34
35 hash=$(timeout "${POR:-200}" "$HAMMER" build "$tmp" --store "$PWD/store" 2>/dev/null | grep -oE '^b3:[a-f0-9]{64}' | head -1)
36 rm -f "$tmp"
37 if [ -z "$hash" ]; then
38 echo "$n build-falla" >> "$OUT/matraca.txt"; echo " ✗ $n (no construye con zig)"; continue
39 fi
40
41 # Smoke-test: si el artefacto trae binarios, correrlos (--version/--help). Static musl ⇒ corren
42 # directo del store. Si NINGUNO corre limpio ⇒ el gcc estaba por un segfault de runtime real.
43 art="store/${hash#b3:}-$n-mz"
44 bins=$(find "$art/usr/bin" "$art/bin" -type f 2>/dev/null)
45 if [ -z "$bins" ]; then
46 # Es una lib (sin binario): build OK basta como señal. El consumidor validará el link.
47 echo "$n lib-build-ok" >> "$OUT/migrable.txt"; echo " ✓ $n (lib, construye con zig)"; continue
48 fi
49 ok=0; seg=0
50 for b in $bins; do
51 "$b" --version >/dev/null 2>&1 || "$b" --help >/dev/null 2>&1 || "$b" -V >/dev/null 2>&1
52 rc=$?
53 # 139=segfault (SIGSEGV+128), 132=SIGILL. Un binario útil suele dar 0/1/2 a --version/--help.
54 case $rc in 139|132|134|136) seg=1 ;; 0|1|2) ok=1 ;; esac
55 done
56 if [ "$seg" = 1 ]; then
57 echo "$n SEGFAULT-runtime" >> "$OUT/matraca.txt"; echo " ✗ $n (zig lo SEGFAULTEA — el gcc era por esto)"
58 elif [ "$ok" = 1 ]; then
59 echo "$n bin-corre" >> "$OUT/migrable.txt"; echo " ✓ $n (construye Y corre con zig)"
60 else
61 echo "$n bin-no-verificable" >> "$OUT/matraca.txt"; echo " ? $n (construye, binario no verificable)"
62 fi
63done
64
65echo "─────"
66echo "MIGRABLE: $(wc -l < "$OUT/migrable.txt") MATRACA: $(wc -l < "$OUT/matraca.txt")"