use std::path::{Path, PathBuf};
use sha2::{Digest, Sha256};
fn collect_files(dir: &Path, out: &mut Vec<PathBuf>) {
let Ok(entries) = std::fs::read_dir(dir) else {
return;
};
for entry in entries.flatten() {
let path = entry.path();
if path.is_dir() {
collect_files(&path, out);
} else if path.is_file() {
out.push(path);
}
}
}
fn main() {
let manifest_dir = PathBuf::from(
std::env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR is set by cargo"),
);
let crates_dir = manifest_dir
.parent()
.expect("overlayd crate has a parent dir")
.to_path_buf();
let daemon_src = manifest_dir.join("src");
let daemon_toml = manifest_dir.join("Cargo.toml");
let shared_dir = crates_dir.join("zlayer-overlay");
let shared_src = shared_dir.join("src");
let shared_toml = shared_dir.join("Cargo.toml");
for dir in [&daemon_src, &shared_src] {
println!("cargo:rerun-if-changed={}", dir.display());
}
for toml in [&daemon_toml, &shared_toml] {
println!("cargo:rerun-if-changed={}", toml.display());
}
let mut files = Vec::new();
collect_files(&daemon_src, &mut files);
collect_files(&shared_src, &mut files);
files.push(daemon_toml);
files.push(shared_toml);
for file in &files {
println!("cargo:rerun-if-changed={}", file.display());
}
files.sort();
let mut hasher = Sha256::new();
for file in &files {
let rel = file.strip_prefix(&crates_dir).unwrap_or(file);
hasher.update(rel.to_string_lossy().as_bytes());
let bytes = std::fs::read(file).unwrap_or_default();
hasher.update(&bytes);
}
let mut build_id = String::with_capacity(64);
for byte in hasher.finalize() {
use std::fmt::Write as _;
let _ = write!(build_id, "{byte:02x}");
}
println!("cargo:rustc-env=ZLAYER_OVERLAYD_BUILD_ID={build_id}");
}