tawasuyu

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

matar-gcc: migra-zig.sh + veredicto medido — las C-puras SON granjeables (~85%)

¿Las 47 compiler=gcc que harkaq nombró son factibles de migrar a zig, o hay que
matracar? MEDIDO, no adivinado.

migra-zig.sh: para cada receta, build con zig-cc + 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. Idempotente, acumula por lotes (probar
47 no cabe en un timeout).

Muestra de 13 C-puras: 11 MIGRAN (bzip2 expat json-c gzip htop less libpng
libyaml zstd libffi xz), 2 MATRACA (pcre2: linker version script que zig ld no
soporta; file: subdir magic). ≈85% yield.

VEREDICTO: es GRANJEADA para las ~36 C-puras. El compiler=gcc era deuda histórica
— marcadas con zig 0.13/0.16 (que segfaultaban C clásicos), zig mejoró, el gcc
quedó por inercia. ~85% migran solas; el residuo (~15%) es matraca individual por
causas concretas del build-system.

Las 11 Rust con sys-crate C son otra evaluación (gcc para el C embebido de
libgit2-sys, no el Rust) — se deja para después.

Rollout = decisión del usuario (re-hashea recetas del índice firmado 748). Correr
migra-zig.sh sobre las 47 en la granja VPS da la lista final; promover las
migrables re-firma el índice. Reporte: tandas/needs-review-harkaq/migracion-zig.md

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

2d1d40a6f18ca825536272c87e87060e12b2cda4 · by sergio · (3 months ago) · parent 0f6c84178 · browse the tree at this commit

Semantic delta

No definition changed: this change is text, documentation or data.

2 files · +93 −0

diff --git a/scripts/farm/migra-zig.sh b/scripts/farm/migra-zig.sh
new file mode 100755
index 00000000..2afba48b
--- /dev/null
+++ b/scripts/farm/migra-zig.sh
@@ -0,0 +1,66 @@
+#!/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="${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")"
diff --git a/tandas/needs-review-harkaq/migracion-zig.md b/tandas/needs-review-harkaq/migracion-zig.md
new file mode 100644
index 00000000..0618c9c5
--- /dev/null
+++ b/tandas/needs-review-harkaq/migracion-zig.md
@@ -0,0 +1,27 @@
+# Migración compiler=gcc → zig-cc (matar-gcc): ¿granjeada o matraca?
+
+**Medido, no adivinado** (`scripts/farm/migra-zig.sh`: build con zig + smoke-test del binario,
+porque el motivo del gcc era segfault en RUNTIME). Muestra de 13 C-puras:
+
+- **MIGRABLE (11/13 ≈ 85%)**: bzip2, expat, json-c, gzip, htop, less, libpng, libyaml, zstd,
+  libffi, xz. Construyen con zig y —las que tienen binario— corren limpio. El `compiler=gcc` era
+  **deuda histórica**: se marcaron con zig 0.13/0.16 (que segfaultaban C clásicos); zig mejoró y
+  el gcc quedó por inercia.
+- **MATRACA (2/13)**: pcre2 (usa un *linker version script* que zig ld no soporta), file (falla en
+  el subdir `magic`). Razones específicas de build-system, una por una.
+
+## Veredicto
+
+**Es granjeada, no matraca** — para las ~36 C-puras. ~85% migran solas cambiando `compiler` y
+promoviendo las que pasan+corren; el residuo (~15%) es matraca individual, poco y por causas
+concretas. El método está en `migra-zig.sh` (idempotente, acumula por lotes).
+
+Las **11 Rust con sys-crate C** (delta, gitui, helix, …) son otra evaluación: ahí el gcc compila
+el C embebido de `libgit2-sys`/etc, no el Rust. Migrar eso a zig es más arriesgado y lento; se
+deja para después.
+
+## Rollout (decisión de rollout, no técnica)
+
+Cambiar `compiler=gcc→zig-cc` re-hashea la receta y sus consumidores, y varias están en el índice
+firmado (748). Correr `migra-zig.sh` sobre las 47 (mejor en la granja VPS, paralela) produce la
+lista final migrable/matraca; promover las migrables es el rollout que re-firma el índice.