rscamper 0.2.2

Rust interface to scamper network measurement tool
Documentation
/// Minimum scamper release required by this version of rscamper.
const SCAMPER_MIN_VERSION: u32 = 20260204;

fn check_scamper_version() {
    use std::process::Command;

    let output = match Command::new("scamper").arg("-v").output() {
        Ok(o) => o,
        Err(_) => {
            println!(
                "cargo:warning=rscamper: could not run `scamper -v` — \
                 make sure scamper >= {} is installed and on PATH",
                SCAMPER_MIN_VERSION
            );
            return;
        }
    };

    // scamper prints its version to stdout: "scamper version 20260204"
    let stdout = String::from_utf8_lossy(&output.stdout);
    let version_str = stdout
        .lines()
        .find_map(|line| {
            let lower = line.to_lowercase();
            if lower.contains("version") {
                lower.split_whitespace().last().map(|s| s.to_owned())
            } else {
                None
            }
        });

    match version_str.and_then(|s| s.parse::<u32>().ok()) {
        Some(v) if v >= SCAMPER_MIN_VERSION => {} // OK
        Some(v) => {
            println!(
                "cargo:warning=rscamper: scamper {} is too old — \
                 version {} or later is required. \
                 Download from https://www.caida.org/catalog/software/scamper/",
                v, SCAMPER_MIN_VERSION
            );
        }
        None => {
            println!(
                "cargo:warning=rscamper: could not determine scamper version — \
                 version {} or later is required",
                SCAMPER_MIN_VERSION
            );
        }
    }
}

fn main() {
    check_scamper_version();

    // Allow the user to override the library search path via an environment variable.
    // Example: SCAMPER_LIB_DIR=/opt/local/lib cargo build
    if let Ok(dir) = std::env::var("SCAMPER_LIB_DIR") {
        println!("cargo:rustc-link-search=native={}", dir);
    } else {
        // Fall back to common installation prefixes used by `make install`.
        println!("cargo:rustc-link-search=native=/usr/local/lib");
        println!("cargo:rustc-link-search=native=/usr/lib");
        println!("cargo:rustc-link-search=native=/usr/lib/x86_64-linux-gnu");
        println!("cargo:rustc-link-search=native=/usr/lib/aarch64-linux-gnu");
    }
    println!("cargo:rustc-link-lib=scamperfile");
    println!("cargo:rustc-link-lib=scamperctrl");

    // Rerun this script only when the env var or scamper binary changes.
    println!("cargo:rerun-if-env-changed=SCAMPER_LIB_DIR");
    println!("cargo:rerun-if-changed=build.rs");
}