use std::env; use std::fs::File; use std::io::Write; use std::path::Path; use std::process::Command; fn get_git_version() -> Result<(u32, String), std::io::Error> { let output = Command::new("git") .args(["rev-list", "--count", "HEAD"]) .output()?; let output = output.stdout; let version_code = String::from_utf8(output).expect("Failed to read git count stdout"); let version_code: u32 = version_code .trim() .parse() .map_err(|_| std::io::Error::new(std::io::ErrorKind::Other, "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()? .stdout, ) .map_err(|_| { std::io::Error::new( std::io::ErrorKind::Other, "Failed to read git describe stdout", ) })?; let version_name = version_name.trim_start_matches('v').to_string(); Ok((version_code, version_name)) } fn main() { let (code, name) = match get_git_version() { Ok((code, name)) => (code, name), Err(_) => { // show warning if git is not installed println!("cargo:warning=Failed to get git version, using 0.0.0"); (0, "0.0.0".to_string()) } }; 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"); }