From c7bae3775138e9e086fd5d6b8d5493a234b31976 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98ystein=20Walle?= Date: Thu, 26 Mar 2026 10:51:28 +0100 Subject: [PATCH] halide-cache: Add --base-dir option Make the paths to generated files and dependencies relative to the value of this argument. This makes it possible to share the halide cache between repos or worktrees. If a path cannot be made relative then it remains unchanged. Currently it is an Option to avoid having to make changes to the call site and if it is None then the path to the repository is used. In the future we probably want to make this more robust. --- halide-cache/src/main.rs | 47 +++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) 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"); + } + } +}