From 84f3046d92d0c56e772ae7dbc103d845e07bfe61 Mon Sep 17 00:00:00 2001 From: Samuel Guerra Date: Tue, 2 Jan 2024 11:43:26 -0300 Subject: [PATCH] Fixed do +nightly on Windows. Implemented do build .. -Z for more easy compile time debug. --- tools/do-tasks/src/main.rs | 26 ++++++++++++++++++++++---- tools/do-tasks/src/util.rs | 20 ++++++++++++++++++-- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/tools/do-tasks/src/main.rs b/tools/do-tasks/src/main.rs index 9feb981f1..019aaf079 100644 --- a/tools/do-tasks/src/main.rs +++ b/tools/do-tasks/src/main.rs @@ -509,7 +509,7 @@ fn check(args: Vec<&str>) { cmd("cargo", &["clippy", "--no-deps", "--tests", "--workspace", "--examples"], &args); } -// do build, b [-e, --example] [--examples] [-t, --timings] [--release-lto] [] +// do build, b [-e, --example] [--examples] [-t, --timings] [--release-lto] [-Z*] [] // Compile the main crate and its dependencies. // USAGE: // build -e @@ -519,13 +519,31 @@ fn check(args: Vec<&str>) { // build -p -t // Compile crate and report in "target/cargo-timings" fn build(mut args: Vec<&str>) { - let mut cargo_args = vec![]; + let mut nightly = if take_flag(&mut args, &["+nightly"]) { "+nightly" } else { "" }; - cargo_args.push("build"); + let mut rust_flags = release_rust_flags(args.contains(&"--release")); - let rust_flags = release_rust_flags(args.contains(&"--release")); + args.retain(|f| { + if f.starts_with("-Z") { + if rust_flags.0.is_empty() { + rust_flags = ("RUSTFLAGS", String::new()); + } + rust_flags.1.push(' '); + rust_flags.1.push_str(f); + + if nightly.is_empty() { + nightly = "+nightly"; + } + + false + } else { + true + } + }); let rust_flags = &[(rust_flags.0, rust_flags.1.as_str())]; + let mut cargo_args = vec![nightly, "build"]; + if take_flag(&mut args, &["-t", "--timings"]) { cargo_args.push("--timings"); } diff --git a/tools/do-tasks/src/util.rs b/tools/do-tasks/src/util.rs index 27989736e..a6321ab64 100644 --- a/tools/do-tasks/src/util.rs +++ b/tools/do-tasks/src/util.rs @@ -25,8 +25,24 @@ pub fn cmd_env(cmd: &str, default_args: &[&str], user_args: &[&str], envs: &[(&s pub fn cmd_env_req(cmd: &str, default_args: &[&str], user_args: &[&str], envs: &[(&str, &str)]) { cmd_impl(cmd, default_args, user_args, envs, true) } -fn cmd_impl(cmd: &str, default_args: &[&str], user_args: &[&str], envs: &[(&str, &str)], required: bool) { - let args: Vec<_> = default_args.iter().chain(user_args.iter()).filter(|a| !a.is_empty()).collect(); +fn cmd_impl(mut cmd: &str, default_args: &[&str], user_args: &[&str], envs: &[(&str, &str)], required: bool) { + let mut args: Vec<_> = default_args + .iter() + .chain(user_args.iter()) + .filter(|a| !a.is_empty()) + .map(|s| *s) + .collect(); + + if cfg!(windows) && cmd == "cargo" && default_args.first() == Some(&"+nightly") { + // nested cargo calls don't use rustup's cargo on Windows. + // https://github.com/rust-lang/rustup/issues/3036 + // + // rustup run nightly cargo + cmd = "rustup"; + args[0] = "run"; + args.insert(1, "nightly"); + args.insert(2, "cargo"); + } let mut cmd = Command::new(cmd); cmd.args(&args[..]);