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…
⎇ 98f0b2d228ffebb06941dfc1f436167ab40d8f21
crates/hammer-build/src/config.rs
Ñawpa willay
Pi imata llamkarqan
ch'uya
Caché persistente de zig + bootstrap reproducible del .dev-fs
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}