extern crate bindgen; extern crate clap; #[cfg(feature = "logging")] extern crate env_logger; #[cfg(feature = "logging")] extern crate log; use std::env; mod options; use crate::options::builder_from_flags; #[cfg(feature = "logging")] fn clang_version_check() { let version = bindgen::clang_version(); let expected_version = if cfg!(feature = "__testing_only_libclang_16") { Some((16, 0)) } else if cfg!(feature = "__testing_only_libclang_9") { Some((9, 0)) } else { None }; log::info!( "Clang Version: {}, parsed: {:?}", version.full, version.parsed ); if expected_version.is_some() { // assert_eq!(version.parsed, version.parsed); } } pub fn main() { #[cfg(feature = "logging")] env_logger::init(); match builder_from_flags(env::args()) { Ok((builder, output, verbose)) => { #[cfg(feature = "logging")] clang_version_check(); std::panic::set_hook(Box::new(move |info| { if verbose { print_verbose_err() } println!("{}", info); })); let bindings = builder.generate().expect("Unable to generate bindings"); let _ = std::panic::take_hook(); bindings.write(output).expect("Unable to write output"); } Err(error) => { println!("{}", error); std::process::exit(1); } }; } fn print_verbose_err() { println!("Bindgen unexpectedly panicked"); println!( "This may be caused by one of the known-unsupported \ things (https://rust-lang.github.io/rust-bindgen/cpp.html), \ please modify the bindgen flags to work around it as \ described in https://rust-lang.github.io/rust-bindgen/cpp.html" ); println!( "Otherwise, please file an issue at \ https://github.com/rust-lang/rust-bindgen/issues/new" ); }