//! Configuración del lab: paths del rootfs base, del compilador inyectado y del work dir. //! //! La idea es que `BuildConfig` se construye una vez (en la CLI desde env vars + defaults) y //! se pasa explícitamente a `build`, de modo que los tests pueden montar configuraciones //! aisladas sin tocar variables de entorno globales. use std::path::{Path, PathBuf}; #[derive(Debug, Clone)] pub struct BuildConfig { /// Rootfs base read-only del sandbox (Alpine para la fase actual del roadmap). pub rootfs: PathBuf, /// Directorio con el binario `zig` y su `lib/`. pub zig_dir: PathBuf, /// Raíz para directorios de trabajo (repos clonados, copias del source para /// patch+compile, y `out` por build). Debe estar en el mismo filesystem que el store /// para que el `seal` final sea un rename atómico. pub work_root: PathBuf, /// Directorio host persistente que se bindea como `/cache` en el sandbox; alberga la /// caché global de `zig` (objetos de musl, libc, etc.) entre builds. `None` desactiva. pub cache_root: Option, } impl BuildConfig { /// Defaults relativos al store: `.dev-fs` y `work/` como hermanos del store. /// `store_root = /…/store` → rootfs = `/…/.dev-fs/alpine`, zig = `/…/.dev-fs/tools/zig`, /// work = `/…/work`, cache = `/…/.dev-fs/cache`. pub fn defaults_for_store(store_root: &Path) -> Self { let project_root = store_root .parent() .unwrap_or_else(|| Path::new(".")) .to_path_buf(); Self { rootfs: project_root.join(".dev-fs/alpine"), zig_dir: project_root.join(".dev-fs/tools/zig"), work_root: project_root.join("work"), cache_root: Some(project_root.join(".dev-fs/cache")), } } /// Lee overrides desde entorno (`HAMMER_ROOTFS`, `HAMMER_ZIG`, `HAMMER_WORK`, /// `HAMMER_CACHE`). `HAMMER_CACHE=""` (vacío) desactiva la caché. pub fn from_env_or_defaults(store_root: &Path) -> Self { let mut cfg = Self::defaults_for_store(store_root); if let Ok(v) = std::env::var("HAMMER_ROOTFS") { cfg.rootfs = PathBuf::from(v); } if let Ok(v) = std::env::var("HAMMER_ZIG") { cfg.zig_dir = PathBuf::from(v); } if let Ok(v) = std::env::var("HAMMER_WORK") { cfg.work_root = PathBuf::from(v); } if let Ok(v) = std::env::var("HAMMER_CACHE") { cfg.cache_root = if v.is_empty() { None } else { Some(PathBuf::from(v)) }; } cfg } }