# 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).
