fn main() {
#[cfg(feature = "grpc")]
compile_protos();
emit_build_metadata();
}
fn emit_build_metadata() {
git_rerun_if_changed();
let commit = std::env::var("CEDARLING_BUILD_COMMIT").unwrap_or_else(|_| {
std::process::Command::new("git")
.args(["rev-parse", "--short", "HEAD"])
.output()
.ok()
.and_then(|o| {
if o.status.success() {
Some(String::from_utf8_lossy(&o.stdout).trim().to_string())
} else {
None
}
})
.unwrap_or_default()
});
let timestamp = std::env::var("CEDARLING_BUILD_TIMESTAMP").unwrap_or_else(|_| {
chrono::Utc::now().to_rfc3339()
});
println!("cargo:rustc-env=CEDARLING_BUILD_COMMIT={commit}");
println!("cargo:rustc-env=CEDARLING_BUILD_TIMESTAMP={timestamp}");
}
fn git_rerun_if_changed() {
let Ok(manifest_dir) = std::env::var("CARGO_MANIFEST_DIR") else { return };
let git_dir_output = std::process::Command::new("git")
.args(["-C", &manifest_dir, "rev-parse", "--git-dir"])
.output()
.ok()
.filter(|o| o.status.success());
let git_dir = match git_dir_output {
Some(ref o) => {
let path = String::from_utf8_lossy(&o.stdout).trim().to_string();
let p = std::path::Path::new(&path);
if p.is_absolute() {
p.to_path_buf()
} else {
std::path::Path::new(&manifest_dir).join(p)
}
},
None => return,
};
let common_dir = std::process::Command::new("git")
.args(["-C", &manifest_dir, "rev-parse", "--git-common-dir"])
.output()
.ok()
.filter(|o| o.status.success())
.and_then(|o| {
let path = String::from_utf8_lossy(&o.stdout).trim().to_string();
if path.is_empty() {
return None;
}
let p = std::path::Path::new(&path);
let abs = if p.is_absolute() {
p.to_path_buf()
} else {
std::path::Path::new(&manifest_dir).join(p)
};
(abs != git_dir).then_some(abs)
})
.unwrap_or_else(|| git_dir.clone());
let head = git_dir.join("HEAD");
if head.exists() {
println!("cargo:rerun-if-changed={}", head.display());
if let Ok(content) = std::fs::read_to_string(&head)
&& let Some(ref_path) = content.strip_prefix("ref: ") {
let ref_file = git_dir.join(ref_path.trim());
let candidate = ref_file.exists().then_some(ref_file)
.or_else(|| {
let f = common_dir.join(ref_path.trim());
f.exists().then_some(f)
});
if let Some(f) = candidate {
println!("cargo:rerun-if-changed={}", f.display());
}
}
}
let packed_refs = git_dir.join("packed-refs");
let candidate = packed_refs.exists().then_some(packed_refs)
.or_else(|| {
let f = common_dir.join("packed-refs");
f.exists().then_some(f)
});
if let Some(f) = candidate {
println!("cargo:rerun-if-changed={}", f.display());
}
}
#[cfg(feature = "grpc")]
fn compile_protos() {
let audit_proto = "src/lock/proto/audit.proto";
println!("cargo:rerun-if-changed={audit_proto}");
tonic_prost_build::configure()
.build_transport(false)
.compile_protos(&[audit_proto], &["src/lock/proto/"])
.expect("Failed to compile protos");
}