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…

TOML 1576Shell 205Rust 111Markdown 993774 Definitions

⎇ 98f0b2d228ffebb06941dfc1f436167ab40d8f21 crates/hammer-build/src/config.rs Rust · 59 lines · 2.5 KB History Who touched what raw

Caché persistente de zig + bootstrap reproducible del .dev-fs e53877a53 · Sergio ·

1//! Configuración del lab: paths del rootfs base, del compilador inyectado y del work dir.
2//!
3//! La idea es que `BuildConfig` se construye una vez (en la CLI desde env vars + defaults) y
4//! se pasa explícitamente a `build`, de modo que los tests pueden montar configuraciones
5//! aisladas sin tocar variables de entorno globales.
6
7use std::path::{Path, PathBuf};
8
9#[derive(Debug, Clone)]
10pub struct BuildConfig {
11    /// Rootfs base read-only del sandbox (Alpine para la fase actual del roadmap).
12    pub rootfs: PathBuf,
13    /// Directorio con el binario `zig` y su `lib/`.
14    pub zig_dir: PathBuf,
15    /// Raíz para directorios de trabajo (repos clonados, copias del source para
16    /// patch+compile, y `out` por build). Debe estar en el mismo filesystem que el store
17    /// para que el `seal` final sea un rename atómico.
18    pub work_root: PathBuf,
19    /// Directorio host persistente que se bindea como `/cache` en el sandbox; alberga la
20    /// caché global de `zig` (objetos de musl, libc, etc.) entre builds. `None` desactiva.
21    pub cache_root: Option<PathBuf>,
22}
23
24impl BuildConfig {
25    /// Defaults relativos al store: `.dev-fs` y `work/` como hermanos del store.
26    /// `store_root = /…/store` → rootfs = `/…/.dev-fs/alpine`, zig = `/…/.dev-fs/tools/zig`,
27    /// work = `/…/work`, cache = `/…/.dev-fs/cache`.
28    pub fn defaults_for_store(store_root: &Path) -> Self {
29        let project_root = store_root
30            .parent()
31            .unwrap_or_else(|| Path::new("."))
32            .to_path_buf();
33        Self {
34            rootfs: project_root.join(".dev-fs/alpine"),
35            zig_dir: project_root.join(".dev-fs/tools/zig"),
36            work_root: project_root.join("work"),
37            cache_root: Some(project_root.join(".dev-fs/cache")),
38        }
39    }
40
41    /// Lee overrides desde entorno (`HAMMER_ROOTFS`, `HAMMER_ZIG`, `HAMMER_WORK`,
42    /// `HAMMER_CACHE`). `HAMMER_CACHE=""` (vacío) desactiva la caché.
43    pub fn from_env_or_defaults(store_root: &Path) -> Self {
44        let mut cfg = Self::defaults_for_store(store_root);
45        if let Ok(v) = std::env::var("HAMMER_ROOTFS") {
46            cfg.rootfs = PathBuf::from(v);
47        }
48        if let Ok(v) = std::env::var("HAMMER_ZIG") {
49            cfg.zig_dir = PathBuf::from(v);
50        }
51        if let Ok(v) = std::env::var("HAMMER_WORK") {
52            cfg.work_root = PathBuf::from(v);
53        }
54        if let Ok(v) = std::env::var("HAMMER_CACHE") {
55            cfg.cache_root = if v.is_empty() { None } else { Some(PathBuf::from(v)) };
56        }
57        cfg
58    }
59}