use std::process::Command;
use std::path::PathBuf;
const CPPFLAGS: &'static str = "-std=c++14 -flto -O3 -DNDEBUG -ffast-math -fno-builtin-malloc -Wall -Wextra -Wshadow -Wconversion -Wuninitialized -Dalways_inline=";
fn main() {
let build_dir = PathBuf::from(std::env::var("OUT_DIR").expect("No OUT_DIR."));
let hoard_build = build_dir.join("Hoard");
let hoard_src = build_dir.join("Hoard/src");
let heaplayers_build = build_dir.join("Hoard/src/Heap-Layers");
let this = PathBuf::from(file!()).canonicalize().unwrap();
let root_dir = this.parent().unwrap();
let hoard_module = root_dir.join("Hoard");
let heaplayers_module = root_dir.join("Heap-Layers");
if !hoard_build.exists() {
let mut cmd = Command::new("cp");
cmd.current_dir(&build_dir).args(&["-r", &hoard_module.to_str().unwrap(), &hoard_build.to_str().unwrap()]);
run_command(&mut cmd);
assert!(hoard_build.exists(), "Hoard is not symlinked properly: {:?}", hoard_build);
}
if !heaplayers_build.exists() {
let mut cmd = Command::new("cp");
cmd.current_dir(&hoard_src).args(&["-r", &heaplayers_module.to_str().unwrap(), &heaplayers_build.to_str().unwrap()]);
run_command(&mut cmd);
assert!(heaplayers_build.exists(), "Heap-Layers is not symlinked properly: {:?}", heaplayers_build);
}
let mut cmd = Command::new("make");
cmd.current_dir(&hoard_src).args(&[&get_hoard_build_string(), &format!("CPPFLAGS={}", CPPFLAGS)]);
run_command(&mut cmd);
println!("cargo:rustc-link-lib=static=hoard");
println!("cargo:rustc-link-search=native={}", &hoard_src.to_str().unwrap());
}
fn run_command(cmd: &mut Command) {
match cmd.status() {
Ok(ret) => assert!(ret.success(), "{:?} returned non-zero: {:?}", cmd, ret),
Err(e) => panic!("Failed to run command {:?}: {:?}", cmd, e),
}
}
fn get_hoard_build_string() -> String {
use uname::uname;
match uname() {
Ok(info) => format!("{}-gcc-{}-static", info.sysname, info.machine),
Err(e) => panic!("Failed to get uname: {:?}", e),
}
}