urcu2-sys 0.1.8

Bindings to liburcu
Documentation
use std::path::PathBuf;

use bindgen::callbacks::{FieldInfo, ParseCallbacks};
use bindgen::FieldVisibilityKind;

#[derive(Debug)]
struct BindgenCallbacks;

impl ParseCallbacks for BindgenCallbacks {
    fn field_visibility(&self, info: FieldInfo<'_>) -> Option<FieldVisibilityKind> {
        match info.type_name {
            "urcu_gp_poll_state" | "rcu_head" => Some(FieldVisibilityKind::Private),
            _ => None,
        }
    }
}

fn main() {
    let out_dir = PathBuf::from(std::env::var("OUT_DIR").unwrap());
    let build_config = urcu_src::build_config();

    if std::env::var("DOCS_RS").is_err() {
        metadeps::probe().unwrap();
    }

    build_config.cargo_link("urcu");
    build_config
        .default_bindgen()
        .header("src/header.h")
        .allowlist_item("cds_.*")
        .allowlist_item("__cds_.*")
        .allowlist_item("rcu_.*")
        .allowlist_item("urcu_gp_poll_state")
        .allowlist_var("CDS_.*")
        .parse_callbacks(Box::new(BindgenCallbacks))
        .derive_default(true)
        .wrap_static_fns(true)
        .wrap_static_fns_path(out_dir.join("static_fns.c"))
        .generate()
        .unwrap()
        .write_to_file(out_dir.join("bindings.rs"))
        .expect("Couldn't write bindings!");
    build_config
        .default_cc()
        .include(env!("CARGO_MANIFEST_DIR"))
        .file(out_dir.join("static_fns.c"))
        .compile("static_fns");

    println!("cargo:rerun-if-changed=src/header.h");
}