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