44 lines
1.2 KiB
Rust
44 lines
1.2 KiB
Rust
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();
|
|
}
|