gioser

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…

TOML 1572Shell 203Rust 109Markdown 993728 Definitions

⎇ 32627251b1adcc995958bd60e72226040bff6125 scripts/farm/migra-zig.sh Shell · 66 lines · 3.2 KB History raw

takana: las variables de entorno leen las dos formas, gana la nueva 1c3e18516 · Sergio ·

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="${TAKANA:-${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")"