#[cfg(feature = "export_bindings")]
const EM_OS: &str = "emscripten";
#[cfg(feature = "export_bindings")]
fn generate_bindings() {
use std::env;
use std::path::PathBuf;
let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap();
let mut bindings = bindgen::Builder::default()
.header("flecs.h")
.clang_arg("-fvisibility=default") .generate_comments(false)
.layout_tests(false)
.parse_callbacks(Box::new(bindgen::CargoCallbacks));
if target_os == EM_OS {
println!("cargo:rustc-link-arg=-sEXPORT_ES6=1");
println!("cargo:rustc-link-arg=-sMODULARIZE=1");
let emsdk = env::var("EMSDK").unwrap();
let emsdk_include_path = format!("{}/upstream/emscripten/cache/sysroot/include", emsdk);
let include_path = env::var("STDLIB").unwrap_or(emsdk_include_path);
let include_flag = String::from("-I") + &include_path[..include_path.len()];
println!("Used Include Path: {}", include_path);
bindings = bindings.clang_arg(include_flag);
}
let bindings = bindings
.generate_comments(true)
.clang_arg("-fparse-all-comments")
.clang_arg("-fretain-comments-from-system-headers")
.parse_callbacks(Box::new(CommentsCallbacks));
let bindings = bindings
.allowlist_file("flecs.c")
.allowlist_file("flecs.h")
.generate()
.expect("Unable to generate bindings");
let crate_root: PathBuf = env::var("CARGO_MANIFEST_DIR").unwrap().into();
bindings.write_to_file(crate_root.join("src/bindings.rs")).unwrap();
}
fn main() {
println!("cargo:rerun-if-changed=flecs.h");
println!("cargo:rerun-if-changed=flecs.c");
println!("cargo:rerun-if-changed=build.rs");
#[cfg(feature = "export_bindings")]
generate_bindings();
cc::Build::new()
.warnings(true)
.extra_warnings(true)
.define("NDEBUG", None)
.file("flecs.c")
.compile("flecs");
}
#[cfg(feature = "export_bindings")]
#[derive(Debug)]
struct CommentsCallbacks;
#[cfg(feature = "export_bindings")]
impl bindgen::callbacks::ParseCallbacks for CommentsCallbacks {
fn process_comment(&self, comment: &str) -> Option<String> {
let comment = comment.trim();
let comment = comment.replace("[", "\\[");
let comment = comment.replace("]", "\\]");
let url_re = regex::Regex::new(r"(?P<url>https?://[^\s]+)").unwrap();
let comment = url_re
.replace_all(comment.as_str(), |caps: ®ex::Captures| format!("<{}>", &caps["url"]))
.into_owned();
Some(comment)
}
}