//! El laboratorio: compila una receta de forma hermética y la sella en el store; e hidrata //! artefactos al FHS. Ver `docs/02-build-lab.md` y `docs/03-hydration.md`. //! //! Esqueleto de Fase 0. Las funciones públicas fijan el contrato; la implementación del //! sandbox (bubblewrap) y de patchelf se irá rellenando. use std::path::Path; use hammer_core::{ArtifactHash, LinkMode, Recipe, Store}; pub mod sandbox; /// Calcula el `ArtifactHash` de una receta, resolviendo recursivamente sus deps de build. /// Ver `docs/02-build-lab.md` §2 y §5. pub fn artifact_hash(recipe: &Recipe, store: &Store) -> hammer_core::Result { let dep_hashes: Vec = Vec::new(); for dep_name in &recipe.deps.build { // TODO(fase-0): cargar la receta de la dep y recursar. Por ahora se documenta el // contrato; el grafo real se implementa con `hammer build`. let _ = dep_name; } let inputs = recipe.hash_inputs(&dep_hashes); let refs: Vec<&[u8]> = inputs.iter().map(|v| v.as_slice()).collect(); let _ = store; Ok(ArtifactHash::of_inputs(&refs)) } /// Compila una receta y devuelve el hash del artefacto sellado en el store. /// Si el hash ya existe en el store, devuelve sin recompilar (caché). pub fn build(recipe: &Recipe, store: &Store) -> hammer_core::Result { let h = artifact_hash(recipe, store)?; if store.has(&h, &recipe.name) { tracing::info!(hash = %h, name = %recipe.name, "caché: artefacto ya en el store"); return Ok(h); } // TODO(fase-0): resolver deps → make_sandbox → run_phases(patch/configure/compile/install) // → store.seal(out, &h, &recipe.name). tracing::warn!("build real pendiente (Fase 0): sandbox bubblewrap + zig cc"); Err(hammer_core::Error::Other(anyhow::anyhow!( "build no implementado todavía; ver docs/10-roadmap.md (Fase 0)" ))) } /// Proyecta un artefacto del store al FHS (real o de overlay). Ver `docs/03-hydration.md`. pub fn hydrate( _h: &ArtifactHash, _store: &Store, _target_fhs: &Path, _mode: LinkMode, ) -> hammer_core::Result<()> { // TODO(fase-1): hardlink del store al FHS; patchelf (set-interpreter/set-rpath) si Dynamic. Err(hammer_core::Error::Other(anyhow::anyhow!( "hidratación no implementada todavía; ver docs/10-roadmap.md (Fase 1)" ))) }