irmin 0.3.3

Irmin bindings for rust
Documentation
use std::path::PathBuf;

fn find_path<E: std::error::Error>(paths: Vec<Result<PathBuf, E>>) -> (PathBuf, PathBuf) {
    if cfg!(feature = "docs") {
        return (PathBuf::new(), PathBuf::from("docs/irmin.h"));
    }

    for path in paths.into_iter().flatten() {
        let lib = path.join("lib").join("libirmin.so");
        let header = path.join("include").join("irmin.h");
        if lib.exists() && header.exists() {
            return (lib, header);
        }
    }

    panic!("Unable to locate libirmin installation, try `opam install libirmin` or setting LIBIRMIN_PREFIX")
}

fn main() {
    let path = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
    let opam_prefix =
        std::env::var("OPAM_SWITCH_PREFIX").map(|x| PathBuf::from(x).join("lib").join("libirmin"));
    let libirmin_prefix = std::env::var("LIBIRMIN_PREFIX").map(PathBuf::from);
    let local_opam = PathBuf::from("_opam").join("lib").join("libirmin");
    let home_local = std::env::var("HOME").map(|x| PathBuf::from(x).join(".local"));

    let (lib, header) = find_path(vec![
        Ok(path.join("..")),
        libirmin_prefix,
        opam_prefix,
        Ok(local_opam),
        home_local,
        Ok(PathBuf::from("/usr/local")),
    ]);

    println!("cargo:rerun-if-changed={}", header.display());

    if cfg!(not(feature = "docs")) {
        println!(
            "cargo:rustc-link-arg=-Wl,-rpath,{}",
            lib.parent().unwrap().display()
        );
        println!(
            "cargo:rustc-link-search={}",
            lib.parent().unwrap().display()
        );
        println!("cargo:rustc-link-lib=irmin");
        println!("cargo:rerun-if-changed={}", header.display());
    }

    let bindings = bindgen::builder()
        .header(header.to_str().unwrap())
        .allowlist_type("Irmin.*")
        .allowlist_function("irmin.*")
        .allowlist_function("caml.*")
        .generate()
        .unwrap();

    let out_path = std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap());
    bindings.write_to_file(out_path.join("c.rs")).unwrap();
}