openbabel-sys 0.5.4+openbabel-3.1.1

Native bindings to OpenBabel
Documentation
fn main() {
    let version = "3.1.1";
    // let target = std::env::var("TARGET").unwrap();
    // let windows = target.contains("windows");
    let dst = std::path::PathBuf::from(std::env::var_os("OUT_DIR").unwrap());
    let include = dst.join("include");
    println!("cargo:root={}", dst.display());
    println!("cargo:include={}", include.display());
    if !include.exists() {
        std::fs::create_dir(&include).unwrap();
    }

    // if !std::path::Path::new("openbabel/.git").exists() {
    //     match std::process::Command::new("git")
    //         .args(&["submodule", "update", "--init"])
    //         .status().unwrap();
    // }

    // copy data directory
    let data_ob = dst.join("data").join(&version);
    if !data_ob.exists() {
        std::fs::create_dir_all(&data_ob).unwrap();
        fs_extra::dir::copy("src/data", data_ob.to_str().unwrap(), &fs_extra::dir::CopyOptions::new()).unwrap();
    }

    // babelconfig.h
    let include_ob = include.join("openbabel");
    if !include_ob.exists() {
        std::fs::create_dir(include_ob).unwrap();
    }
    let contents = std::fs::read_to_string("openbabel/src/config.h.cmake").unwrap();
    std::fs::write(
        include.join("openbabel/babelconfig.h"),
        contents
            .replace("@BABEL_DATADIR@", data_ob.to_str().unwrap())
            .replace("@BABEL_VERSION@", &version)
            .replace("@MODULE_EXTENSION@", "na")
            .replace("@OB_MODULE_PATH@", "na") 
            .replace("#cmakedefine HAVE_CONIO_H 1", "")
            .replace("#cmakedefine HAVE_SRANDDEV 1", "")
            .replace("#cmakedefine SCANDIR_NEEDS_CONST 1", "")
            .replace("#cmakedefine", "#define")
            .replace("@OB_SHARED_PTR_IMPLEMENTATION@", "std::shared_ptr")
            .replace("@OB_SHARED_PTR_HEADER@", "memory")
    ).unwrap();

    // Compiling
    cxx_build::bridge("src/lib.rs")
        .file("openbabel/src/base.cpp")
        .file("openbabel/src/atom.cpp")
        .file("openbabel/src/bond.cpp")
        .file("openbabel/src/oberror.cpp")
        .file("openbabel/src/tokenst.cpp")
        .file("openbabel/src/generic.cpp")
        .file("openbabel/src/rand.cpp")
        .file("openbabel/src/graphsym.cpp")
        .file("openbabel/src/ring.cpp")
        .file("openbabel/src/phmodel.cpp")
        .file("openbabel/src/obiter.cpp")
        .file("openbabel/src/builder.cpp")
        .file("openbabel/src/plugin.cpp")
        .file("openbabel/src/data.cpp")
        .file("openbabel/src/locale.cpp")
        .file("openbabel/src/obutil.cpp")
        .file("openbabel/src/descriptor.cpp")
        .file("openbabel/src/elements.cpp")
        .file("openbabel/src/typer.cpp")
        .file("openbabel/src/chains.cpp")
        .file("openbabel/src/bitvec.cpp")
        .file("openbabel/src/parsmart.cpp")
        .file("openbabel/src/residue.cpp")
        .file("openbabel/src/mol.cpp")
        .file("openbabel/src/transform.cpp")
        .file("openbabel/src/obconversion.cpp")
        .file("openbabel/src/format.cpp")
        .file("openbabel/src/obmolecformat.cpp")
        .file("openbabel/src/reactionfacade.cpp")
        .file("openbabel/src/kekulize.cpp")
        .file("openbabel/src/canon.cpp")
        .file("openbabel/src/obfunctions.cpp")
        .file("openbabel/src/griddata.cpp")
        .file("openbabel/src/grid.cpp")
        .file("openbabel/src/bondtyper.cpp")
        .file("openbabel/src/stereo/cistrans.cpp")
        .file("openbabel/src/stereo/tetrahedral.cpp")
        .file("openbabel/src/stereo/tetranonplanar.cpp")
        .file("openbabel/src/stereo/stereo.cpp")
        .file("openbabel/src/stereo/perception.cpp")
        .file("openbabel/src/stereo/facade.cpp")
        .file("openbabel/src/stereo/squareplanar.cpp")
        .file("openbabel/src/stereo/tetraplanar.cpp")
        .file("openbabel/src/math/vector3.cpp")
        .file("openbabel/src/math/matrix3x3.cpp")
        .file("openbabel/src/math/spacegroup.cpp")
        .file("openbabel/src/math/transform3d.cpp")
        .file("openbabel/src/fingerprints/finger2.cpp")
        .file("openbabel/src/fingerprints/finger3.cpp")
        .file("openbabel/src/fingerprints/fingerecfp.cpp")
        .file("openbabel/src/fingerprint.cpp")
        .file("openbabel/src/forcefields/forcefielduff.cpp")
        .file("openbabel/src/forcefields/forcefieldgaff.cpp")
        .file("openbabel/src/forcefields/forcefieldmmff94.cpp")
        .file("openbabel/src/forcefields/forcefieldghemical.cpp")
        .file("openbabel/src/forcefield.cpp")
        .file("openbabel/src/molchrg.cpp")
        // .file("openbabel/src/forcefields/forcefieldmm2.cpp")  // compilation error when added
        .file("openbabel/src/formats/smilesformat.cpp")
        .file("openbabel/src/formats/xyzformat.cpp")
        .file("openbabel/src/formats/gaussformat.cpp")
        .file("openbabel/src/formats/gausscubeformat.cpp")
        .file("openbabel/src/formats/gausszmatformat.cpp")
        .file("openbabel/src/formats/fchkformat.cpp")
        .file("openbabel/src/formats/turbomoleformat.cpp")
        .file("openbabel/src/formats/daltonformat.cpp")
        .file("openbabel/src/formats/orcaformat.cpp")
        .file("openbabel/src/formats/siestaformat.cpp")
        .file("openbabel/src/formats/mdlformat.cpp")
        .file("openbabel/src/formats/pdbformat.cpp")
        .file("openbabel/src/alias.cpp")
        .file("openbabel/src/mcdlutil.cpp")
        .file("src/wrapper.cpp")
        .include(include)
        .include("src")
        .include("src/data")
        .include("openbabel/include")
        .include("openbabel/src/formats") // smilesvalence.h
        .flag_if_supported("-std=c++14")
        .flag_if_supported("-Wno-unused-parameter")
        .flag_if_supported("-Wno-unused-function")
        .flag_if_supported("-Wno-unused-variable")
        .flag_if_supported("-Wno-deprecated-declarations")
        .flag_if_supported("-Wno-sign-compare")
        .flag_if_supported("-Wno-deprecated-copy")
        .flag_if_supported("-Wno-overloaded-virtual")
        .flag_if_supported("-Wno-char-subscripts")
        .flag_if_supported("-Wno-unused-but-set-variable")
        .flag_if_supported("-Wno-implicit-fallthrough")
        .flag_if_supported("-Wno-extra")
        .flag_if_supported("-Wno-reorder")
        .flag_if_supported("-Wno-misleading-indentation")
        .flag_if_supported("-Wno-parentheses")
        // .flag("-Wno-c++11-extensions")
        .flag_if_supported("-Wno-unused-private-field")
        .compile("openbabel");

        println!("cargo:rerun-if-changed=src/lib.rs");
        println!("cargo:rerun-if-changed=src/wrapper.h");
        println!("cargo:rerun-if-changed=src/wrapper.cpp");
}