extern crate bindgen;
extern crate pkg_config;
use std::path::PathBuf;
use std::process::Command;
fn main() {
let out_dir = PathBuf::from(env("OUT_DIR").unwrap());
let statik = env("CARGO_FEATURE_STATIC").is_some();
let system = env("CARGO_FEATURE_SYSTEM").is_some();
let ceed_pc = if system {
"ceed".to_string()
} else {
let makeflags = env("CARGO_MAKEFLAGS").unwrap();
let mut make = Command::new("make");
make.arg("install")
.arg(format!("prefix={}", out_dir.to_string_lossy()))
.arg(format!(
"OBJDIR={}",
out_dir.join("build").to_string_lossy()
))
.arg(format!(
"LIBDIR={}",
out_dir.join("build").join("lib").to_string_lossy()
))
.env("MAKEFLAGS", makeflags)
.current_dir("c-src");
if statik {
make.arg("STATIC=1");
}
run(&mut make);
out_dir
.join("lib")
.join("pkgconfig")
.join("ceed.pc")
.to_string_lossy()
.into_owned()
};
pkg_config::Config::new()
.statik(statik)
.atleast_version("0.8")
.probe(&ceed_pc)
.unwrap();
println!("cargo:rerun-if-changed=c-src/include/ceed/ceed.h");
println!("cargo:rerun-if-changed=c-src/Makefile");
println!("cargo:rerun-if-changed=c-src/config.mk");
let bindings = bindgen::Builder::default()
.header("c-src/include/ceed/ceed.h")
.allowlist_function("Ceed.*")
.allowlist_type("Ceed.*")
.allowlist_var("Ceed.*")
.allowlist_var("CEED_.*")
.opaque_type("FILE")
.opaque_type("va_list")
.allowlist_function("fclose")
.allowlist_function("open_memstream")
.trust_clang_mangling(false)
.parse_callbacks(Box::new(bindgen::CargoCallbacks))
.generate()
.expect("Unable to generate bindings");
bindings
.write_to_file(out_dir.join("bindings.rs"))
.expect("Couldn't write bindings!");
}
fn env(k: &str) -> Option<String> {
std::env::var(k).ok()
}
fn run(command: &mut Command) {
println!("Running: `{:?}`", command);
assert!(command.status().unwrap().success());
}