From 2d81bc6eaac793f03f0e57c28112d74927fdd02d Mon Sep 17 00:00:00 2001 From: sergio Date: Sun, 21 Jun 2026 08:14:34 -0400 Subject: [PATCH] =?UTF-8?q?Etapa=20G=20capa-de-adaptaci=C3=B3n=20#1:=20el?= =?UTF-8?q?=20lab=20honra=20`build.compiler`=20(escape=20de=20linker=20dec?= =?UTF-8?q?larativo)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- crates/hammer-build/src/lib.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) 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"))?; }