docs(linux): veredicto formal — kernel al gueto gcc (zig-cc x86 kbuild)

zig 0.13 compila los host-tools del kernel (wrapper que traduce el depfile
-Wp,-MMD,PATH → -MMD -MF PATH; cache de zig deshabilitado), pero el target
choca con la traducción de flags x86 de zig cc (-mtune=generic, -march=x86-64).
gcc se retiene SOLO para {kernel, cmake}; el resto del userland C es gcc-free
vía zig 0.13. Futuro intento limpio: make LLVM=1 con el clang que zig empaqueta.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-19 21:44:41 -04:00
co-authored by Claude Opus 4.8
parent 7bf49fb960
commit cb9cfd9df4
+14 -4
View File
@@ -7,10 +7,20 @@
# Criterio de éxito: el bzImage hammer-built bootea el builder de selfhost-verify y la corrida da
# ✓ REPRODUCIBLE (KERNEL=<este bzImage> ./scripts/selfhost-verify.sh).
#
# Compilador: CC=gcc/HOSTCC=gcc (NO zig) — el kernel es el binario más grande del lab y zig 0.16
# miscompila binarios grandes (lesson binutils/python/cmake/flex); el kernel se compila con la GNU
# toolchain estándar (gcc + binutils as/ld del toolchain). No es input del 4/4 (es el kernel que
# BOOTEA la VM, no algo que el 4/4 enlace), así que el compilador da igual mientras el kernel bootee.
# Compilador: CC=gcc/HOSTCC=gcc (NO zig) — DECISIÓN FORMAL (2026-06-19): el kernel se queda en el GUETO
# GCC (junto con cmake). gcc se retiene EXCLUSIVAMENTE como herramienta de bootstrap heredada para el
# kernel, por incompatibilidad de la CAPA DE TRADUCCIÓN DE FLAGS de `zig cc` con el kbuild de x86_64.
# Verdict tras experimento exhaustivo (recipes/linux-zig-test.toml, ya retirado): zig 0.13.0 SÍ compila
# todos los HOST-TOOLS del kernel (fixdep/kconfig/objtool) con un wrapper que traduce el depfile de
# kbuild `-Wp,-MMD,PATH` → `-MMD -MF PATH` (zig cc malinterpreta la forma cc1 de GCC; además el cache de
# zig debe ir DESHABILITADO o rompe el self-bootstrap de flex). PERO el compile del TARGET choca en
# cascada con la traducción de flags x86 de zig cc: `-mtune=generic` → "unknown target CPU 'generic'",
# `-march=x86-64` → "unknown CPU: 'x86'" (zig parte mal el `x86-64`), y aún faltarían el realmode 16-bit
# (`-march=i386`) e inline-asm/objtool. Es el "riesgo clang-build-Linux" del roadmap: open-ended y de
# payoff incierto, con el kernel YA reproducible-bit-a-bit y booteando bajo gcc. Un futuro intento limpio
# pasaría por exponer el clang/LLVM que zig empaqueta y construir con `make LLVM=1` (evita la capa de
# traducción de zig cc, la fuente real de los bugs). El resto del userland C SÍ es gcc-free vía zig 0.13.
# No es input del 4/4 (es el kernel que BOOTEA la VM, no algo que el 4/4 enlace).
#
# Config: defconfig x86_64 (base PC booteable en QEMU: 8250 serial, initrd, PCI) + ajustes monolíticos
# - E1000/OVERLAY_FS/USER_NS =y (built-in): el builder usa e1000 (vendoring) + overlay (sandbox bwrap)