use std::env;
use std::path::PathBuf;
extern crate bindgen;
fn main() {
if !cfg!(test) {
link_libraries();
}
let os_define = match env::var("CARGO_CFG_TARGET_OS").unwrap().as_str() {
"windows" => "IBM",
"macos" => "APL",
"linux" => "LIN",
_ => panic!("Unsupported OS"),
};
let bindings_builder = bindgen::Builder::default()
.header("wrapper.h")
.clang_arg("-I./SDK/CHeaders/XPLM")
.clang_arg(format!("-D{os_define}"))
.rustified_enum("XPLMAudioBus")
.rustified_enum("XPLMBankID")
.rustified_enum("XPLMCameraControlDuration")
.rustified_enum("XPLMCommandPhase")
.rustified_enum("XPLMCursorStatus")
.rustified_enum("XPLMDataFileType")
.rustified_enum("XPLMDeviceID")
.rustified_enum("XPLMFlightLoopPhaseType")
.rustified_enum("XPLMFontID")
.rustified_enum("XPLMHostApplicationID")
.rustified_enum("XPLMLanguageCode")
.rustified_enum("XPLMMapLayerType")
.rustified_enum("XPLMMapOrientation")
.rustified_enum("XPLMMapStyle")
.rustified_enum("XPLMMenuCheck")
.rustified_enum("XPLMMouseStatus")
.rustified_enum("XPLMNavType")
.rustified_enum("XPLMWindowDecoration")
.rustified_enum("XPLMWindowLayer")
.rustified_enum("XPLMWindowPositioningMode")
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()));
let bindings_builder = if cfg!(feature = "xplm2") {
bindings_builder
.clang_arg("-DXPLM200") .clang_arg("-DXPLM210") } else {
bindings_builder
};
let bindings_builder = if cfg!(feature = "xplm3") {
bindings_builder
.clang_arg("-DXPLM300") .clang_arg("-DXPLM301") .clang_arg("-DXPLM302") .clang_arg("-DXPLM303") } else {
bindings_builder
};
let bindings_builder = if cfg!(feature = "xplm4") {
bindings_builder
.clang_arg("-DXPLM400") .clang_arg("-DXPLM410") .clang_arg("-DXPLM411") .clang_arg("-DXPLM420") } else {
bindings_builder
};
let bindings_builder = if cfg!(feature = "deprecated") {
bindings_builder.clang_arg("-DXPLM_DEPRECATED")
} else {
bindings_builder
};
let bindings = bindings_builder
.generate()
.expect("Unable to generate bindings");
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}
fn link_libraries() {
let crate_path = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap());
let target = env::var("TARGET").unwrap();
if target.contains("-apple-") {
let library_path = crate_path.join("SDK/Libraries/Mac");
println!(
"cargo:rustc-link-search=framework={}",
library_path.to_str().unwrap()
);
println!("cargo:rustc-link-lib=framework=XPLM");
} else if target.contains("-linux-") {
} else if target.contains("-windows-") {
let library_path = crate_path.join("SDK/Libraries/Win");
println!("cargo:rustc-link-search={}", library_path.to_str().unwrap());
if target.contains("x86_64") {
println!("cargo:rustc-link-lib=XPLM_64");
} else {
println!("cargo:rustc-link-lib=XPLM");
}
} else {
panic!("Target operating system not Mac OS, Linux, or Windows")
}
}