radroots-net-core 0.1.0-alpha.1

network orchestration primitives and runtime interfaces for the radroots sdk
Documentation
use std::env;
use std::path::PathBuf;
use std::process::Command;
use std::time::{SystemTime, UNIX_EPOCH};

fn main() {
    println!("cargo:rerun-if-changed=build.rs");
    println!("cargo:rerun-if-env-changed=CARGO_MANIFEST_DIR");
    println!("cargo:rerun-if-env-changed=RUSTC");
    println!("cargo:rerun-if-env-changed=PROFILE");

    let manifest_dir =
        env::var("CARGO_MANIFEST_DIR").expect("missing required env var CARGO_MANIFEST_DIR");

    let mut dir = PathBuf::from(&manifest_dir);
    let git_dir = loop {
        if dir.join(".git").exists() {
            break dir.join(".git");
        }
        if !dir.pop() {
            break PathBuf::from(".git");
        }
    };

    if git_dir.exists() {
        println!("cargo:rerun-if-changed={}", git_dir.join("HEAD").display());
        println!(
            "cargo:rerun-if-changed={}",
            git_dir.join("refs/heads").display()
        );
        println!("cargo:rerun-if-changed={}", git_dir.join("index").display());
    }

    let build_time_unix = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .map(|d| d.as_secs())
        .expect("system time before unix epoch");
    println!("cargo:rustc-env=BUILD_TIME_UNIX={}", build_time_unix);

    let rustc_bin = env::var("RUSTC").expect("missing required env var RUSTC");
    if let Ok(out) = Command::new(rustc_bin).arg("--version").output() {
        if out.status.success() {
            if let Ok(ver) = String::from_utf8(out.stdout) {
                println!("cargo:rustc-env=RUSTC_VERSION={}", ver.trim());
            }
        }
    }

    let git_hash = Command::new("git")
        .args(["rev-parse", "--short=12", "HEAD"])
        .output()
        .ok()
        .and_then(|o| {
            if o.status.success() {
                String::from_utf8(o.stdout).ok()
            } else {
                None
            }
        })
        .map(|s| s.trim().to_string());

    let dirty = Command::new("git")
        .args(["status", "--porcelain"])
        .output()
        .ok()
        .map(|o| o.status.success() && !o.stdout.is_empty())
        .unwrap_or(false);

    if let Some(mut h) = git_hash {
        if dirty {
            h.push_str("-dirty");
        }
        println!("cargo:rustc-env=GIT_HASH={}", h);
    }

    let profile = env::var("PROFILE").expect("missing required env var PROFILE");
    println!("cargo:rustc-env=PROFILE={}", profile);
}