X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fbootstrap%2Fflags.rs;h=3be7ad4075ed8d8f621826d30375f8fdf99e9151;hb=5c0b60f9672eca0eea465dc63dbb0e55d7e0c58d;hp=851cb5ecf4c2694ee7c77b7b97e4bd92a1c7d6a4;hpb=bdbe392a13bc9782b98de193c3751b9d96bb5fcc;p=rust.git diff --git a/src/bootstrap/flags.rs b/src/bootstrap/flags.rs index 851cb5ecf4c..3be7ad4075e 100644 --- a/src/bootstrap/flags.rs +++ b/src/bootstrap/flags.rs @@ -130,6 +130,7 @@ pub enum Subcommand { test_args: Vec, }, Clean { + paths: Vec, all: bool, }, Dist { @@ -351,7 +352,17 @@ pub fn parse(args: &[String]) -> Flags { // fn usage() let usage = |exit_code: i32, opts: &Options, verbose: bool, subcommand_help: &str| -> ! { - let config = Config::parse(&["setup".to_string()]); + // We have an unfortunate situation here: some Steps use `builder.in_tree_crates` to determine their paths. + // To determine those crates, we need to run `cargo metadata`, which means we need all submodules to be checked out. + // That takes a while to run, so only do it when paths were explicitly requested, not on all CLI errors. + // `Build::new` won't load submodules for the `setup` command. + let cmd = if verbose { + println!("note: updating submodules before printing available paths"); + "build" + } else { + "setup" + }; + let config = Config::parse(&[cmd.to_string()]); let build = Build::new(config); let paths = Builder::get_help(&build, subcommand); @@ -601,14 +612,7 @@ pub fn parse(args: &[String]) -> Flags { open: matches.opt_present("open"), json: matches.opt_present("json"), }, - Kind::Clean => { - if !paths.is_empty() { - println!("\nclean does not take a path argument\n"); - usage(1, &opts, verbose, &subcommand_help); - } - - Subcommand::Clean { all: matches.opt_present("all") } - } + Kind::Clean => Subcommand::Clean { all: matches.opt_present("all"), paths }, Kind::Format => Subcommand::Format { check: matches.opt_present("check"), paths }, Kind::Dist => Subcommand::Dist { paths }, Kind::Install => Subcommand::Install { paths },