112a9d9c8Sopenharmony_ciextern crate bindgen; 212a9d9c8Sopenharmony_ciextern crate clap; 312a9d9c8Sopenharmony_ci#[cfg(feature = "logging")] 412a9d9c8Sopenharmony_ciextern crate env_logger; 512a9d9c8Sopenharmony_ci#[cfg(feature = "logging")] 612a9d9c8Sopenharmony_ciextern crate log; 712a9d9c8Sopenharmony_ci 812a9d9c8Sopenharmony_ciuse std::env; 912a9d9c8Sopenharmony_ci 1012a9d9c8Sopenharmony_cimod options; 1112a9d9c8Sopenharmony_ciuse crate::options::builder_from_flags; 1212a9d9c8Sopenharmony_ci 1312a9d9c8Sopenharmony_ci#[cfg(feature = "logging")] 1412a9d9c8Sopenharmony_cifn clang_version_check() { 1512a9d9c8Sopenharmony_ci let version = bindgen::clang_version(); 1612a9d9c8Sopenharmony_ci let expected_version = if cfg!(feature = "testing_only_libclang_9") { 1712a9d9c8Sopenharmony_ci Some((9, 0)) 1812a9d9c8Sopenharmony_ci } else if cfg!(feature = "testing_only_libclang_5") { 1912a9d9c8Sopenharmony_ci Some((5, 0)) 2012a9d9c8Sopenharmony_ci } else { 2112a9d9c8Sopenharmony_ci None 2212a9d9c8Sopenharmony_ci }; 2312a9d9c8Sopenharmony_ci 2412a9d9c8Sopenharmony_ci log::info!( 2512a9d9c8Sopenharmony_ci "Clang Version: {}, parsed: {:?}", 2612a9d9c8Sopenharmony_ci version.full, 2712a9d9c8Sopenharmony_ci version.parsed 2812a9d9c8Sopenharmony_ci ); 2912a9d9c8Sopenharmony_ci 3012a9d9c8Sopenharmony_ci if expected_version.is_some() { 3112a9d9c8Sopenharmony_ci // assert_eq!(version.parsed, version.parsed); 3212a9d9c8Sopenharmony_ci } 3312a9d9c8Sopenharmony_ci} 3412a9d9c8Sopenharmony_ci 3512a9d9c8Sopenharmony_cipub fn main() { 3612a9d9c8Sopenharmony_ci #[cfg(feature = "logging")] 3712a9d9c8Sopenharmony_ci env_logger::init(); 3812a9d9c8Sopenharmony_ci 3912a9d9c8Sopenharmony_ci match builder_from_flags(env::args()) { 4012a9d9c8Sopenharmony_ci Ok((builder, output, verbose)) => { 4112a9d9c8Sopenharmony_ci #[cfg(feature = "logging")] 4212a9d9c8Sopenharmony_ci clang_version_check(); 4312a9d9c8Sopenharmony_ci 4412a9d9c8Sopenharmony_ci std::panic::set_hook(Box::new(move |info| { 4512a9d9c8Sopenharmony_ci if verbose { 4612a9d9c8Sopenharmony_ci print_verbose_err() 4712a9d9c8Sopenharmony_ci } 4812a9d9c8Sopenharmony_ci println!("{}", info); 4912a9d9c8Sopenharmony_ci })); 5012a9d9c8Sopenharmony_ci 5112a9d9c8Sopenharmony_ci let bindings = 5212a9d9c8Sopenharmony_ci builder.generate().expect("Unable to generate bindings"); 5312a9d9c8Sopenharmony_ci 5412a9d9c8Sopenharmony_ci let _ = std::panic::take_hook(); 5512a9d9c8Sopenharmony_ci 5612a9d9c8Sopenharmony_ci bindings.write(output).expect("Unable to write output"); 5712a9d9c8Sopenharmony_ci } 5812a9d9c8Sopenharmony_ci Err(error) => { 5912a9d9c8Sopenharmony_ci println!("{}", error); 6012a9d9c8Sopenharmony_ci std::process::exit(1); 6112a9d9c8Sopenharmony_ci } 6212a9d9c8Sopenharmony_ci }; 6312a9d9c8Sopenharmony_ci} 6412a9d9c8Sopenharmony_ci 6512a9d9c8Sopenharmony_cifn print_verbose_err() { 6612a9d9c8Sopenharmony_ci println!("Bindgen unexpectedly panicked"); 6712a9d9c8Sopenharmony_ci println!( 6812a9d9c8Sopenharmony_ci "This may be caused by one of the known-unsupported \ 6912a9d9c8Sopenharmony_ci things (https://rust-lang.github.io/rust-bindgen/cpp.html), \ 7012a9d9c8Sopenharmony_ci please modify the bindgen flags to work around it as \ 7112a9d9c8Sopenharmony_ci described in https://rust-lang.github.io/rust-bindgen/cpp.html" 7212a9d9c8Sopenharmony_ci ); 7312a9d9c8Sopenharmony_ci println!( 7412a9d9c8Sopenharmony_ci "Otherwise, please file an issue at \ 7512a9d9c8Sopenharmony_ci https://github.com/rust-lang/rust-bindgen/issues/new" 7612a9d9c8Sopenharmony_ci ); 7712a9d9c8Sopenharmony_ci} 78