1 extern crate bindgen;
2 extern crate clap;
3 #[cfg(feature = "logging")]
4 extern crate env_logger;
5 #[cfg(feature = "logging")]
6 extern crate log;
7
8 use std::env;
9
10 mod options;
11 use crate::options::builder_from_flags;
12
13 #[cfg(feature = "logging")]
clang_version_check()14 fn clang_version_check() {
15 let version = bindgen::clang_version();
16 let expected_version = if cfg!(feature = "testing_only_libclang_9") {
17 Some((9, 0))
18 } else if cfg!(feature = "testing_only_libclang_5") {
19 Some((5, 0))
20 } else {
21 None
22 };
23
24 log::info!(
25 "Clang Version: {}, parsed: {:?}",
26 version.full,
27 version.parsed
28 );
29
30 if expected_version.is_some() {
31 // assert_eq!(version.parsed, version.parsed);
32 }
33 }
34
main()35 pub fn main() {
36 #[cfg(feature = "logging")]
37 env_logger::init();
38
39 match builder_from_flags(env::args()) {
40 Ok((builder, output, verbose)) => {
41 #[cfg(feature = "logging")]
42 clang_version_check();
43
44 std::panic::set_hook(Box::new(move |info| {
45 if verbose {
46 print_verbose_err()
47 }
48 println!("{}", info);
49 }));
50
51 let bindings =
52 builder.generate().expect("Unable to generate bindings");
53
54 let _ = std::panic::take_hook();
55
56 bindings.write(output).expect("Unable to write output");
57 }
58 Err(error) => {
59 println!("{}", error);
60 std::process::exit(1);
61 }
62 };
63 }
64
print_verbose_err()65 fn print_verbose_err() {
66 println!("Bindgen unexpectedly panicked");
67 println!(
68 "This may be caused by one of the known-unsupported \
69 things (https://rust-lang.github.io/rust-bindgen/cpp.html), \
70 please modify the bindgen flags to work around it as \
71 described in https://rust-lang.github.io/rust-bindgen/cpp.html"
72 );
73 println!(
74 "Otherwise, please file an issue at \
75 https://github.com/rust-lang/rust-bindgen/issues/new"
76 );
77 }
78