liburing25-sys 0.1.0

liburing-2.5 bindings
Documentation
use std::{env, path::Path, process::Command};

fn main() {
    let out = Path::new(&env::var("OUT_DIR").unwrap())
        .canonicalize()
        .unwrap();

    let manifest = Path::new(&env::var("CARGO_MANIFEST_DIR").unwrap())
        .canonicalize()
        .unwrap();

    if out.join("liburing").is_dir() {
        std::fs::remove_dir_all(out.join("liburing")).unwrap();
    }

    copy_dir(manifest.join("liburing"), out.join("liburing")).unwrap();

    Command::new("sh")
        .current_dir(out.join("liburing"))
        .arg("-c")
        .arg("./configure --cc=clang --use-libc && cd src && make V=1 CFLAGS=\"-g -O3 -flto=thin\" liburing-ffi.a")
        .status()
        .unwrap();

    std::fs::copy(
        out.join("liburing/src/liburing-ffi.a"),
        out.join("liburing25-sys.a"),
    )
    .unwrap();

    println!("cargo:rustc-link-lib=static:+verbatim=liburing25-sys.a");
    println!("cargo:rustc-link-search=native={}", out.display());
    println!("cargo:rerun-if-changed=build.rs");

    bindgen::Builder::default()
        .clang_arg("--include-directory")
        .clang_arg(out.join("liburing/src/include").display().to_string())
        .header(out.join("liburing/src/ffi.c").display().to_string())
        .allowlist_file(
            out.join("liburing/src/include/liburing.h")
                .display()
                .to_string(),
        )
        .merge_extern_blocks(true)
        .default_non_copy_union_style(bindgen::NonCopyUnionStyle::ManuallyDrop)
        .anon_fields_prefix("anonymous")
        .use_core()
        .generate()
        .unwrap()
        .write_to_file(out.join("bindings.rs"))
        .unwrap();
}

fn copy_dir(src: impl AsRef<Path>, dst: impl AsRef<Path>) -> std::io::Result<()> {
    let dst = dst.as_ref();
    std::fs::create_dir_all(&dst)?;
    for entry in std::fs::read_dir(src)? {
        let entry = entry?;
        let subpath = entry.file_name();
        if entry.file_type()?.is_dir() {
            copy_dir(entry.path(), dst.join(subpath))?;
        } else {
            std::fs::copy(entry.path(), dst.join(subpath))?;
        }
    }
    Ok(())
}