fn main() {
println!("cargo::rustc-check-cfg=cfg(coverage)");
println!("cargo::rustc-check-cfg=cfg(inference_ort)");
if std::env::var_os("CARGO_FEATURE_ORT_BUNDLED").is_some()
|| std::env::var_os("CARGO_FEATURE_ORT_DYNAMIC").is_some()
{
println!("cargo::rustc-cfg=inference_ort");
}
println!("cargo::rustc-check-cfg=cfg(auto_rotate)");
if std::env::var_os("CARGO_FEATURE_AUTO_ROTATE").is_some()
|| std::env::var_os("CARGO_FEATURE_AUTO_ROTATE_TRACT").is_some()
{
println!("cargo::rustc-cfg=auto_rotate");
}
println!("cargo::rustc-check-cfg=cfg(sceptre_ocr)");
if std::env::var_os("CARGO_FEATURE_SCEPTRE_OCR_ORT").is_some()
|| std::env::var_os("CARGO_FEATURE_SCEPTRE_OCR_TRACT").is_some()
|| std::env::var_os("CARGO_FEATURE_SCEPTRE_OCR_CANDLE").is_some()
{
println!("cargo::rustc-cfg=sceptre_ocr");
}
if std::env::var_os("CARGO_FEATURE_ORT_BUNDLED").is_some()
&& std::env::var_os("CARGO_FEATURE_ORT_DYNAMIC").is_some()
{
println!(
"cargo::warning=features 'ort-bundled' and 'ort-dynamic' are both enabled; bundled ORT remains the default unless dynamic ORT is explicitly selected at runtime"
);
}
println!("cargo::rustc-check-cfg=cfg(layout_detection)");
if std::env::var_os("CARGO_FEATURE_LAYOUT_DETECTION").is_some()
|| std::env::var_os("CARGO_FEATURE_LAYOUT_TRACT").is_some()
{
println!("cargo::rustc-cfg=layout_detection");
}
println!("cargo::rustc-check-cfg=cfg(paddle_ocr)");
if std::env::var_os("CARGO_FEATURE_PADDLE_OCR_ORT").is_some()
|| std::env::var_os("CARGO_FEATURE_PADDLE_OCR_TRACT").is_some()
{
println!("cargo::rustc-cfg=paddle_ocr");
}
if let Ok(manifest_dir) = std::env::var("CARGO_MANIFEST_DIR") {
emit_rerun_directives(&manifest_dir);
}
println!("cargo::rustc-env=XBERG_BUILD_ID={}", build_id());
}
fn emit_rerun_directives(manifest_dir: &str) {
println!("cargo::rerun-if-env-changed=XBERG_BUILD_ID");
println!("cargo::rerun-if-changed={manifest_dir}/src");
println!("cargo::rerun-if-changed={manifest_dir}/Cargo.toml");
let Some(git_dir) = git_stdout(manifest_dir, &["rev-parse", "--git-dir"]) else {
return;
};
let git_dir = git_dir.trim();
if git_dir.is_empty() {
return;
}
let base = if std::path::Path::new(git_dir).is_absolute() {
git_dir.to_string()
} else {
format!("{manifest_dir}/{git_dir}")
};
println!("cargo::rerun-if-changed={base}/HEAD");
println!("cargo::rerun-if-changed={base}/index");
}
fn build_id() -> String {
if let Ok(id) = std::env::var("XBERG_BUILD_ID")
&& !id.is_empty()
{
return id;
}
let Ok(manifest_dir) = std::env::var("CARGO_MANIFEST_DIR") else {
return String::new();
};
let Some(sha) = git_stdout(&manifest_dir, &["rev-parse", "HEAD"]) else {
return String::new();
};
let sha = sha.trim();
let diff = git_stdout(&manifest_dir, &["diff", "HEAD"]).unwrap_or_default();
let untracked = git_stdout(&manifest_dir, &["ls-files", "--others", "--exclude-standard"]).unwrap_or_default();
if diff.is_empty() && untracked.is_empty() {
return sha.to_string();
}
use std::hash::{Hash, Hasher};
let mut hasher = std::collections::hash_map::DefaultHasher::new();
diff.hash(&mut hasher);
untracked.hash(&mut hasher);
format!("{sha}-dirty-{:016x}", hasher.finish())
}
fn git_stdout(dir: &str, args: &[&str]) -> Option<String> {
let output = std::process::Command::new("git")
.args(args)
.current_dir(dir)
.output()
.ok()?;
if !output.status.success() {
return None;
}
String::from_utf8(output.stdout).ok()
}