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 1561Shell 203Rust 109Markdown 993728 Definiciones

Etapa G capa-de-adaptación #1: el lab honra `build.compiler` (escape de linker declarativo)

El muro del piloto: zig-cc filtra los flags de lld (rechaza -Wl,--allow-multiple-definition y
-z muldefs) ⇒ paquetes C con símbolos duplicados (lz4) no linkean. El escape es usar un toolchain
real (gcc de Alpine = musl + GNU ld, que SÍ acepta -z muldefs), pero el sandbox FIJABA CC="zig cc"
ignorando el campo `compiler` de la receta.

- hammer-build/lib.rs: `build.compiler` ahora setea CC/CXX/AR reales en el env (gcc→gcc/g++/ar,
  clang→clang/clang++/llvm-ar; zig-cc = default sin cambio). `self.env` pisa los defaults del
  sandbox. gcc/clang default a x86-64 genérico ⇒ reproducible, sin -mcpu=baseline.
- PURAMENTE ADITIVO: ningún recipe del corpus declara compiler=gcc (el gueto usa CC=gcc en fases),
  y el 4/4 núcleo es zig-cc ⇒ baseline of_tree intacto.
- VALIDADO REAL: lz4 (importado de Alpine) con `compiler = "gcc"` declarativo (fase SIN CC=gcc)
  → construye + corre (lz4 v1.10.0). El paquete que moría en el lld de zig ahora sella. 31 suites verde.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

2d81bc6eaac793f03f0e57c28112d74927fdd02d · por sergio · (hace 4 meses) · padre 630cde655 · ver el árbol en este commit

Delta semántico · 1

crates/hammer-build/src/lib.rs

  • cambió por dentro fn build pub

1 archivos · +19 −1

diff --git a/crates/hammer-build/src/lib.rs b/crates/hammer-build/src/lib.rs
index 519c04e9..b5cea324 100644
--- a/crates/hammer-build/src/lib.rs
+++ b/crates/hammer-build/src/lib.rs
@@ -3,7 +3,7 @@
 
 use std::path::{Path, PathBuf};
 
-use hammer_core::{ArtifactHash, LinkMode, Phases, Recipe, Store};
+use hammer_core::{ArtifactHash, Compiler, LinkMode, Phases, Recipe, Store};
 
 pub mod config;
 pub mod download;
@@ -184,6 +184,24 @@ pub fn build(
         // monolítico que pide nuestra estrategia de hidratación primaria.
         env.push(("LDFLAGS".into(), "-static".into()));
     }
+    // El `compiler` de la receta decide el CC/CXX/AR reales; el default del sandbox es `zig cc`.
+    // Esto vuelve DECLARATIVO el escape a un toolchain real (gcc de Alpine = musl + GNU `ld`) para
+    // paquetes que el `lld` estricto de zig NO linkea (símbolos duplicados, flags que zig filtra —
+    // ver Etapa G, lz4). `self.env` pisa los defaults del sandbox. gcc/clang default a x86-64
+    // genérico (reproducible, sin `-march=native`), no hace falta `-mcpu=baseline`.
+    match recipe.build.compiler {
+        Compiler::ZigCc => {}
+        Compiler::Gcc => {
+            env.push(("CC".into(), "gcc".into()));
+            env.push(("CXX".into(), "g++".into()));
+            env.push(("AR".into(), "ar".into()));
+        }
+        Compiler::Clang => {
+            env.push(("CC".into(), "clang".into()));
+            env.push(("CXX".into(), "clang++".into()));
+            env.push(("AR".into(), "llvm-ar".into()));
+        }
+    }
     if let Some(cache) = &cfg.cache_root {
         std::fs::create_dir_all(cache.join("zig"))?;
     }