extern crate bindgen;
use std::process::Command;
use std::env;
use std::path::{Path, PathBuf};
fn main() {
let target = env::var("TARGET").unwrap();
let out_dir = env::var("OUT_DIR").unwrap();
let xgb_root = Path::new(&out_dir).join("xgboost");
if !xgb_root.exists() {
Command::new("cp")
.args(&["-r", "xgboost", xgb_root.to_str().unwrap()])
.status()
.unwrap_or_else(|e| {
panic!("Failed to copy ./xgboost to {}: {}", xgb_root.display(), e);
});
}
if !xgb_root.join("lib").exists() {
Command::new(xgb_root.join("build.sh"))
.current_dir(&xgb_root)
.status()
.expect("Failed to execute XGBoost build.sh script.");
}
let xgb_root = xgb_root.canonicalize().unwrap();
let bindings = bindgen::Builder::default()
.header("wrapper.h")
.clang_arg(format!("-I{}", xgb_root.join("include").display()))
.clang_arg(format!("-I{}", xgb_root.join("rabit/include").display()))
.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.");
println!("cargo:rustc-link-search={}", xgb_root.join("lib").display());
println!("cargo:rustc-link-search={}", xgb_root.join("rabit/lib").display());
println!("cargo:rustc-link-search={}", xgb_root.join("dmlc-core").display());
if xgb_root.join("rabit/lib/librabit.a").exists() {
println!("cargo:rustc-link-lib=static=rabit");
println!("cargo:rustc-link-lib=dylib=gomp");
} else {
println!("cargo:rustc-link-lib=static=rabit_empty");
}
if target.contains("apple") {
println!("cargo:rustc-link-lib=c++");
} else {
println!("cargo:rustc-link-lib=stdc++");
}
println!("cargo:rustc-link-lib=static=dmlc");
println!("cargo:rustc-link-lib=static=xgboost");
}