diff options
Diffstat (limited to 'src/tools/cargo/build.rs')
-rw-r--r-- | src/tools/cargo/build.rs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/tools/cargo/build.rs b/src/tools/cargo/build.rs new file mode 100644 index 000000000..752221f8c --- /dev/null +++ b/src/tools/cargo/build.rs @@ -0,0 +1,70 @@ +use flate2::{Compression, GzBuilder}; +use std::ffi::OsStr; +use std::fs; +use std::path::Path; +use std::process::Command; + +fn main() { + commit_info(); + compress_man(); + // ALLOWED: Accessing environment during build time shouldn't be prohibited. + #[allow(clippy::disallowed_methods)] + let target = std::env::var("TARGET").unwrap(); + println!("cargo:rustc-env=RUST_HOST_TARGET={target}"); +} + +fn compress_man() { + // ALLOWED: Accessing environment during build time shouldn't be prohibited. + #[allow(clippy::disallowed_methods)] + let out_path = Path::new(&std::env::var("OUT_DIR").unwrap()).join("man.tgz"); + let dst = fs::File::create(out_path).unwrap(); + let encoder = GzBuilder::new() + .filename("man.tar") + .write(dst, Compression::best()); + let mut ar = tar::Builder::new(encoder); + ar.mode(tar::HeaderMode::Deterministic); + + let mut add_files = |dir, extension| { + let mut files = fs::read_dir(dir) + .unwrap() + .map(|e| e.unwrap().path()) + .collect::<Vec<_>>(); + files.sort(); + for path in files { + if path.extension() != Some(extension) { + continue; + } + println!("cargo:rerun-if-changed={}", path.display()); + ar.append_path_with_name(&path, path.file_name().unwrap()) + .unwrap(); + } + }; + + add_files(Path::new("src/etc/man"), OsStr::new("1")); + add_files(Path::new("src/doc/man/generated_txt"), OsStr::new("txt")); + let encoder = ar.into_inner().unwrap(); + encoder.finish().unwrap(); +} + +fn commit_info() { + if !Path::new(".git").exists() { + return; + } + let output = match Command::new("git") + .arg("log") + .arg("-1") + .arg("--date=short") + .arg("--format=%H %h %cd") + .arg("--abbrev=9") + .output() + { + Ok(output) if output.status.success() => output, + _ => return, + }; + let stdout = String::from_utf8(output.stdout).unwrap(); + let mut parts = stdout.split_whitespace(); + let mut next = || parts.next().unwrap(); + println!("cargo:rustc-env=CARGO_COMMIT_HASH={}", next()); + println!("cargo:rustc-env=CARGO_COMMIT_SHORT_HASH={}", next()); + println!("cargo:rustc-env=CARGO_COMMIT_DATE={}", next()) +} |