Etapa G: destraba frontera openssl-sys (OPENSSL_DIR + fallback de deps al corpus)
Dos fixes en hammer-build que juntos destraban las recetas con C-FFI: - Inyecta OPENSSL_DIR=/usr + OPENSSL_STATIC + OPENSSL_NO_VENDOR cuando la receta declara 'openssl' como dep ⇒ openssl-sys usa la openssl hammer-built (estática/musl) en vez de buscar en el host y abortar. - resolve_dep_path(): fallback al catálogo PADRE — una receta en recipes/incoming/ ahora ve las deps del corpus recipes/ sin duplicarlas (la granja construye desde incoming/). Recetas: +dep openssl a monolith/mdcat/mise; tuc saca 'cargo auditable'→'cargo build'. VALIDADO: monolith v2.10.1 sella (openssl-sys linkea contra la openssl del corpus). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -48,6 +48,26 @@ fn artifact_hash_rec(recipe: &Recipe, stack: &mut Vec<String>) -> hammer_core::R
|
||||
Ok(ArtifactHash::of_inputs(&refs))
|
||||
}
|
||||
|
||||
/// Resuelve la ruta de una dep de build: primero como HERMANO (`base_dir/{dep}.toml`), y si no
|
||||
/// existe, en el catálogo PADRE (`base_dir/../{dep}.toml`). El fallback al padre permite que una
|
||||
/// receta en `recipes/incoming/` (cola de staging) dependa de una del corpus `recipes/` sin
|
||||
/// duplicarla ni symlinkearla — destraba la frontera de deps-del-corpus (openssl, zlib, …) en la
|
||||
/// granja, que construye desde `incoming/`. Si ninguna existe, devuelve la ruta hermana (para que
|
||||
/// el error apunte al lugar esperado).
|
||||
fn resolve_dep_path(base_dir: &Path, dep: &str) -> PathBuf {
|
||||
let sibling = base_dir.join(format!("{dep}.toml"));
|
||||
if sibling.exists() {
|
||||
return sibling;
|
||||
}
|
||||
if let Some(parent) = base_dir.parent() {
|
||||
let in_parent = parent.join(format!("{dep}.toml"));
|
||||
if in_parent.exists() {
|
||||
return in_parent;
|
||||
}
|
||||
}
|
||||
sibling
|
||||
}
|
||||
|
||||
/// Resuelve y hashea, en orden de declaración, cada `deps.build` de `recipe` cargándolo del
|
||||
/// catálogo (su `base_dir`). `stack` lleva la cadena en curso para detectar ciclos.
|
||||
fn resolve_build_dep_hashes(
|
||||
@@ -68,7 +88,7 @@ fn resolve_build_dep_hashes(
|
||||
stack.push(recipe.name.clone());
|
||||
let mut hashes = Vec::with_capacity(recipe.deps.build.len());
|
||||
for dep in &recipe.deps.build {
|
||||
let dep_path = recipe.base_dir.join(format!("{dep}.toml"));
|
||||
let dep_path = resolve_dep_path(&recipe.base_dir, dep);
|
||||
let dep_recipe = Recipe::load_from_path(&dep_path).map_err(|e| {
|
||||
hammer_core::Error::Recipe(format!(
|
||||
"no pude cargar la dep de build '{dep}' de '{}' ({}): {e}",
|
||||
@@ -103,7 +123,7 @@ fn materialize_build_deps(
|
||||
}
|
||||
let mut dirs = Vec::with_capacity(recipe.deps.build.len());
|
||||
for dep in &recipe.deps.build {
|
||||
let dep_path = recipe.base_dir.join(format!("{dep}.toml"));
|
||||
let dep_path = resolve_dep_path(&recipe.base_dir, dep);
|
||||
let dep_recipe = Recipe::load_from_path(&dep_path).map_err(|e| {
|
||||
hammer_core::Error::Recipe(format!(
|
||||
"no pude cargar la dep de build '{dep}' de '{}' ({}): {e}",
|
||||
@@ -226,6 +246,15 @@ pub fn build(
|
||||
// para Cargo/CMake/Meson (no leen estas envs).
|
||||
env.push(("CBUILD".into(), SANDBOX_NATIVE_TARGET.to_string()));
|
||||
env.push(("CHOST".into(), SANDBOX_NATIVE_TARGET.to_string()));
|
||||
// *-sys C-FFI (Etapa G): si la receta declara `openssl` como dep, apuntá `openssl-sys` a la
|
||||
// openssl hammer-built materializada en /usr (estática, musl). Sin esto openssl-sys busca en el
|
||||
// host y aborta ("Could not find directory of OpenSSL installation"). Condicional al dep ⇒ no
|
||||
// rompe recetas que usen openssl vendored. Destraba la frontera cargo-* (reqwest/git tools).
|
||||
if recipe.deps.build.iter().any(|d| d == "openssl") {
|
||||
env.push(("OPENSSL_DIR".into(), "/usr".into()));
|
||||
env.push(("OPENSSL_STATIC".into(), "1".into()));
|
||||
env.push(("OPENSSL_NO_VENDOR".into(), "1".into()));
|
||||
}
|
||||
if let Some(cache) = &cfg.cache_root {
|
||||
std::fs::create_dir_all(cache.join("zig"))?;
|
||||
}
|
||||
|
||||
@@ -20,3 +20,6 @@ install = "mkdir -p /out/usr/bin && cp target/release/mdcat /out/usr/bin/mdcat"
|
||||
|
||||
# buildInputs de nix (NO deps de hammer — cargo vendorea; backend Rust por
|
||||
# defecto). Si algún sys-crate C falla, adaptá per-paquete (patch/feature): asciidoctor, ansi2html, curl, openssl
|
||||
|
||||
[deps]
|
||||
build = ["openssl"]
|
||||
|
||||
@@ -20,3 +20,6 @@ install = "mkdir -p /out/usr/bin && cp target/release/mise /out/usr/bin/mise"
|
||||
|
||||
# buildInputs de nix (NO deps de hammer — cargo vendorea; backend Rust por
|
||||
# defecto). Si algún sys-crate C falla, adaptá per-paquete (patch/feature): nss-cacert, cmake, git, openssl
|
||||
|
||||
[deps]
|
||||
build = ["openssl"]
|
||||
|
||||
@@ -20,3 +20,6 @@ install = "mkdir -p /out/usr/bin && cp target/release/monolith /out/usr/bin/mono
|
||||
|
||||
# buildInputs de nix (NO deps de hammer — cargo vendorea; backend Rust por
|
||||
# defecto). Si algún sys-crate C falla, adaptá per-paquete (patch/feature): openssl
|
||||
|
||||
[deps]
|
||||
build = ["openssl"]
|
||||
|
||||
@@ -20,7 +20,7 @@ flags = []
|
||||
# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático):
|
||||
compile = '''
|
||||
_abuild_phase() {
|
||||
cargo auditable build --frozen --release
|
||||
cargo build --frozen --release
|
||||
}
|
||||
_abuild_phase
|
||||
'''
|
||||
|
||||
Reference in New Issue
Block a user