tawasuyu

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 Rust · 55 líneas · 2.3 KB Historia Quién tocó qué crudo

Scaffold inicial: workspace Rust + SDDs completos 8bf162304 · sergio ·

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}