Skip to content

Commit f64a0b3

Browse files
committed
add --env option
1 parent 25bb1c1 commit f64a0b3

File tree

4 files changed

+46
-2
lines changed

4 files changed

+46
-2
lines changed

compiler/rustc_builtin_macros/src/env.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@ pub fn expand_option_env<'cx>(
2121
};
2222

2323
let sp = cx.with_def_site_ctxt(sp);
24-
let value = env::var(var.as_str()).ok().as_deref().map(Symbol::intern);
24+
25+
let injected_value =
26+
cx.sess.opts.injected_env_vars.get(var.as_str()).map(|s| Symbol::intern(s));
27+
let value =
28+
injected_value.or_else(|| env::var(var.as_str()).ok().as_deref().map(Symbol::intern));
29+
2530
cx.sess.parse_sess.env_depinfo.borrow_mut().insert((var, value));
2631
let e = match value {
2732
None => {
@@ -78,7 +83,11 @@ pub fn expand_env<'cx>(
7883
}
7984

8085
let sp = cx.with_def_site_ctxt(sp);
81-
let value = env::var(var.as_str()).ok().as_deref().map(Symbol::intern);
86+
87+
let key = var.as_str();
88+
let injected_value = cx.sess.opts.injected_env_vars.get(key).map(|s| Symbol::intern(s));
89+
let value = injected_value.or_else(|| env::var(key).ok().as_deref().map(Symbol::intern));
90+
8291
cx.sess.parse_sess.env_depinfo.borrow_mut().insert((var, value));
8392
let e = match value {
8493
None => {

compiler/rustc_session/src/config.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,7 @@ impl Default for Options {
744744
json_future_incompat: false,
745745
pretty: None,
746746
working_dir: RealFileName::LocalPath(std::env::current_dir().unwrap()),
747+
injected_env_vars: Default::default(),
747748
}
748749
}
749750
}
@@ -1429,6 +1430,7 @@ pub fn rustc_optgroups() -> Vec<RustcOptGroup> {
14291430
"Remap source names in all output (compiler messages and output files)",
14301431
"FROM=TO",
14311432
),
1433+
opt::multi("", "env", "Inject an environment variable", "VAR=VALUE"),
14321434
]);
14331435
opts
14341436
}
@@ -2197,6 +2199,23 @@ fn parse_remap_path_prefix(
21972199
mapping
21982200
}
21992201

2202+
fn parse_injected_env_vars(
2203+
matches: &getopts::Matches,
2204+
error_format: ErrorOutputType,
2205+
) -> FxHashMap<String, String> {
2206+
let mut vars = FxHashMap::default();
2207+
2208+
for arg in matches.opt_strs("env") {
2209+
if let Some((name, val)) = arg.split_once('=') {
2210+
vars.insert(name.to_string(), val.to_string());
2211+
} else {
2212+
early_error(error_format, &format!("`--env`: specify value for variable `{}`", arg));
2213+
}
2214+
}
2215+
2216+
vars
2217+
}
2218+
22002219
// JUSTIFICATION: before wrapper fn is available
22012220
#[cfg_attr(not(bootstrap), allow(rustc::bad_opt_access))]
22022221
pub fn build_session_options(matches: &getopts::Matches) -> Options {
@@ -2470,6 +2489,8 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
24702489
RealFileName::LocalPath(path)
24712490
};
24722491

2492+
let injected_env_vars = parse_injected_env_vars(matches, error_format);
2493+
24732494
Options {
24742495
assert_incr_state,
24752496
crate_types,
@@ -2506,6 +2527,7 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
25062527
json_future_incompat,
25072528
pretty,
25082529
working_dir,
2530+
injected_env_vars,
25092531
}
25102532
}
25112533

compiler/rustc_session/src/options.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ use rustc_target::spec::{
1010
RelocModel, RelroLevel, SplitDebuginfo, StackProtector, TargetTriple, TlsModel,
1111
};
1212

13+
use rustc_data_structures::fx::FxHashMap;
14+
1315
use rustc_feature::UnstableFeatures;
1416
use rustc_span::edition::Edition;
1517
use rustc_span::RealFileName;
@@ -210,6 +212,9 @@ top_level_options!(
210212

211213
/// The (potentially remapped) working directory
212214
working_dir: RealFileName [TRACKED],
215+
216+
/// Overridden env vars used for `env!` and `option_env!`
217+
injected_env_vars: FxHashMap<String, String> [UNTRACKED],
213218
}
214219
);
215220

src/test/ui/extenv/extenv-injected.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// run-pass
2+
// rustc_env: overridden=no
3+
// compile-flags: -Z unstable-options --env x=y --env overridden=yes
4+
5+
fn main() {
6+
assert_eq!(env!("x"), "y");
7+
assert_eq!(env!("overridden"), "yes");
8+
}

0 commit comments

Comments
 (0)