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…
⎇ 8bf1623044075274682e4351a0f8e120047c2bed
crates/hammer-build/src/lib.rs
Historia
Quién tocó qué
crudo
Scaffold inicial: workspace Rust + SDDs completos
1//! El laboratorio: compila una receta de forma hermética y la sella en el store; e hidrata
2//! artefactos al FHS. Ver `docs/02-build-lab.md` y `docs/03-hydration.md`.
3//!
4//! Esqueleto de Fase 0. Las funciones públicas fijan el contrato; la implementación del
5//! sandbox (bubblewrap) y de patchelf se irá rellenando.
6
7use std::path::Path;
8
9use hammer_core::{ArtifactHash, LinkMode, Recipe, Store};
10
11pub mod sandbox;
12
13/// Calcula el `ArtifactHash` de una receta, resolviendo recursivamente sus deps de build.
14/// Ver `docs/02-build-lab.md` §2 y §5.
15pub fn artifact_hash(recipe: &Recipe, store: &Store) -> hammer_core::Result<ArtifactHash> {
16 let dep_hashes: Vec<ArtifactHash> = Vec::new();
17 for dep_name in &recipe.deps.build {
18 // TODO(fase-0): cargar la receta de la dep y recursar. Por ahora se documenta el
19 // contrato; el grafo real se implementa con `hammer build`.
20 let _ = dep_name;
21 }
22 let inputs = recipe.hash_inputs(&dep_hashes);
23 let refs: Vec<&[u8]> = inputs.iter().map(|v| v.as_slice()).collect();
24 let _ = store;
25 Ok(ArtifactHash::of_inputs(&refs))
26}
27
28/// Compila una receta y devuelve el hash del artefacto sellado en el store.
29/// Si el hash ya existe en el store, devuelve sin recompilar (caché).
30pub fn build(recipe: &Recipe, store: &Store) -> hammer_core::Result<ArtifactHash> {
31 let h = artifact_hash(recipe, store)?;
32 if store.has(&h, &recipe.name) {
33 tracing::info!(hash = %h, name = %recipe.name, "caché: artefacto ya en el store");
34 return Ok(h);
35 }
36 // TODO(fase-0): resolver deps → make_sandbox → run_phases(patch/configure/compile/install)
37 // → store.seal(out, &h, &recipe.name).
38 tracing::warn!("build real pendiente (Fase 0): sandbox bubblewrap + zig cc");
39 Err(hammer_core::Error::Other(anyhow::anyhow!(
40 "build no implementado todavía; ver docs/10-roadmap.md (Fase 0)"
41 )))
42}
43
44/// Proyecta un artefacto del store al FHS (real o de overlay). Ver `docs/03-hydration.md`.
45pub fn hydrate(
46 _h: &ArtifactHash,
47 _store: &Store,
48 _target_fhs: &Path,
49 _mode: LinkMode,
50) -> hammer_core::Result<()> {
51 // TODO(fase-1): hardlink del store al FHS; patchelf (set-interpreter/set-rpath) si Dynamic.
52 Err(hammer_core::Error::Other(anyhow::anyhow!(
53 "hidratación no implementada todavía; ver docs/10-roadmap.md (Fase 1)"
54 )))
55}