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>
58 lines
3.1 KiB
Markdown
58 lines
3.1 KiB
Markdown
# 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`**.
|