fn main() {
if cfg!(feature = "docs-only") {
return;
}
let mut dst = cmake::Config::new("OrbbecSDK");
dst.define("CMAKE_POLICY_VERSION_MINIMUM", "3.10");
#[cfg(target_os = "windows")]
dst.static_crt(true)
.cflag("/DWIN32 /D_WINDOWS -w")
.cxxflag("/DWIN32 /D_WINDOWS -w /EHsc");
#[cfg(not(target_os = "windows"))]
dst.cflag("-w").cxxflag("-w");
let dst = dst.build();
#[cfg(target_os = "windows")]
let bin_folder = "bin";
#[cfg(not(target_os = "windows"))]
let bin_folder = "lib";
let bin_dir = dst.join(bin_folder);
let target_dir = dst.join("../../../");
let extensions_dir = bin_dir.join("extensions");
let dest_extensions_dir = target_dir.join("extensions");
if !dest_extensions_dir.exists() {
std::fs::create_dir_all(&dest_extensions_dir)
.expect("Failed to create extensions directory");
}
for entry in std::fs::read_dir(&extensions_dir).unwrap() {
let entry = entry.unwrap();
let path = entry.path();
if path.is_dir() {
let folder_name = path.file_name().unwrap();
let dest_folder = dest_extensions_dir.join(folder_name);
if !dest_folder.exists() {
std::fs::create_dir_all(&dest_folder)
.expect("Failed to create extension subdirectory");
}
for file_entry in std::fs::read_dir(&path).unwrap() {
let file_entry = file_entry.unwrap();
let file_path = file_entry.path();
if let Some(ext) = file_path.extension()
&& (ext == "dll" || ext == "so" || ext == "dylib")
{
let file_name = file_path.file_name().unwrap();
let dest_file = dest_folder.join(file_name);
std::fs::copy(&file_path, &dest_file)
.expect("Failed to copy extension library file");
}
}
}
}
for entry in std::fs::read_dir(&bin_dir).unwrap() {
let entry = entry.unwrap();
let path = entry.path();
if let Some(ext) = path.extension()
&& (ext == "dll" || ext == "so" || ext == "dylib")
{
let file_name = path.file_name().unwrap();
let dest = target_dir.join(file_name);
std::fs::copy(&path, &dest).expect("Failed to copy library file");
}
}
println!(
"cargo:rustc-link-search=native={}",
dst.join("lib").display()
);
println!("cargo:rustc-link-lib=OrbbecSDK");
#[cfg(feature = "buildtime-bindgen")]
{
let cargo_manifest_dir = std::env::current_dir().unwrap();
let bindings = bindgen::Builder::default()
.header("OrbbecSDK/include/libobsensor/ObSensor.h")
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.clang_arg("-IOrbbecSDK/include/")
.translate_enum_integer_types(true)
.generate()
.expect("Unable to generate bindings");
let bindings_dir = cargo_manifest_dir.join("bindings");
let bindings_file = bindings_dir.join("bindings.rs");
std::fs::create_dir_all(&bindings_dir).expect("Failed to create bindings directory");
bindings
.write_to_file(bindings_file)
.expect("Couldn't write bindings!");
}
}