| 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_9") { |
| Some((9, 0)) |
| } else if cfg!(feature = "testing_only_libclang_5") { |
| Some((5, 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" |
| ); |
| } |