Skip to content

Commit

Permalink
create shared_helpers::parse_value_from_args
Browse files Browse the repository at this point in the history
Signed-off-by: onur-ozkan <work@onurozkan.dev>
  • Loading branch information
onur-ozkan committed Jun 29, 2024
1 parent 0afc774 commit ee49532
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 27 deletions.
27 changes: 13 additions & 14 deletions src/bootstrap/src/bin/rustc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,26 +20,24 @@ use std::path::{Path, PathBuf};
use std::process::{Child, Command};
use std::time::Instant;

use dylib_util::{dylib_path, dylib_path_var, exe};
use shared_helpers::{
dylib_path, dylib_path_var, exe, maybe_dump, parse_rustc_stage, parse_rustc_verbose,
parse_value_from_args,
};

#[path = "../utils/bin_helpers.rs"]
mod bin_helpers;

#[path = "../utils/dylib.rs"]
mod dylib_util;
#[path = "../utils/shared_helpers.rs"]
mod shared_helpers;

fn main() {
let orig_args = env::args_os().skip(1).collect::<Vec<_>>();
let mut args = orig_args.clone();
let arg =
|name| orig_args.windows(2).find(|args| args[0] == name).and_then(|args| args[1].to_str());

let stage = bin_helpers::parse_rustc_stage();
let verbose = bin_helpers::parse_rustc_verbose();
let stage = parse_rustc_stage();
let verbose = parse_rustc_verbose();

// Detect whether or not we're a build script depending on whether --target
// is passed (a bit janky...)
let target = arg("--target");
let target = parse_value_from_args(&orig_args, "--target");
let version = args.iter().find(|w| &**w == "-vV");

// Use a different compiler for build scripts, since there may not yet be a
Expand Down Expand Up @@ -102,7 +100,7 @@ fn main() {
cmd.args(&args).env(dylib_path_var(), env::join_paths(&dylib_path).unwrap());

// Get the name of the crate we're compiling, if any.
let crate_name = arg("--crate-name");
let crate_name = parse_value_from_args(&orig_args, "--crate-name");

if let Some(crate_name) = crate_name {
if let Some(target) = env::var_os("RUSTC_TIME") {
Expand Down Expand Up @@ -143,10 +141,11 @@ fn main() {
cmd.arg("-C").arg("panic=abort");
}

let crate_type = parse_value_from_args(&orig_args, "--crate-type");
// `-Ztls-model=initial-exec` must not be applied to proc-macros, see
// issue https://github.com/rust-lang/rust/issues/100530
if env::var("RUSTC_TLS_MODEL_INITIAL_EXEC").is_ok()
&& arg("--crate-type") != Some("proc-macro")
&& crate_type != Some("proc-macro")
&& !matches!(crate_name, Some("proc_macro2" | "quote" | "syn" | "synstructure"))
{
cmd.arg("-Ztls-model=initial-exec");
Expand Down Expand Up @@ -251,7 +250,7 @@ fn main() {
eprintln!("{prefix} libdir: {libdir:?}");
}

bin_helpers::maybe_dump(format!("stage{stage}-rustc"), &cmd);
maybe_dump(format!("stage{stage}-rustc"), &cmd);

let start = Instant::now();
let (child, status) = {
Expand Down
20 changes: 10 additions & 10 deletions src/bootstrap/src/bin/rustdoc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,27 @@ use std::env;
use std::path::PathBuf;
use std::process::Command;

use dylib_util::{dylib_path, dylib_path_var};
use shared_helpers::{
dylib_path, dylib_path_var, maybe_dump, parse_rustc_stage, parse_rustc_verbose,
parse_value_from_args,
};

#[path = "../utils/bin_helpers.rs"]
mod bin_helpers;

#[path = "../utils/dylib.rs"]
mod dylib_util;
#[path = "../utils/shared_helpers.rs"]
mod shared_helpers;

fn main() {
let args = env::args_os().skip(1).collect::<Vec<_>>();

let stage = bin_helpers::parse_rustc_stage();
let verbose = bin_helpers::parse_rustc_verbose();
let stage = parse_rustc_stage();
let verbose = parse_rustc_verbose();

let rustdoc = env::var_os("RUSTDOC_REAL").expect("RUSTDOC_REAL was not set");
let libdir = env::var_os("RUSTDOC_LIBDIR").expect("RUSTDOC_LIBDIR was not set");
let sysroot = env::var_os("RUSTC_SYSROOT").expect("RUSTC_SYSROOT was not set");

// Detect whether or not we're a build script depending on whether --target
// is passed (a bit janky...)
let target = args.windows(2).find(|w| &*w[0] == "--target").and_then(|w| w[1].to_str());
let target = parse_value_from_args(&args, "--target");

let mut dylib_path = dylib_path();
dylib_path.insert(0, PathBuf::from(libdir.clone()));
Expand Down Expand Up @@ -62,7 +62,7 @@ fn main() {
cmd.arg("-Zunstable-options");
cmd.arg("--check-cfg=cfg(bootstrap)");

bin_helpers::maybe_dump(format!("stage{stage}-rustdoc"), &cmd);
maybe_dump(format!("stage{stage}-rustdoc"), &cmd);

if verbose > 1 {
eprintln!(
Expand Down
4 changes: 2 additions & 2 deletions src/bootstrap/src/utils/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use crate::core::builder::Builder;
use crate::core::config::{Config, TargetSelection};
use crate::LldMode;

pub use crate::utils::dylib::{dylib_path, dylib_path_var};
pub use crate::utils::shared_helpers::{dylib_path, dylib_path_var};

#[cfg(test)]
mod tests;
Expand Down Expand Up @@ -50,7 +50,7 @@ macro_rules! t {
pub use t;

pub fn exe(name: &str, target: TargetSelection) -> String {
crate::utils::dylib::exe(name, &target.triple)
crate::utils::shared_helpers::exe(name, &target.triple)
}

/// Returns `true` if the file name given looks like a dynamic library.
Expand Down
13 changes: 12 additions & 1 deletion src/bootstrap/src/utils/shared_helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ pub fn dylib_path() -> Vec<std::path::PathBuf> {

/// Given an executable called `name`, return the filename for the
/// executable for a particular target.
#[allow(dead_code)]
pub fn exe(name: &str, target: &str) -> String {
if target.contains("windows") {
format!("{name}.exe")
Expand Down Expand Up @@ -95,3 +94,15 @@ pub fn maybe_dump(dump_name: String, cmd: &Command) {
file.write_all(cmd_dump.as_bytes()).expect("Unable to write file");
}
}

/// Finds `key` and returns its value from the given list of arguments `args`.
pub fn parse_value_from_args<'a>(args: &'a [OsString], key: &str) -> Option<&'a str> {
let mut args = args.iter();
while let Some(arg) = args.next() {
if arg.to_str() == Some(key) {
return args.next().map(|v| v.to_str().unwrap());
}
}

None
}
21 changes: 21 additions & 0 deletions src/bootstrap/src/utils/shared_helpers/tests.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
use super::parse_value_from_args;

#[test]
fn test_parse_value_from_args() {
let args = vec![
"--stage".into(),
"1".into(),
"--version".into(),
"2".into(),
"--target".into(),
"x86_64-unknown-linux".into(),
];

assert_eq!(parse_value_from_args(args.as_slice(), "--stage").unwrap(), "1");
assert_eq!(parse_value_from_args(args.as_slice(), "--version").unwrap(), "2");
assert_eq!(parse_value_from_args(args.as_slice(), "--target").unwrap(), "x86_64-unknown-linux");
assert!(parse_value_from_args(args.as_slice(), "random-key").is_none());

let args = vec!["app-name".into(), "--key".into(), "value".into(), "random-value".into()];
assert_eq!(parse_value_from_args(args.as_slice(), "--key").unwrap(), "value");
}

0 comments on commit ee49532

Please sign in to comment.