@@ -392,27 +392,70 @@ impl Config {
392
392
)
393
393
) ]
394
394
pub ( crate ) fn parse_inner (
395
- mut flags : Flags ,
395
+ flags : Flags ,
396
396
get_toml : impl Fn ( & Path ) -> Result < TomlConfig , toml:: de:: Error > ,
397
397
) -> 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
+
398
441
let mut config = Config :: default_opts ( ) ;
399
442
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 ( ) ) ;
402
445
403
446
config. exec_ctx = exec_ctx;
404
447
405
448
// Set flags.
406
- config. paths = std:: mem:: take ( & mut flags . paths ) ;
449
+ config. paths = std:: mem:: take ( & mut flags_paths ) ;
407
450
408
451
#[ cfg( feature = "tracing" ) ]
409
452
span ! (
410
453
target: "CONFIG_HANDLING" ,
411
454
tracing:: Level :: TRACE ,
412
455
"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
416
459
) ;
417
460
418
461
#[ cfg( feature = "tracing" ) ]
@@ -423,28 +466,28 @@ impl Config {
423
466
"config.skip" = ?config. skip,
424
467
) ;
425
468
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 ;
444
487
445
488
// Infer the rest of the configuration.
446
489
447
- if let Some ( src) = flags . src {
490
+ if let Some ( src) = flags_src {
448
491
config. src = src
449
492
} else {
450
493
// Infer the source directory. This is non-trivial because we want to support a downloaded bootstrap binary,
@@ -510,8 +553,7 @@ impl Config {
510
553
// 4. `<root>/bootstrap.toml`
511
554
// 5. `./config.toml` (fallback for backward compatibility)
512
555
// 6. `<root>/config.toml`
513
- let toml_path = flags
514
- . config
556
+ let toml_path = flags_config
515
557
. clone ( )
516
558
. or_else ( || env:: var_os ( "RUST_BOOTSTRAP_CONFIG" ) . map ( PathBuf :: from) ) ;
517
559
let using_default_path = toml_path. is_none ( ) ;
@@ -610,7 +652,7 @@ impl Config {
610
652
}
611
653
612
654
let mut override_toml = TomlConfig :: default ( ) ;
613
- for option in flags . set . iter ( ) {
655
+ for option in flags_set . iter ( ) {
614
656
fn get_table ( option : & str ) -> Result < TomlConfig , toml:: de:: Error > {
615
657
toml:: from_str ( option) . and_then ( |table : toml:: Value | TomlConfig :: deserialize ( table) )
616
658
}
@@ -708,7 +750,7 @@ impl Config {
708
750
exclude,
709
751
} = toml. build . unwrap_or_default ( ) ;
710
752
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 ( ) ;
712
754
713
755
if let Some ( exclude) = exclude {
714
756
paths. extend ( exclude) ;
@@ -728,15 +770,15 @@ impl Config {
728
770
} )
729
771
. collect ( ) ;
730
772
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 ) ) ) ) ;
732
774
733
- if let Some ( flags_build) = flags . build {
775
+ if let Some ( flags_build) = flags_build {
734
776
config. host_target = TargetSelection :: from_user ( & flags_build) ;
735
777
} else if let Some ( file_build) = build {
736
778
config. host_target = TargetSelection :: from_user ( & file_build) ;
737
779
} ;
738
780
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) ) ) ;
740
782
// NOTE: Bootstrap spawns various commands with different working directories.
741
783
// To avoid writing to random places on the file system, `config.out` needs to be an absolute path.
742
784
if !config. out . is_absolute ( ) {
@@ -751,7 +793,7 @@ impl Config {
751
793
}
752
794
753
795
config. initial_rustc = if let Some ( rustc) = rustc {
754
- if !flags . skip_stage0_validation {
796
+ if !flags_skip_stage0_validation {
755
797
config. check_stage0_version ( & rustc, "rustc" ) ;
756
798
}
757
799
rustc
@@ -777,7 +819,7 @@ impl Config {
777
819
config. initial_cargo_clippy = cargo_clippy;
778
820
779
821
config. initial_cargo = if let Some ( cargo) = cargo {
780
- if !flags . skip_stage0_validation {
822
+ if !flags_skip_stage0_validation {
781
823
config. check_stage0_version ( & cargo, "cargo" ) ;
782
824
}
783
825
cargo
@@ -793,14 +835,14 @@ impl Config {
793
835
config. out = dir;
794
836
}
795
837
796
- config. hosts = if let Some ( TargetSelectionList ( arg_host) ) = flags . host {
838
+ config. hosts = if let Some ( TargetSelectionList ( arg_host) ) = flags_host {
797
839
arg_host
798
840
} else if let Some ( file_host) = host {
799
841
file_host. iter ( ) . map ( |h| TargetSelection :: from_user ( h) ) . collect ( )
800
842
} else {
801
843
vec ! [ config. host_target]
802
844
} ;
803
- config. targets = if let Some ( TargetSelectionList ( arg_target) ) = flags . target {
845
+ config. targets = if let Some ( TargetSelectionList ( arg_target) ) = flags_target {
804
846
arg_target
805
847
} else if let Some ( file_target) = target {
806
848
file_target. iter ( ) . map ( |h| TargetSelection :: from_user ( h) ) . collect ( )
@@ -839,7 +881,7 @@ impl Config {
839
881
set ( & mut config. print_step_rusage , print_step_rusage) ;
840
882
config. patch_binaries_for_nix = patch_binaries_for_nix;
841
883
842
- config. verbose = cmp:: max ( config. verbose , flags . verbose as usize ) ;
884
+ config. verbose = cmp:: max ( config. verbose , flags_verbose as usize ) ;
843
885
844
886
// Verbose flag is a good default for `rust.verbose-tests`.
845
887
config. verbose_tests = config. is_verbose ( ) ;
@@ -894,12 +936,12 @@ impl Config {
894
936
config. channel = ci_channel. into ( ) ;
895
937
}
896
938
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 ;
899
941
900
- config. apply_rust_config ( toml. rust , flags . warnings , & mut description) ;
942
+ config. apply_rust_config ( toml. rust , flags_warnings , & mut description) ;
901
943
902
- config. reproducible_artifacts = flags . reproducible_artifact ;
944
+ config. reproducible_artifacts = flags_reproducible_artifact ;
903
945
config. description = description;
904
946
905
947
// We need to override `rust.channel` if it's manually specified when using the CI rustc.
@@ -955,7 +997,7 @@ impl Config {
955
997
956
998
if matches ! ( config. lld_mode, LldMode :: SelfContained )
957
999
&& !config. lld_enabled
958
- && flags . stage . unwrap_or ( 0 ) > 0
1000
+ && flags_stage . unwrap_or ( 0 ) > 0
959
1001
{
960
1002
panic ! (
961
1003
"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 {
974
1016
config. compiletest_use_stage0_libtest = compiletest_use_stage0_libtest. unwrap_or ( true ) ;
975
1017
976
1018
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 ( ) ;
978
1020
config. explicit_stage_from_config = test_stage. is_some ( )
979
1021
|| build_stage. is_some ( )
980
1022
|| doc_stage. is_some ( )
@@ -984,35 +1026,35 @@ impl Config {
984
1026
|| bench_stage. is_some ( ) ;
985
1027
// See https://github.com/rust-lang/compiler-team/issues/326
986
1028
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 ) ,
989
1031
// `download-rustc` only has a speed-up for stage2 builds. Default to stage2 unless explicitly overridden.
990
1032
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 } )
992
1034
}
993
1035
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 } )
995
1037
}
996
1038
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 } )
998
1040
}
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 ) ,
1003
1045
// These are all bootstrap tools, which don't depend on the compiler.
1004
1046
// The stage we pass shouldn't matter, but use 0 just in case.
1005
1047
Subcommand :: Clean { .. }
1006
1048
| Subcommand :: Run { .. }
1007
1049
| Subcommand :: Setup { .. }
1008
1050
| Subcommand :: Format { .. }
1009
1051
| Subcommand :: Suggest { .. }
1010
- | Subcommand :: Vendor { .. } => flags . stage . unwrap_or ( 0 ) ,
1052
+ | Subcommand :: Vendor { .. } => flags_stage . unwrap_or ( 0 ) ,
1011
1053
} ;
1012
1054
1013
1055
// CI should always run stage 2 builds, unless it specifically states otherwise
1014
1056
#[ 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 {
1016
1058
match config. cmd {
1017
1059
Subcommand :: Test { .. }
1018
1060
| Subcommand :: Miri { .. }
0 commit comments