# ADR 0003 — `zig cc` como compilador por defecto del laboratorio - **Estado:** aceptada - **Fecha:** 2026-06-06 ## Contexto El lab compila C/C++ upstream de forma hermética hacia un target musl, idealmente estático, y debe evitar contaminación del host. La opción clásica es construir un cross-toolchain (Stage 0) a mano: largo y frágil. ## Decisión Usar **`zig cc` como compilador por defecto** del lab, con el compilador **configurable por receta** (escotilla a `clang`/`gcc`). Esto es ortogonal al lenguaje del tooling, que es Rust ([ADR 0001](0001-rust-for-tooling.md)): Rust orquesta, `zig cc` aprieta el tornillo. ## Razones - **Mata el bootstrap:** un solo binario (~45 MB) provee compilador C/C++ + **musl** + headers, para múltiples arquitecturas. Resuelve gran parte del Stage 0/1. - **Hermético por defecto:** trae sus propios headers de libc, no chupa `/usr/include` del host. Justo nuestro requisito de no-contaminación. - **Cross-compile trivial:** `-target x86_64-linux-musl`, aarch64, etc. Clave para el track de distro propia y otras arquitecturas. - **Determinista:** ayuda directamente al hashing CAS y a la reproducibilidad ([SDD 09](../09-trust-model.md)). ## Consecuencias / riesgos - `zig cc` es clang por debajo: algunos paquetes con **gcc-ismos** (extensiones GNU, flags específicos) o `configure` de autotools mal detectado **fallarán**. Por eso el compilador es **por receta**, no global: escotilla a `clang`/`gcc` cuando haga falta. - No todo upstream compila limpio con clang/musl independientemente del compilador; es fricción inherente a musl/static, no de `zig`. - La versión de `zig` forma parte del hash de entrada del build (reproducibilidad).