use std::env;
use std::path::PathBuf;
use bindgen::callbacks::{IntKind, ParseCallbacks};
const PCAN_HEADER: Option<&str> = option_env!("PCAN_HEADER");
fn main() {
println!("cargo:rustc-link-lib=pcanbasic");
#[cfg(target_os = "windows")]
if PCAN_HEADER.is_none() {
println!(
"cargo::error=PCAN_HEADER environment variable must point to a valid PCANBasic.h header when compiling on Windows."
);
std::process::exit(1);
}
let bindings = bindgen::Builder::default()
.header(PCAN_HEADER.unwrap_or("include/wrapper.h"))
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.parse_callbacks(Box::new(DefinesCallbacks))
.blocklist_type("_*")
.generate()
.expect("Unable to generate bindings");
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
.write_to_file(out_path.join("pcanbasic_sys.rs"))
.expect("Couldn't write bindings!");
}
#[derive(Debug)]
struct DefinesCallbacks;
impl ParseCallbacks for DefinesCallbacks {
fn int_macro(&self, name: &str, _value: i64) -> Option<IntKind> {
match name {
v if v.starts_with("HW")
|| v.starts_with("PCAN_MODE")
|| v.starts_with("PCAN_MESSAGE") =>
{
Some(IntKind::U8)
}
v if v.starts_with("PCAN_USBBUS") || v.starts_with("PCAN_BAUD") => Some(IntKind::U16),
_ => None,
}
}
}