libxdiff-sys 0.1.0

Raw bindings to a vendored version of libxdiff
Documentation
extern crate bindgen;

use std::env;
use std::path::PathBuf;

use bindgen::CargoCallbacks;

const VENDORED: &'static str = "./libxdiff-0.23";

fn main() {
    let starting_libxdiff_path = PathBuf::from(VENDORED)
        .canonicalize()
        .expect("cannot canonicalize path");

    // copy src into build directory before building
    let libxdiff_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("libxdiff-src");
    match std::process::Command::new("cp")
        .current_dir(".")
        .arg("-r")
        .arg(starting_libxdiff_path)
        .arg(&libxdiff_path)
        .output()
    {
        Ok(_) => (),
        Err(e) => {
            eprintln!("{}", e);
            panic!("could not configure");
        },
    };


    let xdiff_path = libxdiff_path.join("xdiff");
    let header_path = xdiff_path.join("xdiff.h");
    let header_path_str = header_path.to_str()
        .expect("Path is not a valid string");

    let libs_path = xdiff_path.join(".libs");

    println!("cargo:rustc-link-search={}", libs_path.to_str().unwrap());
    println!("cargo:rustc-link-lib=static=xdiff");
    println!("cargo:rerun-if-changed={}", header_path_str);

    let configure_path = libxdiff_path.join("configure");
    match std::process::Command::new(configure_path)
        .current_dir(&libxdiff_path)
        .arg("--enable-shared=no")
        .arg("--enable-static=yes")
        .output()
    {
        Ok(_) => (),
        Err(e) => {
            eprintln!("{}", e);
            panic!("could not configure");
        },
    };

    match std::process::Command::new("make")
        .current_dir(&libxdiff_path)
        .output()
    {
        Ok(_) => (),
        Err(e) => {
            eprintln!("{}", e);
            panic!("could not make");
        },
    }

    let bindings = bindgen::Builder::default()
        .header(header_path_str)
        .parse_callbacks(Box::new(CargoCallbacks))
        .generate()
        .expect("Unable to generate bindings");

    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("bindings.rs");
    bindings
        .write_to_file(out_path)
        .expect("Couldn't write bindings!");
}