78 lines
2.0 KiB
Rust
78 lines
2.0 KiB
Rust
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"
|
|
);
|
|
}
|