use ::std::{
env,
path::{Path, PathBuf},
process::Command,
};
fn main() {
self::prepare();
self::compile("fontstash.c");
self::gen_bindings("fontstash_wrapper.h", "fontstash_bindings.rs");
}
fn prepare() {
let root = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
Command::new("git")
.current_dir(&root)
.args(&["submodule", "update", "--init", "--recursive"])
.status()
.expect("is git in your PATH?");
}
fn compile(src_path: impl AsRef<Path>) {
let root = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
let out_lib_path = out_dir.join("libfontstash.a");
if !out_lib_path.is_file() {
let file = root.join(src_path);
cc::Build::new()
.file(file)
.flag("-w") .compile("libfontstash.a");
}
println!("cargo:rustc-link-search=native={}", out_dir.display());
println!("cargo:rustc-link-lib=static=fontstash");
}
fn gen_bindings(wrapper: impl AsRef<Path>, dst_file_name: impl AsRef<Path>) {
let wrapper = wrapper.as_ref();
let dst_file_name = dst_file_name.as_ref();
let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
let dst = out_dir.join(&dst_file_name);
println!("cargo:rerun-if-changed={}", wrapper.display());
let bindings = bindgen::Builder::default()
.header(format!("{}", wrapper.display()))
.parse_callbacks(Box::new(bindgen::CargoCallbacks))
.generate()
.unwrap_or_else(|e| {
panic!(
"Unable to generate bindings for `{}`. Original error {:?}",
dst_file_name.display(),
e
)
});
bindings
.write_to_file(&dst)
.unwrap_or_else(|_| panic!("Couldn't write bindings for {}", dst_file_name.display()));
}