Skip to content

Commit 461c576

Browse files
committed
build: Harden env var tracking in build scripts
1 parent 0b662c2 commit 461c576

File tree

2 files changed

+22
-18
lines changed

2 files changed

+22
-18
lines changed

src/build_helper/lib.rs

+12-4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::ffi::{OsStr, OsString};
2+
use std::fmt::Display;
13
use std::path::{Path, PathBuf};
24
use std::process::{Command, Stdio};
35
use std::time::{SystemTime, UNIX_EPOCH};
@@ -28,6 +30,14 @@ macro_rules! t {
2830
};
2931
}
3032

33+
/// Reads an environment variable and adds it to dependencies.
34+
/// Supposed to be used for all variables except those set for build scripts by cargo
35+
/// https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-build-scripts
36+
pub fn tracked_env_var_os<K: AsRef<OsStr> + Display>(key: K) -> Option<OsString> {
37+
println!("cargo:rerun-if-env-changed={}", key);
38+
env::var_os(key)
39+
}
40+
3141
// Because Cargo adds the compiler's dylib path to our library search path, llvm-config may
3242
// break: the dylib path for the compiler, as of this writing, contains a copy of the LLVM
3343
// shared library, which means that when our freshly built llvm-config goes to load it's
@@ -37,10 +47,8 @@ macro_rules! t {
3747
// perfect -- we might actually want to see something from Cargo's added library paths -- but
3848
// for now it works.
3949
pub fn restore_library_path() {
40-
println!("cargo:rerun-if-env-changed=REAL_LIBRARY_PATH_VAR");
41-
println!("cargo:rerun-if-env-changed=REAL_LIBRARY_PATH");
42-
let key = env::var_os("REAL_LIBRARY_PATH_VAR").expect("REAL_LIBRARY_PATH_VAR");
43-
if let Some(env) = env::var_os("REAL_LIBRARY_PATH") {
50+
let key = tracked_env_var_os("REAL_LIBRARY_PATH_VAR").expect("REAL_LIBRARY_PATH_VAR");
51+
if let Some(env) = tracked_env_var_os("REAL_LIBRARY_PATH") {
4452
env::set_var(&key, &env);
4553
} else {
4654
env::remove_var(&key);

src/librustc_llvm/build.rs

+10-14
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,20 @@ use std::env;
22
use std::path::{Path, PathBuf};
33
use std::process::Command;
44

5-
use build_helper::output;
5+
use build_helper::{output, tracked_env_var_os};
66

77
fn detect_llvm_link() -> (&'static str, &'static str) {
88
// Force the link mode we want, preferring static by default, but
99
// possibly overridden by `configure --enable-llvm-link-shared`.
10-
if env::var_os("LLVM_LINK_SHARED").is_some() {
10+
if tracked_env_var_os("LLVM_LINK_SHARED").is_some() {
1111
("dylib", "--link-shared")
1212
} else {
1313
("static", "--link-static")
1414
}
1515
}
1616

1717
fn main() {
18-
println!("cargo:rerun-if-env-changed=RUST_CHECK");
19-
if env::var_os("RUST_CHECK").is_some() {
18+
if tracked_env_var_os("RUST_CHECK").is_some() {
2019
// If we're just running `check`, there's no need for LLVM to be built.
2120
return;
2221
}
@@ -25,8 +24,8 @@ fn main() {
2524

2625
let target = env::var("TARGET").expect("TARGET was not set");
2726
let llvm_config =
28-
env::var_os("LLVM_CONFIG").map(|x| Some(PathBuf::from(x))).unwrap_or_else(|| {
29-
if let Some(dir) = env::var_os("CARGO_TARGET_DIR").map(PathBuf::from) {
27+
tracked_env_var_os("LLVM_CONFIG").map(|x| Some(PathBuf::from(x))).unwrap_or_else(|| {
28+
if let Some(dir) = tracked_env_var_os("CARGO_TARGET_DIR").map(PathBuf::from) {
3029
let to_test = dir
3130
.parent()
3231
.unwrap()
@@ -46,8 +45,6 @@ fn main() {
4645
}
4746
let llvm_config = llvm_config.unwrap_or_else(|| PathBuf::from("llvm-config"));
4847

49-
println!("cargo:rerun-if-env-changed=LLVM_CONFIG");
50-
5148
// Test whether we're cross-compiling LLVM. This is a pretty rare case
5249
// currently where we're producing an LLVM for a different platform than
5350
// what this build script is currently running on.
@@ -163,12 +160,11 @@ fn main() {
163160
cfg.define(&flag, None);
164161
}
165162

166-
println!("cargo:rerun-if-env-changed=LLVM_RUSTLLVM");
167-
if env::var_os("LLVM_RUSTLLVM").is_some() {
163+
if tracked_env_var_os("LLVM_RUSTLLVM").is_some() {
168164
cfg.define("LLVM_RUSTLLVM", None);
169165
}
170166

171-
if env::var_os("LLVM_NDEBUG").is_some() {
167+
if tracked_env_var_os("LLVM_NDEBUG").is_some() {
172168
cfg.define("NDEBUG", None);
173169
cfg.debug(false);
174170
}
@@ -255,7 +251,7 @@ fn main() {
255251
// librustc_llvm, for example when using static libc++, we may need to
256252
// manually specify the library search path and -ldl -lpthread as link
257253
// dependencies.
258-
let llvm_linker_flags = env::var_os("LLVM_LINKER_FLAGS");
254+
let llvm_linker_flags = tracked_env_var_os("LLVM_LINKER_FLAGS");
259255
if let Some(s) = llvm_linker_flags {
260256
for lib in s.into_string().unwrap().split_whitespace() {
261257
if lib.starts_with("-l") {
@@ -266,8 +262,8 @@ fn main() {
266262
}
267263
}
268264

269-
let llvm_static_stdcpp = env::var_os("LLVM_STATIC_STDCPP");
270-
let llvm_use_libcxx = env::var_os("LLVM_USE_LIBCXX");
265+
let llvm_static_stdcpp = tracked_env_var_os("LLVM_STATIC_STDCPP");
266+
let llvm_use_libcxx = tracked_env_var_os("LLVM_USE_LIBCXX");
271267

272268
let stdcppname = if target.contains("openbsd") {
273269
if target.contains("sparc64") { "estdc++" } else { "c++" }

0 commit comments

Comments
 (0)