1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
use std::{env, path::Path};
// Keep this in sync with `depthai-sys/build.rs`.
// This crate's Cargo version is not necessarily the same as the DepthAI-Core tag.
const LATEST_SUPPORTED_DEPTHAI_CORE_TAG: &str = "v3.2.1";
fn selected_depthai_core_tag() -> String {
// This mirrors `depthai-sys/build.rs`'s version-selection logic.
// Feature naming note: Cargo features can't contain '.', so users select `v3-2-1`
// to mean DepthAI-Core tag `v3.2.1`.
if env::var_os("CARGO_FEATURE_V3_2_1").is_some() {
return "v3.2.1".to_string();
}
if env::var_os("CARGO_FEATURE_V3_2_0").is_some() {
return "v3.2.0".to_string();
}
if env::var_os("CARGO_FEATURE_V3_1_0").is_some() {
return "v3.1.0".to_string();
}
// Default to the latest supported DepthAI-Core tag.
// (The Rust crate version is NOT guaranteed to track the upstream native tag.)
LATEST_SUPPORTED_DEPTHAI_CORE_TAG.to_string()
}
fn main() {
// Ensure changes to vcpkg-installed libs re-trigger linkage when present.
println!("cargo:rerun-if-env-changed=DEPTHAI_RPATH_DISABLE");
if env::var("DEPTHAI_RPATH_DISABLE").ok().as_deref() == Some("1") {
return;
}
// `-Wl,-rpath,...` is Linux-specific. (macOS uses @loader_path; Windows doesn't use rpath.)
if !cfg!(target_os = "linux") {
return;
}
// Embed an rpath for the internal vcpkg lib directory so examples can run
// without setting LD_LIBRARY_PATH (needed for FFmpeg/libusb when OpenCV videoio is enabled).
let out_dir = env::var("OUT_DIR").unwrap();
let target_dir = Path::new(&out_dir).ancestors().nth(4).unwrap();
let tag = selected_depthai_core_tag();
let vcpkg_root = target_dir
.join("dai-build")
.join(&tag)
.join("vcpkg_installed");
let target = env::var("TARGET").unwrap_or_default();
let triplet = if target.contains("aarch64") {
"arm64-linux"
} else if target.contains("x86_64") {
// depthai-core's internal vcpkg commonly uses x64-linux.
"x64-linux"
} else {
"x64-linux"
};
let libdir = vcpkg_root.join(triplet).join("lib");
// dynamic_calibration is built as a shared library in the depthai-core build tree.
// It is not part of vcpkg_installed, so we must add it to RUNPATH as well.
let dcl_dir = target_dir
.join("dai-build")
.join(&tag)
.join("_deps")
.join("dynamic_calibration-src")
.join("lib");
// Always include $ORIGIN so staged .so files next to executables work out-of-the-box.
// Then include the internal build outputs if present.
let mut runpaths: Vec<String> = vec!["$ORIGIN".to_string()];
if dcl_dir.join("libdynamic_calibration.so").exists() {
runpaths.push(dcl_dir.to_string_lossy().to_string());
}
if libdir.exists() {
runpaths.push(libdir.to_string_lossy().to_string());
}
// Note: cargo:rustc-link-arg applies to this package's final link (bins/examples/tests).
// Use a single argument with -Wl, to pass through the cc driver.
println!("cargo:rustc-link-arg=-Wl,-rpath,{}", runpaths.join(":"));
}