use std::env; use std::fs::File; use std::io::Write; use std::path::Path; use std::process::Command; fn get_git_version() -> (u32, String) { let version_code = String::from_utf8( Command::new("git") .args(["rev-list", "--count", "HEAD"]) .output() .expect("Failed to get git count") .stdout, ) .expect("Failed to read git count stdout"); let version_code: u32 = version_code .trim() .parse() .expect("Failed to parse git count"); let version_code = 10000 + 200 + version_code; // For historical reasons let version_name = String::from_utf8( Command::new("git") .args(["describe", "--tags", "--always"]) .output() .expect("Failed to get git version") .stdout, ) .expect("Failed to read git version stdout"); (version_code, version_name) } fn main() { let (code, name) = get_git_version(); let out_dir = env::var("OUT_DIR").expect("Failed to get $OUT_DIR"); let out_dir = Path::new(&out_dir); File::create(Path::new(out_dir).join("VERSION_CODE")) .expect("Failed to create VERSION_CODE") .write_all(code.to_string().as_bytes()) .expect("Failed to write VERSION_CODE"); File::create(Path::new(out_dir).join("VERSION_NAME")) .expect("Failed to create VERSION_NAME") .write_all(name.trim().as_bytes()) .expect("Failed to write VERSION_NAME"); }