zydis-sys 0.1.2

low level rust bindings for the zydis library
Documentation
use std::env;

fn build_zydis() {
    let mut config = cmake::Config::new("zydis");

    config
        .define("ZYDIS_BUILD_EXAMPLES", "OFF")
        .define("ZYDIS_BUILD_TOOLS", "OFF")
        .define("ZYDIS_BUILD_DOXYGEN", "OFF")
        .define("ZYDIS_BUILD_TESTS", "OFF")
        .define("ZYAN_NO_LIBC", "ON");

    if cfg!(target_os = "windows") {
        config.cflag("/GS-");
    }

    let dst = config.build();

    let target = env::var("TARGET").unwrap_or("(unknown)".to_string());
    let is_msvc = target.ends_with("windows-msvc");

    let relative_build_dir = if is_msvc { config.get_profile() } else { "" };

    println!(
        "cargo:rustc-link-search=native={}/build/{}",
        dst.display(),
        relative_build_dir
    );
    println!(
        "cargo:rustc-link-search=native={}/build/zycore/{}",
        dst.display(),
        relative_build_dir
    );

    println!("cargo:rustc-link-lib=static=Zydis");
    println!("cargo:rustc-link-lib=static=Zycore");
}

fn generate_bindings() {
    let bindings = bindgen::Builder::default()
        .clang_arg("-Izydis/include/")
        .clang_arg("-Izydis/dependencies/zycore/include/")
        .clang_arg("-DZYAN_NO_LIBC")
        .default_enum_style(bindgen::EnumVariation::NewType {
            is_bitfield: false,
            is_global: false,
        })
        .derive_debug(true)
        .derive_default(true)
        .derive_eq(true)
        .impl_debug(true)
        .impl_partialeq(true)
        .header("zydis.h")
        .parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
        .use_core()
        .generate()
        .unwrap();
    let out_dir = std::env::var("OUT_DIR").unwrap();
    bindings
        .write_to_file(format!("{}/zydis.rs", out_dir))
        .unwrap();
}

fn main() {
    println!("cargo:rerun-if-changed=zydis");
    build_zydis();
    generate_bindings();
}