use std::borrow::Borrow;
use std::env;
use std::ffi::OsStr;
use std::path::{Path, PathBuf};
use std::process::Command;
fn main() {
env_logger::init();
eprintln!("Setting up submodules");
run_command_or_fail(".", "git", &["submodule", "update", "--init"]);
run_command_or_fail(".", "mkdir", &["-p", "rdkit/build"]);
eprintln!("Building and linking rdkit statically");
build_rdkit();
}
fn run_command_or_fail<P, S>(dir: &str, cmd: P, args: &[S])
where
P: AsRef<Path>,
S: Borrow<str> + AsRef<OsStr>,
{
let cmd = cmd.as_ref();
let cmd = if cmd.components().count() > 1 && cmd.is_relative() {
PathBuf::from(dir)
.join(cmd)
.canonicalize()
.expect("canonicalization failed")
} else {
PathBuf::from(cmd)
};
eprintln!(
"Running command: \"{} {}\" in dir: {}",
cmd.display(),
args.join(" "),
dir
);
let ret = Command::new(cmd).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_rdkit() {
let mut config = cmake::Config::new("rdkit");
config
.define("RDK_BUILD_CFFI_LIB", "ON")
.define("RDK_INSTALL_STATIC_LIBS", "ON")
.define("RDK_BUILD_INCHI_SUPPORT", "ON")
.define("RDK_INSTALL_INTREE", "OFF")
.define("RDK_BUILD_PYTHON_WRAPPERS", "OFF")
.define("RDK_BUILD_SWIG_JAVA_WRAPPER", "OFF")
.define("RDK_BUILD_CPP_TESTS", "OFF") .define("RDK_OPTIMIZE_POPCNT", "OFF") ;
config.very_verbose(true);
println!("Configuring and compiling rdkit");
let dst = config.build();
eprintln!("{}", dst.display());
println!("cargo:rustc-link-search=native={}/lib", dst.display());
println!("cargo:rustc-link-lib=dylib=rdkitcffi");
let crate_root = env::var("CARGO_MANIFEST_DIR").unwrap();
let cffiwrapper_h_path = format!("{}/rdkit/Code/MinimalLib/cffiwrapper.h", crate_root);
let rdkit_search_path = dst.join("include/rdkit");
let clang_rdkit_search = format!("-F{}", rdkit_search_path.display());
let brew_include_path = "/opt/homebrew/include";
let brew_search = format!("-F{}", brew_include_path);
let bindings = bindgen::Builder::default()
.clang_arg(&clang_rdkit_search)
.clang_arg(&brew_search)
.header(&cffiwrapper_h_path)
.parse_callbacks(Box::new(bindgen::CargoCallbacks))
.generate()
.expect("Unable to generate bindings");
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}