1818use std:: env:: { self , VarError } ;
1919use 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+
2162fn 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
4081fn 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