use bindgen::callbacks::MacroParsingBehavior;
use std::{env, path::PathBuf};
#[derive(Debug)]
pub struct ParseCallbacks;
impl bindgen::callbacks::ParseCallbacks for ParseCallbacks {
fn will_parse_macro(&self, name: &str) -> MacroParsingBehavior {
match name {
"RETRO_DEVICE_ID_LIGHTGUN_X"
| "RETRO_DEVICE_ID_LIGHTGUN_Y"
| "RETRO_DEVICE_ID_LIGHTGUN_CURSOR"
| "RETRO_DEVICE_ID_LIGHTGUN_TURBO"
| "RETRO_DEVICE_ID_LIGHTGUN_PAUSE" => MacroParsingBehavior::Ignore,
_ => MacroParsingBehavior::Default,
}
}
fn include_file(&self, filename: &str) {
println!("cargo:rerun-if-changed={}", filename);
}
fn add_derives(&self, info: &bindgen::callbacks::DeriveInfo<'_>) -> Vec<String> {
match info.name {
"retro_savestate_context" => vec!["TryFromPrimitive".to_owned()],
_ => Vec::with_capacity(0),
}
}
}
fn main() {
println!("cargo:rerun-if-changed=wrapper.h");
let bindings = bindgen::Builder::default()
.header("wrapper.h")
.allowlist_type("(retro|RETRO)_.*")
.allowlist_function("(retro|RETRO)_.*")
.allowlist_var("(retro|RETRO)_.*")
.prepend_enum_name(false)
.impl_debug(true)
.clang_arg("-fparse-all-comments")
.enable_function_attribute_detection()
.default_enum_style(bindgen::EnumVariation::Rust {
non_exhaustive: true,
})
.newtype_enum("retro_key")
.bitfield_enum("retro_mod")
.parse_callbacks(Box::new(ParseCallbacks))
.generate()
.expect("Unable to generate bindings");
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}