wlroots-sys 0.16.0

Low-level bindings for wlroots
extern crate bindgen;
extern crate pkg_config;

use std::env;
use std::path::PathBuf;
use std::process::Command;

fn main() {
    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());

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

    let wlroots_lib = pkg_config::Config::new()
        .range_version("0.16.0".."0.17.0")
        .probe("wlroots")
        .unwrap();

    pkg_config::Config::new()
        .probe("wayland-protocols")
        .unwrap();

    let wayland_protocols_dir = String::from_utf8(
        Command::new("pkgconf")
            .arg("wayland-protocols")
            .arg("--variable")
            .arg("pkgdatadir")
            .output()
            .unwrap()
            .stdout,
    )
    .unwrap();
    let wayland_protocols_dir = PathBuf::from(wayland_protocols_dir.trim());

    Command::new("wayland-scanner")
        .arg("server-header")
        .arg(wayland_protocols_dir.join("stable/xdg-shell/xdg-shell.xml"))
        .arg(out_path.join("xdg-shell-protocol.h"))
        .output()
        .unwrap();

    let mut builder = bindgen::builder()
        .parse_callbacks(Box::new(bindgen::CargoCallbacks))
        .header("src/wrapper.h")
        .allowlist_type("wlr_.*")
        .allowlist_function("wlr_.*")
        .blocklist_type("wl_array")
        .blocklist_type("wl_client")
        .blocklist_type("wl_display")
        .blocklist_type("wl_event_loop")
        .blocklist_type("wl_event_source")
        .blocklist_type("wl_global")
        .blocklist_type("wl_list")
        .blocklist_type("wl_listener")
        .blocklist_type("wl_notify_func_t")
        .blocklist_type("wl_resource")
        .blocklist_type("wl_shm_buffer")
        .blocklist_type("wl_signal")
        .clang_arg("-DWLR_USE_UNSTABLE");

    for path_buf in wlroots_lib.include_paths {
        builder = builder.clang_arg(format!("-I{}", path_buf.to_str().unwrap()));
    }
    builder = builder.clang_arg(format!("-I{}", out_path.to_string_lossy()));

    builder
        .generate()
        .unwrap()
        .write_to_file(out_path.join("bindings.rs"))
        .unwrap();
}