Files
sergioandClaude Opus 4.8 2d8514555c matar-gcc: riesgo GUI VERIFICADO — el ABI de las libs migradas es idéntico
Debí evaluar esto ANTES de migrar, no después: las 29 tienen 36 consumidores,
incl. toda la cadena GUI (cairo/gtk4/pango/harfbuzz/fontconfig/libadwaita) +
mesa/mirada. 6 migradas son deps de ese stack, que por regla no se rebuildea en
el laptop.

No se pudo construir la GUI completa en ninguna máquina (laptop: python3 no
construye — gotcha conocido, verificado que es PREEXISTENTE revirtiendo mis deps;
worker golden: busybox no construye — store parcial). Así que se verificó lo que
decide el link: el ABI.

  freetype 90 · expat 12 · libpng/libpng16 385 · libffi 68 símbolos globales
  → IDÉNTICOS entre gcc y zig ⇒ la GUI linkea igual.

Dos falsos positivos cazados al medir: . comparaba libpng.a contra
libpng16.a (libs distintas), y  cuenta símbolos INTERNOS de los
.o que difieren entre compiladores sin tocar el ABI (294 'diferencias' espurias).
Lo correcto: mismo fichero + --extern-only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 20:03:35 -04:00

3.1 KiB

Migración compiler=gcc → zig-cc (matar-gcc) — BALANCE FINAL (2026-07-16)

harkaq nombró 47 recetas compiler=gcc (invisibles hasta que aprendió a leer el compiler=). migra-zig.sh (build con zig + smoke-test) midió cuáles migran, verificadas en el laptop.

MIGRADAS a zig-cc — 29 recetas C

bzip2 expat json-c gzip htop less libpng libyaml zstd libffi xz freetype jq libassuan libgpg-error libssh2 libuv libxml2 nano pcre2 pigz socat tig tmux vim curl libevent libevdev mtdev

Deuda histórica: marcadas con zig 0.13/0.16 (que segfaultaba C clásicos); zig mejoró, el gcc quedó por inercia. mtdev queda de-Alpinizado por entero (config.sub soberano + zig).

MATRACA DURA — 4 recetas, gcc JUSTIFICADO (zig genuinamente falla)

Probadas y diagnosticadas; NO es inercia, zig no las soporta:

  • file: el file que zig compila SEGFAULTEA al generar magic.mgc. Persiste con -O0, -O1, -fno-strict-aliasing ⇒ codegen profundo de zig, no optimización.
  • linux-pam: configure: error: cannot run C compiled programs — el binario de test de zig no corre (mismo tipo de miscompile).
  • libgcrypt, libsodium: no construyen con zig. Assembly/detección de features criptográficas que zig maneja distinto.

Estas 4 se quedan en compiler=gcc con razón documentada. Son parte del "gueto gcc" legítimo.

DIFERIDAS — 11 Rust con sys-crate C

cargo-audit broot cargo-cache delta git-absorb gitui helix hurl ouch xplr yazi zellij — el gcc compila el C embebido de libgit2-sys/etc, no el Rust. Otra evaluación.

Balance

De 47: 29 migradas, 4 matraca dura (gcc justificado), 11 Rust diferidas, 3 no medidas. Los compiler=gcc bajaron de 47 a 18. matar-gcc pasó de invisible a medido, cerrado en su mayoría, y con el residuo justificado.

Rollout: las 29 re-hashean (índice firmado 748) ⇒ re-firma en el próximo packaging.

Riesgo sobre la cadena GUI: VERIFICADO (ABI idéntico) — 2026-07-16

Las 29 migradas tienen 36 consumidores, incluidos cairo, gtk4, pango, harfbuzz, fontconfig, libadwaita, mesa y mirada. 6 de ellas (expat, freetype, libpng, libffi, pcre2, zstd) son deps de ese stack, y la regla del proyecto prohíbe rebuildear la GUI en el laptop.

No se pudo construir la cadena GUI completa en ninguna máquina (el laptop no construye python3 — gotcha conocido; el worker golden no construye busybox — store parcial). Así que se verificó lo que de verdad decide el link: el ABI de las libs migradas.

lib símbolos globales gcc vs zig
freetype 90 idénticos
expat 12 idénticos
libpng / libpng16 385 idénticos
libffi 68 idénticos

La GUI linkea igual. El cambio gcc→zig no altera la superficie que consumen sus consumidores.

Ojo al comparar (dos falsos positivos en el intento): find | head -1 puede tomar libs distintas de cada artefacto (libpng.a vs libpng16.a), y nm --defined-only incluye símbolos internos de los .o — que difieren entre compiladores sin tocar el ABI (294 "diferencias" espurias en libpng). Comparar el mismo fichero y con --extern-only.