@@ -141,6 +141,12 @@ fn cargo_env<N: AsRef<str>>(name: N) -> String {
141141 env:: var ( name) . unwrap_or_else ( |_| panic ! ( "missing env var {name:?}" ) )
142142}
143143
144+ fn env_name_for_target < K : AsRef < OsStr > > ( env_var : K ) -> String {
145+ let target = target ( ) . to_lowercase ( ) ;
146+ let target = target. replace ( '-' , "_" ) ;
147+ format ! ( "{}_{target}" , env_var. as_ref( ) . to_str( ) . unwrap( ) )
148+ }
149+
144150// "CFLAGS" =>
145151// "AWS_LC_SYS_CFLAGS_aarch64_unknown_linux_gnu" OR "AWS_LC_SYS_CFLAGS"
146152// OR "CFLAGS_aarch64_unknown_linux_gnu" OR "CFLAGS"
@@ -153,16 +159,13 @@ fn optional_env_optional_crate_target<N: AsRef<str>>(name: N) -> Option<String>
153159fn optional_env_crate_target < N : AsRef < str > > ( name : N ) -> Option < String > {
154160 let name = name. as_ref ( ) ;
155161 let crate_name = crate_name ( ) . to_uppercase ( ) . replace ( '-' , "_" ) ;
156- let target_name = target ( ) . to_lowercase ( ) . replace ( '-' , "_" ) ;
157162 let name_for_crate = format ! ( "{crate_name}_{name}" ) ;
158- let name_for_crate_target = format ! ( "{crate_name}_{name}_{target_name}" ) ;
163+ let name_for_crate_target = env_name_for_target ( & name_for_crate ) ;
159164 optional_env ( name_for_crate_target) . or ( optional_env ( name_for_crate) )
160165}
161166
162167fn optional_env_target < N : AsRef < str > > ( name : N ) -> Option < String > {
163- let name = name. as_ref ( ) ;
164- let target_name = target ( ) . to_lowercase ( ) . replace ( '-' , "_" ) ;
165- let name_for_target = format ! ( "{}_{}" , & name, target_name) ;
168+ let name_for_target = env_name_for_target ( name. as_ref ( ) ) ;
166169 optional_env ( name_for_target) . or ( optional_env ( name) )
167170}
168171
@@ -184,9 +187,7 @@ where
184187 K : AsRef < OsStr > ,
185188 V : AsRef < OsStr > ,
186189{
187- let target = target ( ) . to_lowercase ( ) ;
188- let target = target. replace ( '-' , "_" ) ;
189- let env_var = format ! ( "{}_{target}" , env_var. as_ref( ) . to_str( ) . unwrap( ) ) ;
190+ let env_var = env_name_for_target ( env_var) ;
190191 env:: set_var ( & env_var, & value) ;
191192 emit_warning ( & format ! (
192193 "Setting {env_var}: {}" ,
@@ -912,6 +913,32 @@ const PRELUDE: &str = r"
912913)]
913914" ;
914915
916+ pub ( crate ) struct EnvGuard {
917+ key : String ,
918+ original_value : Option < String > ,
919+ }
920+
921+ impl EnvGuard {
922+ fn new < T : AsRef < OsStr > > ( key : & str , new_value : T ) -> Self {
923+ let original_value = env:: var ( key) . ok ( ) ;
924+ env:: set_var ( key, new_value) ;
925+ Self {
926+ key : key. to_string ( ) ,
927+ original_value,
928+ }
929+ }
930+ }
931+
932+ impl Drop for EnvGuard {
933+ fn drop ( & mut self ) {
934+ if let Some ( ref value) = self . original_value {
935+ env:: set_var ( & self . key , value) ;
936+ } else {
937+ env:: remove_var ( & self . key ) ;
938+ }
939+ }
940+ }
941+
915942fn invoke_external_bindgen (
916943 manifest_dir : & Path ,
917944 prefix : & Option < String > ,
@@ -924,6 +951,8 @@ fn invoke_external_bindgen(
924951 effective_target( )
925952 ) ) ;
926953
954+ let _guard_target = EnvGuard :: new ( "TARGET" , effective_target ( ) ) ;
955+
927956 let options = BindingOptions {
928957 // We collect the symbols w/o the prefix added
929958 build_prefix : None ,
0 commit comments