gnudbm 0.2.5

Ergonomic bindings for gdbm
// Permission is hereby granted, free of charge, to any
// person obtaining a copy of this software and associated
// documentation files (the "Software"), to deal in the
// Software without restriction, including without
// limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of
// the Software, and to permit persons to whom the Software
// is furnished to do so, subject to the following
// conditions:

// The above copyright notice and this permission notice
// shall be included in all copies or substantial portions
// of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.

#[cfg(not(feature = "system-gdbm"))]
const GDBM_VERSION: &str = "1.14.1";

fn main() {
    #[cfg(not(feature = "system-gdbm"))]
    {
        use std::path::PathBuf;
        use std::process::Command;
        use std::fs;
        use std::env;

        let crate_root = PathBuf::from(&env::var("CARGO_MANIFEST_DIR").unwrap());
        let out_dir = PathBuf::from(&env::var("OUT_DIR").unwrap());
        let dest = out_dir.join("build");
        if !dest.exists() {
            fs::create_dir(&dest).unwrap();
        }

        let src_dir = crate_root.join("vendor").join(format!("gdbm-{}", GDBM_VERSION));
        if !dest.join("lib").exists() {
            eprintln!("building gdbm, dest = {}", dest.display());
            assert!(
                Command::new(src_dir.join("configure"))
                .arg("--without-readline")
                .arg(&format!("--prefix={}", dest.display()))
                .current_dir(&src_dir)
                .output()
                .unwrap()
                .status.success()
                );

            assert!(
                Command::new("make")
                .current_dir(&src_dir)
                .output()
                .unwrap()
                .status.success()
                );

            assert!(
                Command::new("make")
                .arg("install")
                .current_dir(&src_dir)
                .output()
                .unwrap()
                .status.success()
                );

            // so we don't dirty our source dir
            let _ = Command::new("make")
                .arg("distclean")
                .current_dir(&src_dir)
                .output();

        }
        println!("cargo:rustc-link-lib=static=gdbm");
        println!("cargo:rustc-flags=-L {}", dest.join("lib").display());
    }

    #[cfg(feature = "system-gdbm")]
    {
        println!("cargo:rustc-link-lib=gdbm");
    }
}