-
-
Notifications
You must be signed in to change notification settings - Fork 25
/
build.rs
76 lines (66 loc) · 2.67 KB
/
build.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// build.rs
use std::env;
use std::path::Path;
use std::process::Command;
fn main() {
let result_of_git = version_from_git_info();
match result_of_git {
Ok(version) => {
println!("cargo:rustc-env=VW_VERSION={version}");
println!("cargo:rustc-env=CARGO_PKG_VERSION={version}");
println!("cargo:rustc-env=GIT_EXACT_TAG={version}");
}
Err(_) => {
println!("cargo:rustc-env=VW_VERSION=unknown");
println!("cargo:rustc-env=CARGO_PKG_VERSION=unknown");
println!("cargo:rustc-env=GIT_EXACT_TAG=unknown");
println!("cargo:rustc-env=GIT_LAST_TAG=unknown");
println!("cargo:rustc-env=GIT_BRANCH=unknown");
println!("cargo:rustc-env=GIT_REV=unknown");
}
}
create_git_sqlite();
}
fn create_git_sqlite() {
let src = env::var("CARGO_MANIFEST_DIR").unwrap();
let dst = Path::new(&env::var("OUT_DIR").unwrap()).join("built.rs");
println!("Path: {:?}", dst);
let path = Path::new(&src);
built::write_built_file_with_opts(Option::from(path), &dst)
.expect("Failed to acquire build-time information");
}
fn version_from_git_info() -> Result<String, std::io::Error> {
// The exact tag for the current commit, can be empty when
// the current commit doesn't have an associated tag
let exact_tag = run(&["git", "describe", "--abbrev=0", "--tags", "--exact-match"]).ok();
if let Some(ref exact) = exact_tag {
println!("cargo:rustc-env=GIT_EXACT_TAG={exact}");
}
// The last available tag, equal to exact_tag when
// the current commit is tagged
let last_tag = run(&["git", "describe", "--abbrev=0", "--tags"])?;
println!("cargo:rustc-env=GIT_LAST_TAG={last_tag}");
// The current branch name
let branch = run(&["git", "rev-parse", "--abbrev-ref", "HEAD"])?;
println!("cargo:rustc-env=GIT_BRANCH={branch}");
// The current git commit hash
let rev = run(&["git", "rev-parse", "HEAD"])?;
let rev_short = rev.get(..8).unwrap_or_default();
println!("cargo:rustc-env=GIT_REV={rev_short}");
// Combined version
if let Some(exact) = exact_tag {
Ok(exact)
} else if &branch != "main" && &branch != "master" {
Ok(format!("{last_tag}-{rev_short} ({branch})"))
} else {
Ok(format!("{last_tag}-{rev_short}"))
}
}
fn run(args: &[&str]) -> Result<String, std::io::Error> {
let out = Command::new(args[0]).args(&args[1..]).output()?;
if !out.status.success() {
use std::io::{Error, ErrorKind};
return Err(Error::new(ErrorKind::Other, "Command not successful"));
}
Ok(String::from_utf8(out.stdout).unwrap().trim().to_string())
}