use std::env;
use std::path::{Path, PathBuf};
use std::process::Command;
fn main() {
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("manifest dir"));
let schema_path = manifest_dir.join("src/features/storage/schema/iridium.fbs");
println!("cargo:rerun-if-changed={}", schema_path.display());
println!("cargo:rustc-check-cfg=cfg(has_zig)");
generate_flatbuffers(&schema_path, &manifest_dir);
if env::var("CARGO_FEATURE_ZIG").is_ok() {
build_zig(&manifest_dir);
println!("cargo:rustc-cfg=has_zig");
}
}
fn generate_flatbuffers(schema_path: &Path, manifest_dir: &Path) {
let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR"));
let status = Command::new("flatc")
.arg("--rust")
.arg("-o")
.arg(&out_dir)
.arg(schema_path)
.status()
.expect("failed to invoke flatc");
if !status.success() {
panic!("flatc failed. Ensure FlatBuffers compiler is installed.");
}
let generated = out_dir.join("iridium_generated.rs");
if !generated.exists() {
panic!("flatc did not emit expected iridium_generated.rs");
}
let schema_dir = manifest_dir.join("src/features/storage/schema");
println!("cargo:rerun-if-changed={}", schema_dir.display());
}
fn build_zig(manifest_dir: &Path) {
let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR"));
let zig_src = manifest_dir.join("zig/iridium.zig");
let zig_out = out_dir.join("libiridium_zig.a");
let zig_cache = out_dir.join("zig-cache");
println!("cargo:rerun-if-changed={}", zig_src.display());
let status = Command::new("zig")
.arg("build-lib")
.arg("-OReleaseFast")
.arg("-fPIC")
.arg("-fno-omit-frame-pointer")
.arg(zig_src)
.arg(format!("-femit-bin={}", zig_out.display()))
.env("ZIG_GLOBAL_CACHE_DIR", &zig_cache)
.env("ZIG_LOCAL_CACHE_DIR", &zig_cache)
.status()
.expect("failed to invoke zig");
if !status.success() {
panic!("zig build-lib failed. Ensure Zig is installed and usable.");
}
println!("cargo:rustc-link-search=native={}", out_dir.display());
println!("cargo:rustc-link-lib=static=iridium_zig");
}