use std::env;
use std::path::PathBuf;
use std::process::Command;
fn main() {
pre_serialize_builtins_spec();
if env::var("TARGET").is_ok_and(|t| t.contains("wasm32")) {
return;
}
println!("cargo:rerun-if-env-changed=CMAKEFMT_BUILD_GIT_SHA");
println!("cargo:rerun-if-changed=.git/HEAD");
println!("cargo:rerun-if-changed=.git/refs");
let version = env::var("CARGO_PKG_VERSION").unwrap_or_else(|_| "unknown".to_owned());
let long_version = match git_sha() {
Some(sha) => format!("{version} ({sha})"),
None => version,
};
println!("cargo:rustc-env=CMAKEFMT_CLI_LONG_VERSION={long_version}");
}
fn pre_serialize_builtins_spec() {
println!("cargo:rerun-if-changed=src/spec/builtins.yaml");
let yaml = std::fs::read_to_string("src/spec/builtins.yaml").expect("read builtins.yaml");
let value: serde_yaml::Value =
serde_yaml::from_str(&yaml).expect("parse builtins.yaml as serde_yaml::Value");
let bytes = rmp_serde::to_vec(&value).expect("serialise builtins spec as MessagePack");
let out_dir = env::var("OUT_DIR").expect("OUT_DIR set by cargo");
let out_path = PathBuf::from(out_dir).join("builtins.msgpack");
std::fs::write(&out_path, bytes).expect("write builtins.msgpack");
}
fn git_sha() -> Option<String> {
if let Ok(explicit) = env::var("CMAKEFMT_BUILD_GIT_SHA") {
let trimmed = explicit.trim();
if !trimmed.is_empty() {
return Some(trimmed.to_owned());
}
}
let output = Command::new("git")
.args(["rev-parse", "--short=12", "HEAD"])
.output()
.ok()?;
if !output.status.success() {
return None;
}
let sha = String::from_utf8(output.stdout).ok()?;
let sha = sha.trim();
(!sha.is_empty()).then(|| sha.to_owned())
}