use std::env; use std::fs; use std::path::PathBuf; fn main() { let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); let profile = env::var("PROFILE").unwrap(); let bindings = cbindgen::Builder::new() .with_crate(&crate_dir) .with_language(cbindgen::Language::C) .with_style(cbindgen::Style::Tag) .generate() .expect("Unable to generate bindings"); // TODO vibe-coded workaround for hs-bindgen issue: // https://github.com/well-typed/hs-bindgen/issues/1649#issuecomment-3994425922 let mut buf = Vec::new(); bindings.write(&mut buf); let header = String::from_utf8(buf).unwrap(); let mut patched = String::new(); let mut saw_union = false; for line in header.lines() { if line == " };" && saw_union { patched.push_str(" } body;\n"); saw_union = false; continue; } if line == " union {" { saw_union = true; } patched.push_str(line); patched.push('\n'); } fs::write( PathBuf::from(&crate_dir) .join("target") .join(&profile) .join("garnet_rs.h"), patched, ) .unwrap(); }