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