extern crate gcc;
extern crate bindgen;
extern crate build_probe_mpi;
extern crate rustc_version;
use std::env;
use std::path::Path;
use rustc_version::Version as RustcVersion;
fn main() {
env::set_var("CC", "mpicc");
gcc::compile_library("librsmpi.a", &["src/ffi/rsmpi.c"]);
let lib = match build_probe_mpi::probe() {
Ok(lib) => lib,
Err(errs) => {
println!("Could not find MPI library for various reasons:\n");
for (i, err) in errs.iter().enumerate() {
println!("Reason #{}:\n{}\n", i, err);
}
panic!();
}
};
for dir in &lib.lib_paths {
println!("cargo:rustc-link-search=native={}", dir.display());
}
for lib in &lib.libs {
println!("cargo:rustc-link-lib={}", lib);
}
let mut builder = bindgen::builder();
for lib in &lib.libs { builder = builder.link(lib.clone()); }
for dir in &lib.lib_paths { builder = builder.clang_arg(format!("-L{}", dir.display())); }
for dir in &lib.include_paths { builder = builder.clang_arg(format!("-I{}", dir.display())); }
let bindings = builder
.header("src/ffi/rsmpi.h")
.emit_builtins()
.no_unstable_rust()
.hide_type("mpich_struct_mpi_long_double_int")
.hide_type("max_align_t") .generate()
.unwrap();
let out_dir = env::var("OUT_DIR").expect("cargo did not set OUT_DIR");
let out_file = Path::new(&out_dir).join("functions_and_types.rs");
bindings
.write_to_file(out_file)
.unwrap();
if rustc_version::version().unwrap() >= RustcVersion::parse("1.13.0").unwrap() {
println!("cargo:rustc-cfg=extern_statics_are_unsafe");
}
}