• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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