#[derive(Debug)]
struct IgnoreMacros(std::collections::HashSet<&'static str>);
impl bindgen::callbacks::ParseCallbacks for IgnoreMacros {
fn will_parse_macro(&self, name: &str) -> bindgen::callbacks::MacroParsingBehavior {
if self.0.contains(name) {
bindgen::callbacks::MacroParsingBehavior::Ignore
} else {
bindgen::callbacks::MacroParsingBehavior::Default
}
}
}
fn main() {
let pkg = pkg_config::probe_library("vips").expect("Could not find libvips");
let out_path = std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap()).join("bindings.rs");
let ignored_macros = IgnoreMacros(
vec![
"FP_INFINITE",
"FP_NAN",
"FP_NORMAL",
"FP_SUBNORMAL",
"FP_ZERO",
]
.into_iter()
.collect(),
);
let mut builder = bindgen::Builder::default();
for path in pkg.include_paths.iter()
.filter_map(|p| p.to_str()) {
builder = builder.clang_arg("-I");
builder = builder.clang_arg(path);
}
let bindings = builder
.derive_debug(true)
.impl_debug(true)
.default_enum_style(bindgen::EnumVariation::Rust { non_exhaustive: false })
.header_contents("wrapper.h", "#include \"vips/vips.h\"")
.parse_callbacks(Box::new(ignored_macros))
.rustfmt_bindings(true)
.generate()
.unwrap();
bindings.write_to_file(out_path).unwrap();
}