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