Skip to content

Commit bcaa825

Browse files
committed
Guard temporary environment variable changes
1 parent 16fa35a commit bcaa825

File tree

2 files changed

+44
-16
lines changed

2 files changed

+44
-16
lines changed

aws-lc-sys/builder/cc_builder.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ mod x86_64_unknown_linux_gnu;
1515
mod x86_64_unknown_linux_musl;
1616

1717
use crate::{
18-
cargo_env, effective_target, emit_warning, env_var_to_bool, execute_command, get_crate_cflags,
19-
is_no_asm, optional_env_optional_crate_target, optional_env_target, out_dir, requested_c_std,
20-
set_env_for_target, target, target_arch, target_env, target_os, CStdRequested, OutputLibType,
18+
cargo_env, effective_target, emit_warning, env_name_for_target, env_var_to_bool,
19+
execute_command, get_crate_cflags, is_no_asm, optional_env_optional_crate_target,
20+
optional_env_target, out_dir, requested_c_std, set_env_for_target, target, target_arch,
21+
target_env, target_os, CStdRequested, EnvGuard, OutputLibType,
2122
};
2223
use std::cell::Cell;
2324
use std::collections::HashMap;
@@ -373,14 +374,12 @@ impl CcBuilder {
373374
option.apply_cc(&mut je_builder);
374375
}
375376

376-
let compiler = if let Some(original_cflags) = optional_env_target("CFLAGS") {
377-
let mut new_cflags = original_cflags.clone();
378-
new_cflags.push_str(" -O0");
379-
set_env_for_target("CFLAGS", &new_cflags);
377+
let compiler = if let Some(mut cflags) = optional_env_target("CFLAGS") {
378+
cflags.push_str(" -O0");
379+
let _guard_cflags = EnvGuard::new(&env_name_for_target("CFLAGS"), &cflags);
380380
// cc-rs currently prioritizes flags provided by CFLAGS over the flags provided by the build script.
381381
// The environment variables used by the compiler are set when `get_compiler` is called.
382382
let compiler = je_builder.get_compiler();
383-
set_env_for_target("CFLAGS", &original_cflags);
384383
compiler
385384
} else {
386385
je_builder.get_compiler()

aws-lc-sys/builder/main.rs

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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>
153159
fn 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

162167
fn 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+
915942
fn 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

Comments
 (0)