Skip to content

Commit bd576b3

Browse files
committed
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<PathBuf> 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.
1 parent 3bb6bc6 commit bd576b3

File tree

1 file changed

+33
-2
lines changed

1 file changed

+33
-2
lines changed

halide-cache/src/main.rs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ struct Args {
1313
generated_object: PathBuf,
1414
#[arg(long)]
1515
generated_header: PathBuf,
16+
#[arg(long)]
17+
base_dir: Option<PathBuf>,
1618
#[arg(last = true)]
1719
builder: Vec<String>,
1820
}
@@ -60,18 +62,34 @@ fn main() -> anyhow::Result<()> {
6062
if !Path::new(&cache_dir).exists() {
6163
fs::create_dir_all(&cache_dir)?;
6264
}
65+
6366
let lager = Lager::new(Path::new(&cache_dir))?;
6467

6568
let zivid_env = collect_zivid_env();
6669

70+
let base_dir = match args.base_dir {
71+
Some(d) => d,
72+
None => find_repo_root()?,
73+
};
74+
75+
let generated_object = args
76+
.generated_object
77+
.strip_prefix(&base_dir)
78+
.unwrap_or(&args.generated_object);
79+
80+
let generated_header = args
81+
.generated_header
82+
.strip_prefix(&base_dir)
83+
.unwrap_or(&args.generated_header);
84+
6785
let object_dependencies = Dependencies {
68-
path: &args.generated_object,
86+
path: generated_object,
6987
dependencies: &args.dependencies,
7088
env: &zivid_env,
7189
};
7290

7391
let header_dependencies = Dependencies {
74-
path: &args.generated_header,
92+
path: generated_header,
7593
dependencies: &args.dependencies,
7694
env: &zivid_env,
7795
};
@@ -149,3 +167,16 @@ fn cache_hit(
149167
(Err(e), Ok(_)) => Err(anyhow::anyhow!(e).context("Retrieving the header was successful")),
150168
}
151169
}
170+
171+
fn find_repo_root() -> anyhow::Result<PathBuf> {
172+
let mut cwd = std::env::current_dir()?;
173+
174+
loop {
175+
if cwd.join(".git").exists() {
176+
return Ok(cwd);
177+
}
178+
if !cwd.pop() {
179+
anyhow::bail!("Could not determine root");
180+
}
181+
}
182+
}

0 commit comments

Comments
 (0)