extern crate bindgen; use std::env; use std::path::PathBuf; fn main() { println!("cargo:rerun-if-changed=../"); let headers_enabled = env::var_os("CARGO_FEATURE_HEADERS").is_some(); let mut builder = bindgen::Builder::default() .header("src/rcl_wrapper.h") .derive_copy(false) .default_enum_style(bindgen::EnumVariation::Rust { non_exhaustive: false } ); let ament_prefix_var_name = "AMENT_PREFIX_PATH"; let ament_prefix_var = env::var(ament_prefix_var_name).expect("Source your ROS!"); for ament_prefix_path in ament_prefix_var.split(":") { builder = builder.clang_arg(format!("-I{}/include", ament_prefix_path)); println!("cargo:rustc-link-search=native={}/lib", ament_prefix_path); } println!("cargo:rustc-link-lib=dylib=rcl"); println!("cargo:rustc-link-lib=dylib=rcl_logging_noop"); println!("cargo:rustc-link-lib=dylib=rcutils"); println!("cargo:rustc-link-lib=dylib=rmw"); println!("cargo:rustc-link-lib=dylib=rmw_implementation"); println!("cargo:rustc-link-lib=dylib=rosidl_typesupport_c"); println!("cargo:rustc-link-lib=dylib=rosidl_generator_c"); // bindgen takes time so we dont want to do it always... must be a better way if headers_enabled { let bindings = builder.generate().expect("Unable to generate bindings"); let out_path = PathBuf::from("."); bindings .write_to_file(out_path.join("src/rcl_bindings.rs")) .expect("Couldn't write bindings!"); } }