use std::{env, path::PathBuf};
fn main() {
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let vendor = manifest_dir.join("vendor").join("openzl");
assert!(vendor.join("CMakeLists.txt").exists(), "vendor/openzl missing CMakeLists.txt (did you init submodules?)");
let mut cfg = cmake::Config::new(&vendor);
cfg.profile("Release")
.define("OPENZL_BUILD_SHARED_LIBS", "OFF")
.define("OPENZL_BUILD_TESTS", "OFF")
.define("OPENZL_BUILD_BENCHMARKS", "OFF")
.define("OPENZL_BUILD_PYTHON_EXT", "OFF")
.define("OPENZL_BUILD_PARQUET_TOOLS", "OFF")
.define("OPENZL_BUILD_TOOLS", "OFF")
.define("OPENZL_BUILD_CUSTOM_PARSERS", "OFF")
.define("OPENZL_BUILD_CLI", "OFF")
.define("OPENZL_BUILD_EXAMPLES", "OFF")
.define("OPENZL_INSTALL", "OFF");
let dst = cfg.build();
let include_pub = vendor.join("include");
let include_gen = dst.join("include");
let mut cc_build = cc::Build::new();
cc_build.file("src/shim.c");
cc_build.include(&include_pub);
cc_build.include(&include_gen);
cc_build.flag_if_supported("-Wno-unused-parameter");
cc_build.flag_if_supported("-Wno-unused-function");
cc_build.compile("openzl_sys_shim");
let bindings = bindgen::Builder::default()
.header(include_pub.join("openzl").join("openzl.h").to_string_lossy())
.clang_arg(format!("-I{}", include_pub.display()))
.clang_arg(format!("-I{}", include_gen.display()))
.allowlist_type("^ZL_.*")
.allowlist_function("^ZL_.*")
.allowlist_var("^ZL_.*")
.default_enum_style(bindgen::EnumVariation::Rust {
non_exhaustive: false,
})
.derive_debug(true)
.derive_default(true)
.derive_eq(false) .derive_hash(false) .derive_ord(false) .layout_tests(true)
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.generate()
.expect("bindgen generate");
let out = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
.write_to_file(out.join("bindings.rs"))
.expect("write bindings");
let build_dir = dst.join("build");
println!("cargo:rustc-link-search=native={}", build_dir.display());
let zstd_lib_dir = build_dir.join("zstd_build").join("lib");
if zstd_lib_dir.exists() {
println!("cargo:rustc-link-search=native={}", zstd_lib_dir.display());
}
let lib64_dir = dst.join("lib64");
if lib64_dir.exists() {
println!("cargo:rustc-link-search=native={}", lib64_dir.display());
}
println!("cargo:rustc-link-lib=static=openzl");
println!("cargo:rustc-link-lib=static=zstd");
if cfg!(target_os = "linux") {
println!("cargo:rustc-link-lib=pthread");
println!("cargo:rustc-link-lib=m");
}
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed=src/shim.c");
println!("cargo:rerun-if-changed={}", include_pub.join("openzl").join("openzl.h").display());
}