Skip to content

Commit

Permalink
Implement --env compiler flag
Browse files Browse the repository at this point in the history
  • Loading branch information
GuillaumeGomez committed Dec 10, 2023
1 parent 8043f62 commit 486e55e
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 3 deletions.
14 changes: 12 additions & 2 deletions compiler/rustc_builtin_macros/src/env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,16 @@ use thin_vec::thin_vec;

use crate::errors;

fn lookup_env<'cx>(cx: &'cx ExtCtxt<'_>, var: Symbol) -> Option<Symbol> {
let var = var.as_str();
if let Some(value) = cx.sess.opts.logical_env.get(var) {
return Some(Symbol::intern(value));
}
// If the environment variable was not defined with the `--env` option, we try to retrieve it
// from rustc's environment.
env::var(var).ok().as_deref().map(Symbol::intern)
}

pub fn expand_option_env<'cx>(
cx: &'cx mut ExtCtxt<'_>,
sp: Span,
Expand All @@ -23,7 +33,7 @@ pub fn expand_option_env<'cx>(
};

let sp = cx.with_def_site_ctxt(sp);
let value = env::var(var.as_str()).ok().as_deref().map(Symbol::intern);
let value = lookup_env(cx, var);
cx.sess.parse_sess.env_depinfo.borrow_mut().insert((var, value));
let e = match value {
None => {
Expand Down Expand Up @@ -77,7 +87,7 @@ pub fn expand_env<'cx>(
};

let span = cx.with_def_site_ctxt(sp);
let value = env::var(var.as_str()).ok().as_deref().map(Symbol::intern);
let value = lookup_env(cx, var);
cx.sess.parse_sess.env_depinfo.borrow_mut().insert((var, value));
let e = match value {
None => {
Expand Down
40 changes: 39 additions & 1 deletion compiler/rustc_session/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use crate::search_paths::SearchPath;
use crate::utils::{CanonicalizedPath, NativeLib, NativeLibKind};
use crate::{lint, HashStableContext};
use crate::{EarlyErrorHandler, Session};
use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexSet};
use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap, FxIndexSet};
use rustc_data_structures::stable_hasher::{StableOrd, ToStableHashKey};
use rustc_errors::emitter::HumanReadableErrorType;
use rustc_errors::{ColorConfig, DiagnosticArgValue, HandlerFlags, IntoDiagnosticArg};
Expand Down Expand Up @@ -1114,6 +1114,7 @@ impl Default for Options {
pretty: None,
working_dir: RealFileName::LocalPath(std::env::current_dir().unwrap()),
color: ColorConfig::Auto,
logical_env: FxIndexMap::default(),
}
}
}
Expand Down Expand Up @@ -1810,6 +1811,7 @@ pub fn rustc_optgroups() -> Vec<RustcOptGroup> {
"Remap source names in all output (compiler messages and output files)",
"FROM=TO",
),
opt::multi("", "env", "Inject an environment variable", "VAR=VALUE"),
]);
opts
}
Expand Down Expand Up @@ -2589,6 +2591,23 @@ fn parse_remap_path_prefix(
mapping
}

fn parse_logical_env(
handler: &mut EarlyErrorHandler,
matches: &getopts::Matches,
) -> FxIndexMap<String, String> {
let mut vars = FxIndexMap::default();

for arg in matches.opt_strs("env") {
if let Some((name, val)) = arg.split_once('=') {
vars.insert(name.to_string(), val.to_string());
} else {
handler.early_error(format!("`--env`: specify value for variable `{arg}`"));
}
}

vars
}

// JUSTIFICATION: before wrapper fn is available
#[allow(rustc::bad_opt_access)]
pub fn build_session_options(
Expand Down Expand Up @@ -2827,6 +2846,8 @@ pub fn build_session_options(
handler.early_error("can't dump dependency graph without `-Z query-dep-graph`");
}

let logical_env = parse_logical_env(handler, matches);

// Try to find a directory containing the Rust `src`, for more details see
// the doc comment on the `real_rust_source_base_dir` field.
let tmp_buf;
Expand Down Expand Up @@ -2907,6 +2928,7 @@ pub fn build_session_options(
pretty,
working_dir,
color,
logical_env,
}
}

Expand Down Expand Up @@ -3181,6 +3203,7 @@ pub(crate) mod dep_tracking {
};
use crate::lint;
use crate::utils::NativeLib;
use rustc_data_structures::fx::FxIndexMap;
use rustc_data_structures::stable_hasher::Hash64;
use rustc_errors::LanguageIdentifier;
use rustc_feature::UnstableFeatures;
Expand Down Expand Up @@ -3339,6 +3362,21 @@ pub(crate) mod dep_tracking {
}
}

impl<T: DepTrackingHash, V: DepTrackingHash> DepTrackingHash for FxIndexMap<T, V> {
fn hash(
&self,
hasher: &mut DefaultHasher,
error_format: ErrorOutputType,
for_crate_hash: bool,
) {
Hash::hash(&self.len(), hasher);
for (key, value) in self.iter() {
DepTrackingHash::hash(key, hasher, error_format, for_crate_hash);
DepTrackingHash::hash(value, hasher, error_format, for_crate_hash);
}
}
}

impl DepTrackingHash for OutputTypes {
fn hash(
&self,
Expand Down
4 changes: 4 additions & 0 deletions compiler/rustc_session/src/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use crate::config::*;
use crate::search_paths::SearchPath;
use crate::utils::NativeLib;
use crate::{lint, EarlyErrorHandler};
use rustc_data_structures::fx::FxIndexMap;
use rustc_data_structures::profiling::TimePassesFormat;
use rustc_data_structures::stable_hasher::Hash64;
use rustc_errors::ColorConfig;
Expand Down Expand Up @@ -150,6 +151,9 @@ top_level_options!(

target_triple: TargetTriple [TRACKED],

/// Effective logical environment used by `env!`/`option_env!` macros
logical_env: FxIndexMap<String, String> [TRACKED],

test: bool [TRACKED],
error_format: ErrorOutputType [UNTRACKED],
diagnostic_width: Option<usize> [UNTRACKED],
Expand Down

0 comments on commit 486e55e

Please sign in to comment.