use std::env;
use std::path::{Path, PathBuf};
use std::process::Command;
fn main() {
let dst = PathBuf::from(env::var_os("OUT_DIR").unwrap());
println!("cargo:rustc-link-search=native={}/lib", dst.display());
println!("cargo:rustc-link-lib=ucp");
println!("cargo:rerun-if-changed=wrapper.h");
build_from_source();
let bindings = bindgen::Builder::default()
.clang_arg(format!("-I{}", dst.join("include").display()))
.header("wrapper.h")
.parse_callbacks(Box::new(bindgen::CargoCallbacks))
.allowlist_function("uc[tsmp]_.*")
.allowlist_var("uc[tsmp]_.*")
.allowlist_var("UC[TSMP]_.*")
.allowlist_type("uc[tsmp]_.*")
.rustified_enum(".*")
.bitfield_enum("ucp_feature")
.bitfield_enum(".*_field")
.bitfield_enum(".*_flags(_t)?")
.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 build_from_source() {
let dst = PathBuf::from(env::var_os("OUT_DIR").unwrap());
if dst.join("lib/libuct.a").exists()
&& dst.join("lib/libucs.a").exists()
&& dst.join("lib/libucm.a").exists()
&& dst.join("lib/libucp.a").exists()
{
return;
}
if !Path::new("ucx/.git").exists() {
let _ = Command::new("git")
.args(&["submodule", "update", "--init"])
.status();
}
let _ = std::fs::create_dir(&dst.join("build"));
if !dst.join("ucx").exists() {
let _ = Command::new("cp")
.arg("-r")
.arg("ucx")
.arg(dst.join("ucx"))
.status();
}
Command::new("bash")
.current_dir(&dst.join("ucx"))
.arg("./autogen.sh")
.status()
.expect("failed to run autogen.sh");
Command::new("bash")
.current_dir(&dst.join("build"))
.arg(&dst.join("ucx/contrib/configure-release"))
.arg(&format!("--prefix={}", dst.display()))
.status()
.expect("failed to configure");
Command::new("make")
.current_dir(&dst.join("build"))
.arg(&format!("-j{}", env::var("NUM_JOBS").unwrap()))
.status()
.expect("failed to make");
Command::new("make")
.current_dir(&dst.join("build"))
.arg("install")
.status()
.expect("failed to make install");
}