Skip to content

Commit b35c96e

Browse files
committed
feat: support target-specific specialization of OPTEE_CLIENT_EXPORT
1 parent fac9759 commit b35c96e

File tree

1 file changed

+64
-5
lines changed

1 file changed

+64
-5
lines changed

optee-teec/optee-teec-sys/build.rs

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,47 @@
1818
use std::env::{self, VarError};
1919
use std::path::PathBuf;
2020

21+
const ENV_OPTEE_CLIENT_EXPORT: &str = "OPTEE_CLIENT_EXPORT";
22+
const AARCH64: &str = "aarch64-unknown-linux-gnu";
23+
const X86_64: &str = "x86_64-unknown-linux-gnu";
24+
25+
#[derive(Debug, Clone, Copy)]
26+
enum Target {
27+
Aarch64,
28+
X86_64,
29+
}
30+
31+
impl Target {
32+
fn get() -> Result<Target, String> {
33+
let var = env::var("TARGET").expect("infallible");
34+
match var.as_str() {
35+
AARCH64 => Ok(Target::Aarch64),
36+
X86_64 => Ok(Target::X86_64),
37+
_ => Err(var),
38+
}
39+
}
40+
}
41+
42+
/// Lists out env vars to check in order of priority
43+
fn enumerate_vars_for_target() -> Vec<String> {
44+
let prefix = ENV_OPTEE_CLIENT_EXPORT.to_owned();
45+
let Ok(target) = Target::get() else {
46+
// Unknown targets should not try using the suffixed variants.
47+
return vec![prefix];
48+
};
49+
let aarch64 = format!("_{AARCH64}");
50+
let x86 = format!("_{X86_64}");
51+
let suffixes = match target {
52+
Target::Aarch64 => &[&aarch64, &aarch64.replace("-", "_"), ""],
53+
Target::X86_64 => &[&x86, &x86.replace("-", "_"), ""],
54+
};
55+
56+
suffixes
57+
.into_iter()
58+
.map(|s| format!("{prefix}{s}"))
59+
.collect()
60+
}
61+
2162
fn main() -> Result<(), VarError> {
2263
if !is_feature_enable("no_link")? {
2364
link();
@@ -38,15 +79,33 @@ fn is_feature_enable(feature: &str) -> Result<bool, VarError> {
3879
}
3980

4081
fn link() {
41-
const ENV_OPTEE_CLIENT_EXPORT: &str = "OPTEE_CLIENT_EXPORT";
42-
println!("cargo:rerun-if-env-changed={}", ENV_OPTEE_CLIENT_EXPORT);
82+
let vars_to_check = enumerate_vars_for_target();
83+
for var in vars_to_check.iter() {
84+
println!("cargo:rerun-if-env-changed={var}");
85+
}
86+
87+
let mut selected_env_var = None;
88+
for var in vars_to_check {
89+
match env::var(&var) {
90+
Ok(value) => {
91+
if value.trim().is_empty() {
92+
continue;
93+
}
94+
selected_env_var = Some((var, value));
95+
break;
96+
}
97+
Err(VarError::NotUnicode(_)) => panic!("could not parse {} as unicode", var),
98+
Err(VarError::NotPresent) => continue,
99+
}
100+
}
101+
let (selected_env_var, optee_client_dir) = selected_env_var
102+
.expect("Neither OPTEE_CLIENT_EXPORT nor a target specific variant were set");
43103

44-
let optee_client_dir =
45-
env::var(ENV_OPTEE_CLIENT_EXPORT).expect("OPTEE_CLIENT_EXPORT is not set");
46104
let library_path = PathBuf::from(optee_client_dir).join("usr/lib");
47105
if !library_path.exists() {
48106
panic!(
49-
"OPTEE_CLIENT_EXPORT usr/lib path {} does not exist",
107+
"{} usr/lib path {} does not exist",
108+
selected_env_var,
50109
library_path.display()
51110
);
52111
}

0 commit comments

Comments
 (0)