use cmake::Config;
use std::env;
use std::path::PathBuf;
fn make_lib_name(name: &str) -> String {
if cfg!(target_os = "windows") {
format!("{}.lib", name)
} else {
format!("lib{}.a", name)
}
}
fn main() {
println!("cargo:rerun-if-changed=build.rs");
let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
let target = env::var("TARGET").unwrap();
let expected_lib_path = out_dir.join("lib").join(make_lib_name("asar-static"));
if !expected_lib_path.exists() {
let _dst = Config::new("src/asar/src")
.out_dir(out_dir.clone())
.define("ASAR_GEN_LIB", "ON")
.define("ASAR_GEN_EXE", "OFF")
.define("ASAR_GEN_DLL", "OFF")
.define("ASAR_GEN_EXE_TEST", "OFF")
.define("ASAR_GEN_DLL_TEST", "OFF")
.profile("Release")
.build();
}
println!("cargo:rerun-if-changed=src/asar/src/asar-dll-bindings/c/asar.h");
if target.contains("linux") {
println!("cargo:rustc-link-lib=dylib=stdc++");
}
let bindings = bindgen::Builder::default()
.header("src/asar/src/asar-dll-bindings/c/asar.h")
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.allowlist_type("errordata")
.allowlist_type("labeldata")
.allowlist_type("definedata")
.allowlist_type("writtenblockdata")
.allowlist_type("mappertype")
.allowlist_type("warnsetting")
.allowlist_type("memoryfile")
.allowlist_type("patchparams")
.allowlist_function("asar_.*")
.default_enum_style(bindgen::EnumVariation::Rust {
non_exhaustive: false,
})
.generate()
.expect("Unable to generate bindings");
println!("cargo:rustc-link-search={}", out_dir.join("lib").display());
println!("cargo:rustc-link-lib=static=asar-static");
bindings
.write_to_file(out_dir.join("bindings.rs"))
.expect("Couldn't write bindings!");
}