coinutils-src 0.1.0

Build CoinUtils as a crate.
use std::env;
use std::path::{Path, PathBuf};
use std::process::Command;

const LIB_NAME: &str = "CoinUtils";

fn main() {
    if !Path::new("CoinUtils/AUTHORS").exists() {
        update_submodules();
    }
    build();
}

fn update_submodules() {
    let program = "git";
    let dir = "../";
    let args = ["submodule", "update", "--init"];
    println!(
        "Running command: \"{} {}\" in dir: {}",
        program,
        args.join(" "),
        dir
    );
    let ret = Command::new(program).current_dir(dir).args(args).status();

    match ret.map(|status| (status.success(), status.code())) {
        Ok((true, _)) => (),
        Ok((false, Some(c))) => panic!("Command failed with error code {}", c),
        Ok((false, None)) => panic!("Command got killed"),
        Err(e) => panic!("Command failed with error: {}", e),
    }
}

fn build() {
    let target = env::var("TARGET").unwrap();

    let mut config = cc::Build::new()
        .cpp(true)
        .warnings(false)
        .extra_warnings(false)
        .define("NDEBUG", None)
        .define("HAVE_STDIO_H", None)
        .define("HAVE_STDLIB_H", None)
        .define("HAVE_STRING_H", None)
        .define("HAVE_INTTYPES_H", None)
        .define("HAVE_STDINT_H", None)
        .define("HAVE_STRINGS_H", None)
        .define("HAVE_SYS_TYPES_H", None)
        .define("HAVE_SYS_STAT_H", None)
        .define("HAVE_UNISTD_H", None)
        .define("HAVE_CMATH", None)
        .define("HAVE_CFLOAT", None)
        .define("HAVE_DLFCN_H", None)
        .define("HAVE_MEMORY_H", None)
        .to_owned();

    if target.contains("msvc") {
        config.flag("-EHsc").flag("-std:c++14");
    } else {
        config.flag("-std=c++11").flag("-w");
    }

    let src_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap())
        .join(LIB_NAME)
        .join(LIB_NAME)
        .join("src");

    let includes_dir = vec![src_dir.clone()];

    config.includes(includes_dir);

    let lib_sources = include_str!("CoinUtils_lib_sources.txt")
        .trim()
        .split('\n')
        .map(|file| format!("{}/{}", src_dir.display(), file.trim()))
        .collect::<Vec<String>>();

    config.files(lib_sources);

    config.compile("CoinUtils");
}