liburing-vendor 0.0.5

liburing bindings
Documentation
use std::env;
use std::path::PathBuf;
use std::process::Command;

use bindgen::{EnumVariation, NonCopyUnionStyle};

fn main() {
    let cur = &env::var("CARGO_MANIFEST_DIR").unwrap();
    let out = &env::var("OUT_DIR").unwrap();
    Command::new("cp")
        .arg("-R")
        .arg(concat(cur, "liburing"))
        .arg(concat(out, "liburing"))
        .status()
        .unwrap();
    Command::new("./configure")
        .current_dir(concat(out, "liburing"))
        .status()
        .unwrap();
    Command::new("make")
        .current_dir(concat(out, "liburing/src"))
        .arg("liburing-ffi.a")
        .status()
        .unwrap();
    bindgen::builder()
        .clang_arg(["-I", concat(out, "liburing/src/include")].concat())
        .header(concat(out, "liburing/src/ffi.c"))
        .allowlist_file(concat(out, "liburing/src/include/liburing.h"))
        .allowlist_file(concat(out, "liburing/src/include/liburing/io_uring.h"))
        .default_enum_style(EnumVariation::ModuleConsts)
        .default_non_copy_union_style(NonCopyUnionStyle::ManuallyDrop)
        .opaque_type("io_uring")
        .no_copy("io_uring")
        .blocklist_type("io_uring_sq")
        .blocklist_type("io_uring_cq")
        .generate()
        .unwrap()
        .write_to_file(concat(out, "bindings.rs"))
        .unwrap();
    println!("cargo::rustc-link-search={}", concat(out, "liburing/src"));
    println!("cargo::rustc-link-lib=static:+verbatim=liburing-ffi.a");
}

fn concat(a: &str, b: &str) -> &'static str {
    PathBuf::from(a).join(b).to_str().unwrap().to_owned().leak()
}