Skip to content

Commit c44ea84

Browse files
committed
Destructure bootstrap flags to make sure that none of them are unused
1 parent e19ec44 commit c44ea84

File tree

1 file changed

+97
-55
lines changed

1 file changed

+97
-55
lines changed

src/bootstrap/src/core/config/config.rs

Lines changed: 97 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -392,27 +392,70 @@ impl Config {
392392
)
393393
)]
394394
pub(crate) fn parse_inner(
395-
mut flags: Flags,
395+
flags: Flags,
396396
get_toml: impl Fn(&Path) -> Result<TomlConfig, toml::de::Error>,
397397
) -> Config {
398+
// Destructure flags to ensure that we use all its fields
399+
// The field variables are prefixed with `flags_` to avoid clashes
400+
// with values from TOML config files with same names.
401+
let Flags {
402+
cmd: flags_cmd,
403+
verbose: flags_verbose,
404+
incremental: flags_incremental,
405+
config: flags_config,
406+
build_dir: flags_build_dir,
407+
build: flags_build,
408+
host: flags_host,
409+
target: flags_target,
410+
exclude: flags_exclude,
411+
skip: flags_skip,
412+
include_default_paths: flags_include_default_paths,
413+
rustc_error_format: flags_rustc_error_format,
414+
on_fail: flags_on_fail,
415+
dry_run: flags_dry_run,
416+
dump_bootstrap_shims: flags_dump_bootstrap_shims,
417+
stage: flags_stage,
418+
keep_stage: flags_keep_stage,
419+
keep_stage_std: flags_keep_stage_std,
420+
src: flags_src,
421+
jobs: flags_jobs,
422+
warnings: flags_warnings,
423+
error_format: flags_error_format,
424+
json_output: flags_json_output,
425+
color: flags_color,
426+
bypass_bootstrap_lock: flags_bypass_bootstrap_lock,
427+
rust_profile_generate: flags_rust_profile_generate,
428+
rust_profile_use: flags_rust_profile_use,
429+
llvm_profile_use: flags_llvm_profile_use,
430+
llvm_profile_generate: flags_llvm_profile_generate,
431+
enable_bolt_settings: flags_enable_bolt_settings,
432+
skip_stage0_validation: flags_skip_stage0_validation,
433+
reproducible_artifact: flags_reproducible_artifact,
434+
paths: mut flags_paths,
435+
set: flags_set,
436+
free_args: mut flags_free_args,
437+
ci: flags_ci,
438+
skip_std_check_if_no_download_rustc: flags_skip_std_check_if_no_download_rustc,
439+
} = flags;
440+
398441
let mut config = Config::default_opts();
399442
let mut exec_ctx = ExecutionContext::new();
400-
exec_ctx.set_verbose(flags.verbose);
401-
exec_ctx.set_fail_fast(flags.cmd.fail_fast());
443+
exec_ctx.set_verbose(flags_verbose);
444+
exec_ctx.set_fail_fast(flags_cmd.fail_fast());
402445

403446
config.exec_ctx = exec_ctx;
404447

405448
// Set flags.
406-
config.paths = std::mem::take(&mut flags.paths);
449+
config.paths = std::mem::take(&mut flags_paths);
407450

408451
#[cfg(feature = "tracing")]
409452
span!(
410453
target: "CONFIG_HANDLING",
411454
tracing::Level::TRACE,
412455
"collecting paths and path exclusions",
413-
"flags.paths" = ?flags.paths,
414-
"flags.skip" = ?flags.skip,
415-
"flags.exclude" = ?flags.exclude
456+
"flags.paths" = ?flags_paths,
457+
"flags.skip" = ?flags_skip,
458+
"flags.exclude" = ?flags_exclude
416459
);
417460

418461
#[cfg(feature = "tracing")]
@@ -423,28 +466,28 @@ impl Config {
423466
"config.skip" = ?config.skip,
424467
);
425468

426-
config.include_default_paths = flags.include_default_paths;
427-
config.rustc_error_format = flags.rustc_error_format;
428-
config.json_output = flags.json_output;
429-
config.on_fail = flags.on_fail;
430-
config.cmd = flags.cmd;
431-
config.incremental = flags.incremental;
432-
config.set_dry_run(if flags.dry_run { DryRun::UserSelected } else { DryRun::Disabled });
433-
config.dump_bootstrap_shims = flags.dump_bootstrap_shims;
434-
config.keep_stage = flags.keep_stage;
435-
config.keep_stage_std = flags.keep_stage_std;
436-
config.color = flags.color;
437-
config.free_args = std::mem::take(&mut flags.free_args);
438-
config.llvm_profile_use = flags.llvm_profile_use;
439-
config.llvm_profile_generate = flags.llvm_profile_generate;
440-
config.enable_bolt_settings = flags.enable_bolt_settings;
441-
config.bypass_bootstrap_lock = flags.bypass_bootstrap_lock;
442-
config.is_running_on_ci = flags.ci.unwrap_or(CiEnv::is_ci());
443-
config.skip_std_check_if_no_download_rustc = flags.skip_std_check_if_no_download_rustc;
469+
config.include_default_paths = flags_include_default_paths;
470+
config.rustc_error_format = flags_rustc_error_format;
471+
config.json_output = flags_json_output;
472+
config.on_fail = flags_on_fail;
473+
config.cmd = flags_cmd;
474+
config.incremental = flags_incremental;
475+
config.set_dry_run(if flags_dry_run { DryRun::UserSelected } else { DryRun::Disabled });
476+
config.dump_bootstrap_shims = flags_dump_bootstrap_shims;
477+
config.keep_stage = flags_keep_stage;
478+
config.keep_stage_std = flags_keep_stage_std;
479+
config.color = flags_color;
480+
config.free_args = std::mem::take(&mut flags_free_args);
481+
config.llvm_profile_use = flags_llvm_profile_use;
482+
config.llvm_profile_generate = flags_llvm_profile_generate;
483+
config.enable_bolt_settings = flags_enable_bolt_settings;
484+
config.bypass_bootstrap_lock = flags_bypass_bootstrap_lock;
485+
config.is_running_on_ci = flags_ci.unwrap_or(CiEnv::is_ci());
486+
config.skip_std_check_if_no_download_rustc = flags_skip_std_check_if_no_download_rustc;
444487

445488
// Infer the rest of the configuration.
446489

447-
if let Some(src) = flags.src {
490+
if let Some(src) = flags_src {
448491
config.src = src
449492
} else {
450493
// Infer the source directory. This is non-trivial because we want to support a downloaded bootstrap binary,
@@ -510,8 +553,7 @@ impl Config {
510553
// 4. `<root>/bootstrap.toml`
511554
// 5. `./config.toml` (fallback for backward compatibility)
512555
// 6. `<root>/config.toml`
513-
let toml_path = flags
514-
.config
556+
let toml_path = flags_config
515557
.clone()
516558
.or_else(|| env::var_os("RUST_BOOTSTRAP_CONFIG").map(PathBuf::from));
517559
let using_default_path = toml_path.is_none();
@@ -610,7 +652,7 @@ impl Config {
610652
}
611653

612654
let mut override_toml = TomlConfig::default();
613-
for option in flags.set.iter() {
655+
for option in flags_set.iter() {
614656
fn get_table(option: &str) -> Result<TomlConfig, toml::de::Error> {
615657
toml::from_str(option).and_then(|table: toml::Value| TomlConfig::deserialize(table))
616658
}
@@ -708,7 +750,7 @@ impl Config {
708750
exclude,
709751
} = toml.build.unwrap_or_default();
710752

711-
let mut paths: Vec<PathBuf> = flags.skip.into_iter().chain(flags.exclude).collect();
753+
let mut paths: Vec<PathBuf> = flags_skip.into_iter().chain(flags_exclude).collect();
712754

713755
if let Some(exclude) = exclude {
714756
paths.extend(exclude);
@@ -728,15 +770,15 @@ impl Config {
728770
})
729771
.collect();
730772

731-
config.jobs = Some(threads_from_config(flags.jobs.unwrap_or(jobs.unwrap_or(0))));
773+
config.jobs = Some(threads_from_config(flags_jobs.unwrap_or(jobs.unwrap_or(0))));
732774

733-
if let Some(flags_build) = flags.build {
775+
if let Some(flags_build) = flags_build {
734776
config.host_target = TargetSelection::from_user(&flags_build);
735777
} else if let Some(file_build) = build {
736778
config.host_target = TargetSelection::from_user(&file_build);
737779
};
738780

739-
set(&mut config.out, flags.build_dir.or_else(|| build_dir.map(PathBuf::from)));
781+
set(&mut config.out, flags_build_dir.or_else(|| build_dir.map(PathBuf::from)));
740782
// NOTE: Bootstrap spawns various commands with different working directories.
741783
// To avoid writing to random places on the file system, `config.out` needs to be an absolute path.
742784
if !config.out.is_absolute() {
@@ -751,7 +793,7 @@ impl Config {
751793
}
752794

753795
config.initial_rustc = if let Some(rustc) = rustc {
754-
if !flags.skip_stage0_validation {
796+
if !flags_skip_stage0_validation {
755797
config.check_stage0_version(&rustc, "rustc");
756798
}
757799
rustc
@@ -777,7 +819,7 @@ impl Config {
777819
config.initial_cargo_clippy = cargo_clippy;
778820

779821
config.initial_cargo = if let Some(cargo) = cargo {
780-
if !flags.skip_stage0_validation {
822+
if !flags_skip_stage0_validation {
781823
config.check_stage0_version(&cargo, "cargo");
782824
}
783825
cargo
@@ -793,14 +835,14 @@ impl Config {
793835
config.out = dir;
794836
}
795837

796-
config.hosts = if let Some(TargetSelectionList(arg_host)) = flags.host {
838+
config.hosts = if let Some(TargetSelectionList(arg_host)) = flags_host {
797839
arg_host
798840
} else if let Some(file_host) = host {
799841
file_host.iter().map(|h| TargetSelection::from_user(h)).collect()
800842
} else {
801843
vec![config.host_target]
802844
};
803-
config.targets = if let Some(TargetSelectionList(arg_target)) = flags.target {
845+
config.targets = if let Some(TargetSelectionList(arg_target)) = flags_target {
804846
arg_target
805847
} else if let Some(file_target) = target {
806848
file_target.iter().map(|h| TargetSelection::from_user(h)).collect()
@@ -839,7 +881,7 @@ impl Config {
839881
set(&mut config.print_step_rusage, print_step_rusage);
840882
config.patch_binaries_for_nix = patch_binaries_for_nix;
841883

842-
config.verbose = cmp::max(config.verbose, flags.verbose as usize);
884+
config.verbose = cmp::max(config.verbose, flags_verbose as usize);
843885

844886
// Verbose flag is a good default for `rust.verbose-tests`.
845887
config.verbose_tests = config.is_verbose();
@@ -894,12 +936,12 @@ impl Config {
894936
config.channel = ci_channel.into();
895937
}
896938

897-
config.rust_profile_use = flags.rust_profile_use;
898-
config.rust_profile_generate = flags.rust_profile_generate;
939+
config.rust_profile_use = flags_rust_profile_use;
940+
config.rust_profile_generate = flags_rust_profile_generate;
899941

900-
config.apply_rust_config(toml.rust, flags.warnings, &mut description);
942+
config.apply_rust_config(toml.rust, flags_warnings, &mut description);
901943

902-
config.reproducible_artifacts = flags.reproducible_artifact;
944+
config.reproducible_artifacts = flags_reproducible_artifact;
903945
config.description = description;
904946

905947
// We need to override `rust.channel` if it's manually specified when using the CI rustc.
@@ -955,7 +997,7 @@ impl Config {
955997

956998
if matches!(config.lld_mode, LldMode::SelfContained)
957999
&& !config.lld_enabled
958-
&& flags.stage.unwrap_or(0) > 0
1000+
&& flags_stage.unwrap_or(0) > 0
9591001
{
9601002
panic!(
9611003
"Trying to use self-contained lld as a linker, but LLD is not being added to the sysroot. Enable it with rust.lld = true."
@@ -974,7 +1016,7 @@ impl Config {
9741016
config.compiletest_use_stage0_libtest = compiletest_use_stage0_libtest.unwrap_or(true);
9751017

9761018
let download_rustc = config.download_rustc_commit.is_some();
977-
config.explicit_stage_from_cli = flags.stage.is_some();
1019+
config.explicit_stage_from_cli = flags_stage.is_some();
9781020
config.explicit_stage_from_config = test_stage.is_some()
9791021
|| build_stage.is_some()
9801022
|| doc_stage.is_some()
@@ -984,35 +1026,35 @@ impl Config {
9841026
|| bench_stage.is_some();
9851027
// See https://github.com/rust-lang/compiler-team/issues/326
9861028
config.stage = match config.cmd {
987-
Subcommand::Check { .. } => flags.stage.or(check_stage).unwrap_or(0),
988-
Subcommand::Clippy { .. } | Subcommand::Fix => flags.stage.or(check_stage).unwrap_or(1),
1029+
Subcommand::Check { .. } => flags_stage.or(check_stage).unwrap_or(0),
1030+
Subcommand::Clippy { .. } | Subcommand::Fix => flags_stage.or(check_stage).unwrap_or(1),
9891031
// `download-rustc` only has a speed-up for stage2 builds. Default to stage2 unless explicitly overridden.
9901032
Subcommand::Doc { .. } => {
991-
flags.stage.or(doc_stage).unwrap_or(if download_rustc { 2 } else { 1 })
1033+
flags_stage.or(doc_stage).unwrap_or(if download_rustc { 2 } else { 1 })
9921034
}
9931035
Subcommand::Build => {
994-
flags.stage.or(build_stage).unwrap_or(if download_rustc { 2 } else { 1 })
1036+
flags_stage.or(build_stage).unwrap_or(if download_rustc { 2 } else { 1 })
9951037
}
9961038
Subcommand::Test { .. } | Subcommand::Miri { .. } => {
997-
flags.stage.or(test_stage).unwrap_or(if download_rustc { 2 } else { 1 })
1039+
flags_stage.or(test_stage).unwrap_or(if download_rustc { 2 } else { 1 })
9981040
}
999-
Subcommand::Bench { .. } => flags.stage.or(bench_stage).unwrap_or(2),
1000-
Subcommand::Dist => flags.stage.or(dist_stage).unwrap_or(2),
1001-
Subcommand::Install => flags.stage.or(install_stage).unwrap_or(2),
1002-
Subcommand::Perf { .. } => flags.stage.unwrap_or(1),
1041+
Subcommand::Bench { .. } => flags_stage.or(bench_stage).unwrap_or(2),
1042+
Subcommand::Dist => flags_stage.or(dist_stage).unwrap_or(2),
1043+
Subcommand::Install => flags_stage.or(install_stage).unwrap_or(2),
1044+
Subcommand::Perf { .. } => flags_stage.unwrap_or(1),
10031045
// These are all bootstrap tools, which don't depend on the compiler.
10041046
// The stage we pass shouldn't matter, but use 0 just in case.
10051047
Subcommand::Clean { .. }
10061048
| Subcommand::Run { .. }
10071049
| Subcommand::Setup { .. }
10081050
| Subcommand::Format { .. }
10091051
| Subcommand::Suggest { .. }
1010-
| Subcommand::Vendor { .. } => flags.stage.unwrap_or(0),
1052+
| Subcommand::Vendor { .. } => flags_stage.unwrap_or(0),
10111053
};
10121054

10131055
// CI should always run stage 2 builds, unless it specifically states otherwise
10141056
#[cfg(not(test))]
1015-
if flags.stage.is_none() && config.is_running_on_ci {
1057+
if flags_stage.is_none() && config.is_running_on_ci {
10161058
match config.cmd {
10171059
Subcommand::Test { .. }
10181060
| Subcommand::Miri { .. }

0 commit comments

Comments
 (0)