crseo-sys 1.3.1

Cuda Engined Optics Rust Interface
Documentation
use std::{
    env, fs,
    path::{Path, PathBuf},
};

fn main() {
    if env::var("DOCS_RS").is_ok() {
        println!("cargo:rustc-cfg=docs_rs");
        return;
    }

    let out = cmake::Config::new("CEO").build();

    println!(
        "cargo:rustc-link-search=native={}",
        out.join("lib").display()
    );
    println!("cargo:rustc-link-lib=static=ceo");
    println!("cargo:rustc-link-search=/usr/local/cuda/lib64");
    println!("cargo:rustc-link-lib=stdc++");
    println!("cargo:rustc-link-lib=cudart");
    println!("cargo:rustc-link-lib=cudadevrt");
    println!("cargo:rustc-link-lib=cublas");
    println!("cargo:rustc-link-lib=cufft");
    println!("cargo:rustc-link-lib=cusparse");
    println!("cargo:rustc-link-lib=curand");
    println!("cargo:rustc-link-lib=cusolver");
    println!("cargo:rerun-if-changed=wrapper.hpp");
    println!("cargo:rustc-cfg=bindings");

    let bindings = bindgen::Builder::default()
        .header("wrapper.hpp")
        .clang_arg(&format!("-I{}", out.join("include").display()))
        .clang_arg("-I/usr/local/cuda/include")
        .clang_arg("-v")
        .parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
        .allowlist_type("gpu_float")
        .allowlist_type("gpu_int")
        .allowlist_type("gpu_double")
        .allowlist_type("mask")
        .allowlist_function("set_device")
        .allowlist_function("get_device_count")
        .allowlist_function("host2dev_char")
        .allowlist_function("host2dev")
        .allowlist_function("dev2host")
        .allowlist_function("dev2host_int")
        .allowlist_type("source")
        .allowlist_type("pssn")
        .allowlist_type("centroiding")
        .allowlist_type("imaging")
        .allowlist_type("shackHartmann")
        .allowlist_type("geometricShackHartmann")
        .allowlist_type("coordinate_system")
        .allowlist_type("gmt_m1")
        .allowlist_type("gmt_m2")
        .allowlist_type("atmosphere")
        .allowlist_type("LMMSE")
        .allowlist_type("pyramid")
        .allowlist_type("conic")
        .allowlist_type("segmentPistonSensor")
        .allowlist_function("transform_to_S")
        .allowlist_function("transform_to_R")
        .allowlist_function("intersect")
        .allowlist_function("reflect")
        .allowlist_function("refract")
        .allowlist_function("geqrf")
        .allowlist_function("ormqr")
        .generate()
        .expect("Unable to generate bindings");

    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
    bindings
        .write_to_file(out_path.join("bindings.rs"))
        .expect("Couldn't write bindings!");
    fs::copy(
        out_path.join("bindings.rs"),
        Path::new(env!("CARGO_MANIFEST_DIR"))
            .join("src")
            .join("bindings.rs"),
    )
    .expect("failed to copy bindings to src");
}