use bindgen;
use cc;
use std::env;
use std::path::PathBuf;
use std::fs::read_dir;
fn main() {
let mut build = cc::Build::new();
build.warnings(false);
build.include("hactool");
build.include("hactool/mbedtls/include");
for ent in read_dir("hactool/mbedtls/library/").unwrap().chain(read_dir("hactool/").unwrap()) {
if let Ok(ent) = ent {
if ent.path().extension().map(|e| e.to_string_lossy() == "c").unwrap_or(false) &&
ent.path().file_name().map(|e| e.to_string_lossy() != "main.c").unwrap_or(false) {
build.file(ent.path());
}
}
}
build.compile("libhactool.a");
let bindings = if let Ok(_) = std::env::var("BINDGEN_LIBNX") {
bindgen::Builder::default()
.trust_clang_mangling(false)
.clang_arg("-I/opt/devkitpro/libnx/include")
.clang_arg("-I/opt/devkitpro/devkitA64/aarch64-none-elf/include")
.clang_arg("-I/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.2.0/include")
.clang_arg("-Ihactool")
.clang_arg("-Ihactool/mbedtls/include")
.header("wrapper.h")
.default_enum_style(bindgen::EnumVariation::Rust)
.blacklist_type("u8")
.blacklist_type("u16")
.blacklist_type("u32")
.blacklist_type("u64")
.blacklist_type("__va_list")
.blacklist_type("FILE")
.derive_default(true)
.opaque_type("__.*")
.raw_line("pub type FILE = libc::FILE;")
.generate()
.expect("Couldn't generate bindings!")
} else {
bindgen::Builder::default()
.clang_arg("-Ihactool")
.clang_arg("-Ihactool/mbedtls/include")
.header("wrapper.h")
.default_enum_style(bindgen::EnumVariation::Rust)
.blacklist_type("FILE")
.derive_default(true)
.raw_line("pub type FILE = libc::FILE;")
.generate()
.expect("Couldn't 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!");
}