77mod  tests; 
88
99use  std:: cell:: { Cell ,  RefCell } ; 
10- use  std:: cmp; 
1110use  std:: collections:: { HashMap ,  HashSet } ; 
12- use  std:: env; 
1311use  std:: fs; 
1412use  std:: ops:: { Deref ,  DerefMut } ; 
1513use  std:: path:: { Path ,  PathBuf } ; 
@@ -21,9 +19,7 @@ use crate::cc_detect::{ndk_compiler, Language};
2119use  crate :: channel:: { self ,  GitInfo } ; 
2220pub  use  crate :: flags:: Subcommand ; 
2321use  crate :: flags:: { Color ,  Flags } ; 
24- use  crate :: min_config:: { 
25-     deserialize_stage0_metadata,  get_toml,  set_and_return_toml_config,  set_config_output_dir, 
26- } ; 
22+ use  crate :: min_config:: { get_toml,  set_cfg_path_and_return_toml_cfg} ; 
2723use  crate :: util:: { exe,  output,  t} ; 
2824use  crate :: MinimalConfig ; 
2925use  once_cell:: sync:: OnceCell ; 
@@ -388,14 +384,15 @@ impl Target {
388384        target
389385    } 
390386} 
387+ 
391388/// Structure of the `config.toml` file that configuration is read from. 
392389/// 
393390/// This structure uses `Decodable` to automatically decode a TOML configuration 
394391/// file into this format, and then this is traversed and written into the above 
395392/// `Config` structure. 
396393#[ derive( Deserialize ,  Default ) ]  
397394#[ serde( deny_unknown_fields,  rename_all = "kebab-case" ) ]  
398- struct  TomlConfig  { 
395+ pub   struct  TomlConfig  { 
399396    changelog_seen :  Option < usize > , 
400397    build :  Option < Build > , 
401398    install :  Option < Install > , 
@@ -440,8 +437,8 @@ macro_rules! define_config {
440437        $( $field: ident:  Option <$field_ty: ty> = $field_key: literal, ) * 
441438    } )  => { 
442439        $( #[ $attr] ) * 
443-         struct  $name { 
444-             $( $field:  Option <$field_ty>, ) * 
440+         pub   struct  $name { 
441+             $( pub ( crate )   $field:  Option <$field_ty>, ) * 
445442        } 
446443
447444        impl  Merge  for  $name { 
@@ -523,7 +520,7 @@ macro_rules! define_config {
523520
524521define_config !  { 
525522    /// TOML representation of various global build decisions. 
526-      #[ derive( Default ) ] 
523+      #[ derive( Clone ,   Default ) ] 
527524    struct  Build  { 
528525        build:  Option <String > = "build" , 
529526        host:  Option <Vec <String >> = "host" , 
@@ -629,7 +626,7 @@ define_config! {
629626
630627#[ derive( Debug ,  Deserialize ) ]  
631628#[ serde( untagged) ]  
632- enum  StringOrBool  { 
629+ pub ( crate )   enum  StringOrBool  { 
633630    String ( String ) , 
634631    Bool ( bool ) , 
635632} 
@@ -748,21 +745,22 @@ impl Config {
748745        config. stdout_is_tty  = std:: io:: stdout ( ) . is_terminal ( ) ; 
749746        config. stderr_is_tty  = std:: io:: stderr ( ) . is_terminal ( ) ; 
750747
751-         // set by build.rs 
752-         config. build  = TargetSelection :: from_user ( & env ! ( "BUILD_TRIPLE" ) ) ; 
753- 
754-         let  manifest_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) ; 
755-         // Undo `src/bootstrap` 
756-         config. src  = manifest_dir. parent ( ) . unwrap ( ) . parent ( ) . unwrap ( ) . to_owned ( ) ; 
757-         config. out  = PathBuf :: from ( "build" ) ; 
758- 
759748        config
760749    } 
761750
762-     pub  fn  parse ( args :  & [ String ] )  -> Config  { 
751+     pub  fn  parse ( args :  & [ String ] ,   custom_toml_config :   Option < TomlConfig > )  -> Config  { 
763752        let  flags = Flags :: parse ( & args) ; 
764753        let  mut  config = Config :: default_opts ( ) ; 
765-         config. minimal_config  = MinimalConfig :: parse ( flags. config . clone ( ) ) ; 
754+ 
755+         let  mut  toml:  TomlConfig  = custom_toml_config. unwrap_or_else ( || { 
756+             set_cfg_path_and_return_toml_cfg ( 
757+                 config. src . clone ( ) , 
758+                 flags. config . clone ( ) , 
759+                 & mut  config. config , 
760+             ) 
761+         } ) ; 
762+ 
763+         config. minimal_config  = MinimalConfig :: parse ( & flags,  toml. build . clone ( ) ) ; 
766764
767765        // Set flags. 
768766        config. exclude  = flags. exclude . into_iter ( ) . map ( |path| TaskPath :: parse ( path) ) . collect ( ) ; 
@@ -773,7 +771,6 @@ impl Config {
773771        config. jobs  = flags. jobs . map ( threads_from_config) ; 
774772        config. cmd  = flags. cmd ; 
775773        config. incremental  = flags. incremental ; 
776-         config. dry_run  = if  flags. dry_run  {  DryRun :: UserSelected  }  else  {  DryRun :: Disabled  } ; 
777774        config. keep_stage  = flags. keep_stage ; 
778775        config. keep_stage_std  = flags. keep_stage_std ; 
779776        config. color  = flags. color ; 
@@ -793,13 +790,10 @@ impl Config {
793790            crate :: detail_exit ( 1 ) ; 
794791        } 
795792
796-         // Infer the rest of the configuration. 
797- 
798-         set_config_output_dir ( & mut  config. out ) ; 
799-         config. stage0_metadata  = deserialize_stage0_metadata ( & config. src ) ; 
800- 
801-         let  mut  toml:  TomlConfig  =
802-             set_and_return_toml_config ( config. src . clone ( ) ,  flags. config ,  & mut  config. config ) ; 
793+         let  build = toml. build . clone ( ) . unwrap_or_default ( ) ; 
794+         if  let  Some ( file_build)  = build. build . as_ref ( )  { 
795+             config. build  = TargetSelection :: from_user ( file_build) ; 
796+         } ; 
803797
804798        if  let  Some ( include)  = & toml. profile  { 
805799            let  mut  include_path = config. src . clone ( ) ; 
@@ -813,11 +807,6 @@ impl Config {
813807
814808        config. changelog_seen  = toml. changelog_seen ; 
815809
816-         let  build = toml. build . unwrap_or_default ( ) ; 
817-         if  let  Some ( file_build)  = build. build  { 
818-             config. build  = TargetSelection :: from_user ( & file_build) ; 
819-         } ; 
820- 
821810        set ( & mut  config. out ,  flags. build_dir . or_else ( || build. build_dir . map ( PathBuf :: from) ) ) ; 
822811        // NOTE: Bootstrap spawns various commands with different working directories. 
823812        // To avoid writing to random places on the file system, `config.out` needs to be an absolute path. 
@@ -875,17 +864,13 @@ impl Config {
875864        set ( & mut  config. full_bootstrap ,  build. full_bootstrap ) ; 
876865        set ( & mut  config. extended ,  build. extended ) ; 
877866        config. tools  = build. tools ; 
878-         set ( & mut  config. verbose ,  build. verbose ) ; 
879867        set ( & mut  config. sanitizers ,  build. sanitizers ) ; 
880868        set ( & mut  config. profiler ,  build. profiler ) ; 
881869        set ( & mut  config. cargo_native_static ,  build. cargo_native_static ) ; 
882870        set ( & mut  config. configure_args ,  build. configure_args ) ; 
883871        set ( & mut  config. local_rebuild ,  build. local_rebuild ) ; 
884872        set ( & mut  config. print_step_timings ,  build. print_step_timings ) ; 
885873        set ( & mut  config. print_step_rusage ,  build. print_step_rusage ) ; 
886-         set ( & mut  config. patch_binaries_for_nix ,  build. patch_binaries_for_nix ) ; 
887- 
888-         config. verbose  = cmp:: max ( config. verbose ,  flags. verbose ) ; 
889874
890875        if  let  Some ( install)  = toml. install  { 
891876            config. prefix  = install. prefix . map ( PathBuf :: from) ; 
@@ -1449,7 +1434,7 @@ impl Config {
14491434    } 
14501435} 
14511436
1452- fn  set < T > ( field :  & mut  T ,  val :  Option < T > )  { 
1437+ pub ( crate )   fn  set < T > ( field :  & mut  T ,  val :  Option < T > )  { 
14531438    if  let  Some ( v)  = val { 
14541439        * field = v; 
14551440    } 
0 commit comments