diff --git a/halide-cache/src/main.rs b/halide-cache/src/main.rs index 2c570d5..2da42fb 100644 --- a/halide-cache/src/main.rs +++ b/halide-cache/src/main.rs @@ -13,6 +13,8 @@ struct Args { generated_object: PathBuf, #[arg(long)] generated_header: PathBuf, + #[arg(long)] + base_dir: Option, #[arg(last = true)] builder: Vec, } @@ -21,7 +23,7 @@ const MAX_CACHE_SIZE_BYTES: u64 = 10737418240; // 10 GiB struct Dependencies<'a> { path: &'a Path, - dependencies: &'a [PathBuf], + dependencies: &'a [&'a Path], env: &'a [String], } @@ -60,19 +62,41 @@ fn main() -> anyhow::Result<()> { if !Path::new(&cache_dir).exists() { fs::create_dir_all(&cache_dir)?; } + let lager = Lager::new(Path::new(&cache_dir))?; let zivid_env = collect_zivid_env(); + let base_dir = match args.base_dir { + Some(d) => d, + None => find_repo_root()?, + }; + + let generated_object = args + .generated_object + .strip_prefix(&base_dir) + .unwrap_or(&args.generated_object); + + let generated_header = args + .generated_header + .strip_prefix(&base_dir) + .unwrap_or(&args.generated_header); + + let dependencies = args + .dependencies + .iter() + .map(|p| p.strip_prefix(&base_dir).unwrap_or(p)) + .collect::>(); + let object_dependencies = Dependencies { - path: &args.generated_object, - dependencies: &args.dependencies, + path: generated_object, + dependencies: &dependencies, env: &zivid_env, }; let header_dependencies = Dependencies { - path: &args.generated_header, - dependencies: &args.dependencies, + path: generated_header, + dependencies: &dependencies, env: &zivid_env, }; @@ -149,3 +173,16 @@ fn cache_hit( (Err(e), Ok(_)) => Err(anyhow::anyhow!(e).context("Retrieving the header was successful")), } } + +fn find_repo_root() -> anyhow::Result { + let mut cwd = std::env::current_dir()?; + + loop { + if cwd.join(".git").exists() { + return Ok(cwd); + } + if !cwd.pop() { + anyhow::bail!("Could not determine root"); + } + } +}