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 Sutichaykuna

⎇ main tandas/needs-review-harkaq/deuda-compilador-matar-gcc.md Markdown · 74 siq'ikuna · 3.1 KB Ñawpa willay ch'uya

matar-gcc: el doc de deuda decía 47 recetas; son 16 (recontado parseando TOML) e568f7714 · sergio ·

1# Deuda de compilador (matar-gcc) — las recetas que compilan con el gcc de Alpine
2
3harkaq clasificaba `/usr/bin/gcc` como sonda esperada SIEMPRE, así que marcaba estas recetas
4`Hermetico` — ciego a que dependen del gcc de Alpine (`compiler=gcc` = CC=gcc de Alpine, musl+GNU
5ld). El arreglo (harkaq-suggest, 2026-07-16): para `compiler=gcc` los frontends de gcc son DEUDA
6DE COMPILADOR, no sonda.
7
8Cada una compila con gcc porque zig-cc la miscompila/no la soporta (documentado en su receta).
9**Acción por receta:** migrar a zig-cc cuando zig mejore, o aceptar el escape como deuda conocida.
10
11## Estado real: 16 recetas (2026-07-17)
12
13Este doc decía **47**. Eran 47 el 2026-07-16; desde entonces se migraron 31 y nadie lo actualizó,
14así que el frente se leía 3× más grande de lo que es. Recontado hoy.
15
16**CÓMO CONTAR — no uses grep.** `grep -l 'compiler *= *"gcc"' recipes/*.toml` da **18**: cuenta
17`bzip2` y `pigz`, que ya son zig-cc y sólo *mencionan* gcc en un comentario. El grep no distingue
18campo de comentario. Contá parseando el TOML:
19
20```sh
21python3 - <<'PY'
22import tomllib, glob, os
23for f in sorted(glob.glob('recipes/*.toml')):
24    try: d = tomllib.load(open(f, 'rb'))
25    except Exception: continue
26    if d.get('build', {}).get('compiler') == 'gcc':
27        print(os.path.basename(f)[:-5])
28PY
29```
30
31**Y ojo con la otra dirección**: declarar `zig-cc` no prueba que construya con zig-cc. `pigz`
32*declaraba* zig-cc y construía con gcc igual (7d86dbf) — lo cazó harkaq midiendo el build, no
33leyendo la receta. La receta dice la intención; **harkaq dice el hecho**. Este doc lista lo
34declarado; para lo real, medí.
35
36## C (4)
37
38  - file        — link=static
39  - libgcrypt   — link=static
40  - libsodium   — link=static
41  - linux-pam   — link=dynamic
42
43## Rust con sys-crate C (12) — gcc para el C embebido (libgit2-sys, mlua-sys, etc)
44
45  - broot
46  - cargo-audit
47  - cargo-cache
48  - delta
49  - git-absorb
50  - gitui
51  - helix
52  - hurl
53  - ouch
54  - xplr
55  - yazi
56  - zellij
57
58`xplr` estaba mal clasificada acá como "C puro": es Rust (embebe `mlua-sys`, que compila Lua en C).
59
60## La raíz de las 12 Rust: el runtime de UNWINDING de libgcc
61
62Las 12 no son 12 problemas, son uno. Su receta lo dice (ej. `xplr`): bajo zig-cc el link falla con
63símbolos de unwinding sueltos (`_Unwind_GetCFA`, `_Unwind_DeleteException`) que aporta **libgcc**;
64`compiler="gcc"` usa el musl-gcc de Alpine, que trae ese runtime. O sea: la deuda no es "zig
65miscompila 12 programas", es "falta un runtime de unwinding para el C de los sys-crates".
66
67**Converge con el frente `static`** (`scripts/static-audit.sh`, 2026-07-17): `helix` y `tuc` salían
68dinámicas arrastrando **`libgcc_s.so.1` de Alpine dentro del binario final** — la misma libgcc, por
69la misma razón, pero medida en runtime en vez de en build. Es deuda de matar-gcc que ninguna
70declaración registra, invisible hasta que se midió. Un fix del unwinding cerraría las dos a la vez.
71
72Precedente de que se puede: el artefacto de `cmake` arrastraba `libstdc++`/`libgcc_s` de Alpine a
73cada build que lo declaraba como dep, y `-static-libstdc++ -static-libgcc` lo dejó con NEEDED sólo
74`libc.musl`.

deuda-compilador-matar-gcc.md

Deuda de compilador (matar-gcc) — las recetas que compilan con el gcc de Alpine

harkaq clasificaba /usr/bin/gcc como sonda esperada SIEMPRE, así que marcaba estas recetas Hermetico — ciego a que dependen del gcc de Alpine (compiler=gcc = CC=gcc de Alpine, musl+GNU ld). El arreglo (harkaq-suggest, 2026-07-16): para compiler=gcc los frontends de gcc son DEUDA DE COMPILADOR, no sonda.

Cada una compila con gcc porque zig-cc la miscompila/no la soporta (documentado en su receta). Acción por receta: migrar a zig-cc cuando zig mejore, o aceptar el escape como deuda conocida.

Estado real: 16 recetas (2026-07-17)

Este doc decía 47. Eran 47 el 2026-07-16; desde entonces se migraron 31 y nadie lo actualizó, así que el frente se leía 3× más grande de lo que es. Recontado hoy.

CÓMO CONTAR — no uses grep. grep -l 'compiler *= *"gcc"' recipes/*.toml da 18: cuenta bzip2 y pigz, que ya son zig-cc y sólo mencionan gcc en un comentario. El grep no distingue campo de comentario. Contá parseando el TOML:

python3 - <<'PY'
import tomllib, glob, os
for f in sorted(glob.glob('recipes/*.toml')):
    try: d = tomllib.load(open(f, 'rb'))
    except Exception: continue
    if d.get('build', {}).get('compiler') == 'gcc':
        print(os.path.basename(f)[:-5])
PY

Y ojo con la otra dirección: declarar zig-cc no prueba que construya con zig-cc. pigz declaraba zig-cc y construía con gcc igual (7d86dbf) — lo cazó harkaq midiendo el build, no leyendo la receta. La receta dice la intención; harkaq dice el hecho. Este doc lista lo declarado; para lo real, medí.

C (4)

Rust con sys-crate C (12) — gcc para el C embebido (libgit2-sys, mlua-sys, etc)

xplr estaba mal clasificada acá como "C puro": es Rust (embebe mlua-sys, que compila Lua en C).

La raíz de las 12 Rust: el runtime de UNWINDING de libgcc

Las 12 no son 12 problemas, son uno. Su receta lo dice (ej. xplr): bajo zig-cc el link falla con símbolos de unwinding sueltos (_Unwind_GetCFA, _Unwind_DeleteException) que aporta libgcc; compiler="gcc" usa el musl-gcc de Alpine, que trae ese runtime. O sea: la deuda no es "zig miscompila 12 programas", es "falta un runtime de unwinding para el C de los sys-crates".

Converge con el frente static (scripts/static-audit.sh, 2026-07-17): helix y tuc salían dinámicas arrastrando libgcc_s.so.1 de Alpine dentro del binario final — la misma libgcc, por la misma razón, pero medida en runtime en vez de en build. Es deuda de matar-gcc que ninguna declaración registra, invisible hasta que se midió. Un fix del unwinding cerraría las dos a la vez.

Precedente de que se puede: el artefacto de cmake arrastraba libstdc++/libgcc_s de Alpine a cada build que lo declaraba como dep, y -static-libstdc++ -static-libgcc lo dejó con NEEDED sólo libc.musl.