use glob::glob;
use std::env;
use std::path::PathBuf;
use cc::Build;
fn build_files(file_list_glob: &[&str], as_cpp: bool, lib_name: &str) {
let mut build = Build::new();
if as_cpp {
build.cpp(true);
build.std("c++14");
build.flag("-Wno-overloaded-virtual");
}
build.static_flag(true);
build.includes(["uldaq/src"]);
build.flag("-Wno-empty-body");
build.flag("-Wno-missing-field-initializers");
build.flag("-Wno-unused-parameter");
build.flag("-funsigned-char");
for dir in file_list_glob {
for entry in glob(dir).expect("Failed to read dir: {dir}") {
match entry {
Ok(path) => {
build.file(path);
}
Err(e) => panic!("Unable to read file: {e}"),
}
}
}
build.compile(lib_name);
}
fn main() {
println!("cargo:rerun-if-changed=uldaq");
println!("cargo:rustc-link-lib=usb-1.0"); println!("cargo:rustc-link-search=native=/usr/lib/x86_64-linux-gnu");
let dirs_cpp = [
"uldaq/src/*.cpp",
"uldaq/src/hid/*.cpp",
"uldaq/src/hid/*/*.cpp",
"uldaq/src/interfaces/*.cpp",
"uldaq/src/net/*.cpp",
"uldaq/src/net/*/*.cpp",
"uldaq/src/usb/*.cpp",
"uldaq/src/usb/*/*.cpp",
"uldaq/src/utility/*.cpp",
];
build_files(&dirs_cpp, true, "uldaq");
let dirs_c = ["uldaq/src/usb/fw/*.c"];
build_files(&dirs_c, false, "uldaqc");
let bindings = bindgen::Builder::default()
.header("uldaq/src/uldaq.h")
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.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!");
}