use std::path::{Path, PathBuf};
use std::process::Command;
use std::time::{SystemTime, UNIX_EPOCH};
const UNKNOWN: &str = "unknown";
const SHORT_SHA_LEN: usize = 12;
#[path = "src/bin_cli/tree_state.rs"]
mod tree_state;
fn main() {
let target = std::env::var("TARGET").unwrap_or_default();
if target.contains("windows-msvc") {
println!("cargo:rustc-link-arg-bin=alef=/STACK:8388608");
}
let manifest_dir = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap_or_else(|_| ".".to_string()));
emit_rerun_triggers(&manifest_dir);
emit_provenance(&manifest_dir);
}
fn git(manifest_dir: &Path, args: &[&str]) -> Option<String> {
let output = Command::new("git").args(args).current_dir(manifest_dir).output().ok()?;
if !output.status.success() {
return None;
}
let text = String::from_utf8(output.stdout).ok()?;
let trimmed = text.trim();
if trimmed.is_empty() {
None
} else {
Some(trimmed.to_string())
}
}
fn emit_rerun_triggers(manifest_dir: &Path) {
println!("cargo:rerun-if-env-changed=SOURCE_DATE_EPOCH");
for input in ["build.rs", "Cargo.toml", "Cargo.lock", "src"] {
let path = manifest_dir.join(input);
if path.exists() {
println!("cargo:rerun-if-changed={}", path.display());
}
}
let Some(git_dir) = git(manifest_dir, &["rev-parse", "--absolute-git-dir"]).map(PathBuf::from) else {
return;
};
let common_dir = git(
manifest_dir,
&["rev-parse", "--path-format=absolute", "--git-common-dir"],
)
.map_or_else(|| git_dir.clone(), PathBuf::from);
let head = git_dir.join("HEAD");
let mut watched = vec![head.clone(), git_dir.join("index"), common_dir.join("packed-refs")];
if let Some(reference) = std::fs::read_to_string(&head)
.ok()
.and_then(|contents| contents.trim().strip_prefix("ref: ").map(str::to_string))
{
watched.push(common_dir.join(reference));
}
for path in watched {
if path.exists() {
println!("cargo:rerun-if-changed={}", path.display());
}
}
}
fn emit_provenance(manifest_dir: &Path) {
let commit = git(manifest_dir, &["rev-parse", "HEAD"]);
let short = commit
.as_deref()
.and_then(|sha| sha.get(..SHORT_SHA_LEN))
.map_or_else(|| UNKNOWN.to_string(), str::to_string);
println!(
"cargo:rustc-env=ALEF_BUILD_COMMIT={}",
commit.as_deref().unwrap_or(UNKNOWN)
);
println!("cargo:rustc-env=ALEF_BUILD_COMMIT_SHORT={short}");
println!(
"cargo:rustc-env=ALEF_BUILD_TREE_STATE={}",
tree_state::classify(manifest_dir)
);
println!("cargo:rustc-env=ALEF_BUILD_TIMESTAMP={}", build_timestamp());
}
fn build_timestamp() -> String {
if let Ok(epoch) = std::env::var("SOURCE_DATE_EPOCH")
&& epoch.trim().parse::<i64>().is_ok()
{
return epoch.trim().to_string();
}
SystemTime::now()
.duration_since(UNIX_EPOCH)
.map_or_else(|_| UNKNOWN.to_string(), |elapsed| elapsed.as_secs().to_string())
}