sftrace-setup 0.1.2

Setup helper for sftrace (instrumentation-based trace tool)
Documentation
use std::path::PathBuf;


fn main() {
    let name = "SFTRACE_DYLIB_DIR";
    
    println!("cargo::rerun-if-env-changed={}", name);

    let path = match std::env::var(name).ok() {
        Some(path) => Some(PathBuf::from(path)),
        None => search_sftracelib_dir()
    };

    if let Some(dir) = path {
        let link = std::env::var("CARGO_MANIFEST_LINKS").unwrap();
        
        println!("cargo::rustc-link-search=native={}", dir.display());
        println!("cargo::rustc-link-lib=dylib={}", link);
    }
}

fn search_sftracelib_dir() -> Option<PathBuf> {
    use std::process::{ Command, Stdio };

    let result = Command::new("sftrace")
        .stdin(Stdio::null())
        .stdout(Stdio::piped())
        .stderr(Stdio::inherit())
        .arg("record")
        .arg("--print-solib")
        .output();

    match result {
        Ok(output) if output.status.success() => {
            let out = String::from_utf8(output.stdout).ok()?;
            let mut out = PathBuf::from(out);
            out.pop();
            Some(out)
        },
        _ => None,
    }
}