use cmake::Config;
use dunce::canonicalize;
use std::env;
use std::path::{Path, PathBuf};
pub enum LinkType {
Dynamic,
Static,
}
impl LinkType {
fn detect() -> LinkType {
if cfg!(feature = "static") {
LinkType::Static
} else {
LinkType::Dynamic
}
}
fn link_lib(&self) -> &'static str {
match self {
LinkType::Dynamic => "dylib=",
LinkType::Static => "static=",
}
}
fn target_name(&self) -> &'static str {
match self {
LinkType::Dynamic => "aeron",
LinkType::Static => "aeron_static",
}
}
}
pub fn main() {
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed=bindings.h");
let aeron_path = canonicalize(Path::new("./aeron")).unwrap();
let header_path = aeron_path.join("aeron-client/src/main/c");
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
let link_type = LinkType::detect();
println!(
"cargo:rustc-link-lib={}{}",
link_type.link_lib(),
link_type.target_name()
);
if let LinkType::Static = link_type {
if cfg!(target_os = "windows") {
println!("cargo:rustc-link-lib=shell32");
println!("cargo:rustc-link-lib=iphlpapi");
}
}
let cmake_output = Config::new(&aeron_path)
.define("BUILD_AERON_DRIVER", "OFF")
.define("BUILD_AERON_ARCHIVE_API", "OFF")
.define("AERON_TESTS", "OFF")
.define("AERON_BUILD_SAMPLES", "OFF")
.define("AERON_BUILD_DOCUMENTATION", "OFF")
.build_target(link_type.target_name())
.build();
let base_lib_dir = cmake_output.join("build");
println!(
"cargo:rustc-link-search=native={}",
base_lib_dir.join("lib").display()
);
println!(
"cargo:rustc-link-search=native={}",
base_lib_dir.join("lib/Debug").display()
);
println!(
"cargo:rustc-link-search=native={}",
base_lib_dir.join("binaries/Debug").display()
);
println!(
"cargo:rustc-link-search=native={}",
base_lib_dir.join("lib/Release").display()
);
println!(
"cargo:rustc-link-search=native={}",
base_lib_dir.join("binaries/Release").display()
);
println!("cargo:include={}", header_path.display());
let bindings = bindgen::Builder::default()
.clang_arg(format!("-I{}", header_path.display()))
.header("bindings.h")
.allowlist_function("aeron_.*")
.allowlist_type("aeron_.*")
.allowlist_var("AERON_.*")
.constified_enum_module("aeron_.*_enum")
.generate()
.expect("Unable to generate aeron bindings");
bindings
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}