Skip to content

Commit a8f85ae

Browse files
committed
move min_config related options from config module
Signed-off-by: ozkanonur <[email protected]>
1 parent 8a6c18f commit a8f85ae

File tree

8 files changed

+63
-60
lines changed

8 files changed

+63
-60
lines changed

src/bootstrap/bin/bootstrap-shim.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
use std::{env, process::Command};
22

3-
use bootstrap::{t, MinimalConfig};
3+
use bootstrap::{Flags, MinimalConfig};
44

55
#[path = "../../../src/tools/x/src/main.rs"]
66
mod run_python;
77

88
fn main() {
99
let args = env::args().skip(1).collect::<Vec<_>>();
10-
let mut opts = getopts::Options::new();
11-
opts.optopt("", "config", "TOML configuration file for build", "FILE");
12-
let matches = t!(opts.parse(args));
10+
let flags = Flags::parse(&args);
1311

1412
// If there are no untracked changes to bootstrap, download it from CI.
1513
// Otherwise, build it from source. Use python to build to avoid duplicating the code between python and rust.
16-
let config = MinimalConfig::parse(t!(matches.opt_get("config")));
14+
let config = MinimalConfig::parse(&flags, None);
1715
let bootstrap_bin = if let Some(commit) = last_modified_bootstrap_commit(&config) {
1816
config.download_bootstrap(&commit)
1917
} else {

src/bootstrap/bin/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use bootstrap::{Build, Config, Subcommand, VERSION};
1313

1414
fn main() {
1515
let args = env::args().skip(1).collect::<Vec<_>>();
16-
let config = Config::parse(&args);
16+
let config = Config::parse(&args, None);
1717

1818
#[cfg(all(any(unix, windows), not(target_os = "solaris")))]
1919
let mut build_lock;

src/bootstrap/builder/tests.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ fn configure(cmd: &str, host: &[&str], target: &[&str]) -> Config {
77
}
88

99
fn configure_with_args(cmd: &[String], host: &[&str], target: &[&str]) -> Config {
10-
let mut config = Config::parse(cmd);
10+
let mut config = Config::parse(cmd, None);
1111
// don't save toolstates
1212
config.save_toolstates = None;
1313
config.dry_run = DryRun::SelfCheck;
@@ -18,7 +18,7 @@ fn configure_with_args(cmd: &[String], host: &[&str], target: &[&str]) -> Config
1818
let submodule_build = Build::new(Config {
1919
// don't include LLVM, so CI doesn't require ninja/cmake to be installed
2020
rust_codegen_backends: vec![],
21-
..Config::parse(&["check".to_owned()])
21+
..Config::parse(&["check".to_owned()], None)
2222
});
2323
submodule_build.update_submodule(Path::new("src/doc/book"));
2424
submodule_build.update_submodule(Path::new("src/tools/rust-analyzer"));

src/bootstrap/config.rs

+23-38
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77
mod tests;
88

99
use std::cell::{Cell, RefCell};
10-
use std::cmp;
1110
use std::collections::{HashMap, HashSet};
12-
use std::env;
1311
use std::fs;
1412
use std::ops::{Deref, DerefMut};
1513
use std::path::{Path, PathBuf};
@@ -22,9 +20,7 @@ use crate::cc_detect::{ndk_compiler, Language};
2220
use crate::channel::{self, GitInfo};
2321
pub use crate::flags::Subcommand;
2422
use crate::flags::{Color, Flags, Warnings};
25-
use crate::min_config::{
26-
deserialize_stage0_metadata, get_toml, set_and_return_toml_config, set_config_output_dir,
27-
};
23+
use crate::min_config::{get_toml, set_cfg_path_and_return_toml_cfg};
2824
use crate::util::{exe, output, t};
2925
use crate::MinimalConfig;
3026
use once_cell::sync::OnceCell;
@@ -391,14 +387,15 @@ impl Target {
391387
target
392388
}
393389
}
390+
394391
/// Structure of the `config.toml` file that configuration is read from.
395392
///
396393
/// This structure uses `Decodable` to automatically decode a TOML configuration
397394
/// file into this format, and then this is traversed and written into the above
398395
/// `Config` structure.
399396
#[derive(Deserialize, Default)]
400397
#[serde(deny_unknown_fields, rename_all = "kebab-case")]
401-
struct TomlConfig {
398+
pub struct TomlConfig {
402399
changelog_seen: Option<usize>,
403400
build: Option<Build>,
404401
install: Option<Install>,
@@ -443,8 +440,8 @@ macro_rules! define_config {
443440
$($field:ident: Option<$field_ty:ty> = $field_key:literal,)*
444441
}) => {
445442
$(#[$attr])*
446-
struct $name {
447-
$($field: Option<$field_ty>,)*
443+
pub struct $name {
444+
$(pub(crate) $field: Option<$field_ty>,)*
448445
}
449446

450447
impl Merge for $name {
@@ -526,7 +523,7 @@ macro_rules! define_config {
526523

527524
define_config! {
528525
/// TOML representation of various global build decisions.
529-
#[derive(Default)]
526+
#[derive(Clone, Default)]
530527
struct Build {
531528
build: Option<String> = "build",
532529
host: Option<Vec<String>> = "host",
@@ -632,7 +629,7 @@ define_config! {
632629

633630
#[derive(Debug, Deserialize)]
634631
#[serde(untagged)]
635-
enum StringOrBool {
632+
pub(crate) enum StringOrBool {
636633
String(String),
637634
Bool(bool),
638635
}
@@ -752,14 +749,6 @@ impl Config {
752749
config.stdout_is_tty = std::io::stdout().is_terminal();
753750
config.stderr_is_tty = std::io::stderr().is_terminal();
754751

755-
// set by build.rs
756-
config.build = TargetSelection::from_user(&env!("BUILD_TRIPLE"));
757-
758-
let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
759-
// Undo `src/bootstrap`
760-
config.src = manifest_dir.parent().unwrap().parent().unwrap().to_owned();
761-
config.out = PathBuf::from("build");
762-
763752
config
764753
}
765754

@@ -785,10 +774,19 @@ impl Config {
785774
args
786775
}
787776

788-
pub fn parse(args: &[String]) -> Config {
777+
pub fn parse(args: &[String], custom_toml_config: Option<TomlConfig>) -> Config {
789778
let mut flags = Flags::parse(&args);
790779
let mut config = Config::default_opts();
791-
config.minimal_config = MinimalConfig::parse(flags.config.clone());
780+
781+
let mut toml: TomlConfig = custom_toml_config.unwrap_or_else(|| {
782+
set_cfg_path_and_return_toml_cfg(
783+
config.src.clone(),
784+
flags.config.clone(),
785+
&mut config.config,
786+
)
787+
});
788+
789+
config.minimal_config = MinimalConfig::parse(&flags, toml.build.clone());
792790

793791
// Set flags.
794792
config.paths = std::mem::take(&mut flags.paths);
@@ -800,7 +798,6 @@ impl Config {
800798
config.jobs = Some(threads_from_config(flags.jobs as u32));
801799
config.cmd = flags.cmd;
802800
config.incremental = flags.incremental;
803-
config.dry_run = if flags.dry_run { DryRun::UserSelected } else { DryRun::Disabled };
804801
config.keep_stage = flags.keep_stage;
805802
config.keep_stage_std = flags.keep_stage_std;
806803
config.color = flags.color;
@@ -817,13 +814,10 @@ impl Config {
817814
crate::detail_exit(1);
818815
}
819816

820-
// Infer the rest of the configuration.
821-
822-
set_config_output_dir(&mut config.out);
823-
config.stage0_metadata = deserialize_stage0_metadata(&config.src);
824-
825-
let mut toml: TomlConfig =
826-
set_and_return_toml_config(config.src.clone(), flags.config, &mut config.config);
817+
let build = toml.build.clone().unwrap_or_default();
818+
if let Some(file_build) = build.build.as_ref() {
819+
config.build = TargetSelection::from_user(file_build);
820+
};
827821

828822
if let Some(include) = &toml.profile {
829823
let mut include_path = config.src.clone();
@@ -837,11 +831,6 @@ impl Config {
837831

838832
config.changelog_seen = toml.changelog_seen;
839833

840-
let build = toml.build.unwrap_or_default();
841-
if let Some(file_build) = build.build {
842-
config.build = TargetSelection::from_user(&file_build);
843-
};
844-
845834
set(&mut config.out, flags.build_dir.or_else(|| build.build_dir.map(PathBuf::from)));
846835
// NOTE: Bootstrap spawns various commands with different working directories.
847836
// To avoid writing to random places on the file system, `config.out` needs to be an absolute path.
@@ -902,17 +891,13 @@ impl Config {
902891
set(&mut config.full_bootstrap, build.full_bootstrap);
903892
set(&mut config.extended, build.extended);
904893
config.tools = build.tools;
905-
set(&mut config.verbose, build.verbose);
906894
set(&mut config.sanitizers, build.sanitizers);
907895
set(&mut config.profiler, build.profiler);
908896
set(&mut config.cargo_native_static, build.cargo_native_static);
909897
set(&mut config.configure_args, build.configure_args);
910898
set(&mut config.local_rebuild, build.local_rebuild);
911899
set(&mut config.print_step_timings, build.print_step_timings);
912900
set(&mut config.print_step_rusage, build.print_step_rusage);
913-
set(&mut config.patch_binaries_for_nix, build.patch_binaries_for_nix);
914-
915-
config.verbose = cmp::max(config.verbose, flags.verbose as usize);
916901

917902
if let Some(install) = toml.install {
918903
config.prefix = install.prefix.map(PathBuf::from);
@@ -1526,7 +1511,7 @@ impl Config {
15261511
}
15271512
}
15281513

1529-
fn set<T>(field: &mut T, val: Option<T>) {
1514+
pub(crate) fn set<T>(field: &mut T, val: Option<T>) {
15301515
if let Some(v) = val {
15311516
*field = v;
15321517
}

src/bootstrap/config/tests.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ use super::{Config, Flags, TomlConfig};
22
use clap::CommandFactory;
33
use std::{env, path::Path};
44

5-
fn toml(config: &str) -> impl '_ + Fn(&Path) -> TomlConfig {
6-
|&_| toml::from_str(config).unwrap()
5+
fn toml(config: &str) -> TomlConfig {
6+
toml::from_str(config).unwrap()
77
}
88

99
fn parse(config: &str) -> Config {
10-
Config::parse_inner(&["check".to_owned(), "--config=/does/not/exist".to_owned()], toml(config))
10+
Config::parse(&["check".to_owned(), "--config=/does/not/exist".to_owned()], Some(toml(config)))
1111
}
1212

1313
#[test]

src/bootstrap/flags.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ impl Flags {
183183
HelpVerboseOnly::try_parse_from(it.clone())
184184
{
185185
println!("note: updating submodules before printing available paths");
186-
let config = Config::parse(&[String::from("build")]);
186+
let config = Config::parse(&[String::from("build")], None);
187187
let build = Build::new(config);
188188
let paths = Builder::get_help(&build, subcommand);
189189
if let Some(s) = paths {

src/bootstrap/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ mod job {
9090
pub use crate::builder::PathSet;
9191
use crate::cache::{Interned, INTERNER};
9292
pub use crate::config::Config;
93+
pub use crate::flags::Flags;
9394
pub use crate::flags::Subcommand;
9495
pub use crate::min_config::MinimalConfig;
9596
use termcolor::{ColorChoice, StandardStream, WriteColor};

src/bootstrap/min_config.rs

+29-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use core::fmt;
22
use std::{
3+
cmp,
34
collections::HashMap,
45
env, fs,
56
path::{Path, PathBuf},
@@ -11,6 +12,8 @@ use serde_derive::Deserialize;
1112

1213
use crate::{
1314
cache::{Interned, INTERNER},
15+
config::{self, set},
16+
flags::Flags,
1417
t,
1518
util::output,
1619
};
@@ -91,22 +94,40 @@ impl MinimalConfig {
9194
}
9295
}
9396

94-
pub fn parse(config_flag: Option<PathBuf>) -> MinimalConfig {
97+
fn set_shared_fields_from_parent(&mut self, parent_build_config: config::Build) {
98+
set(&mut self.verbose, parent_build_config.verbose);
99+
set(&mut self.patch_binaries_for_nix, parent_build_config.patch_binaries_for_nix);
100+
}
101+
102+
pub fn parse(flags: &Flags, parent_build_config: Option<config::Build>) -> MinimalConfig {
95103
let mut config = Self::default_opts();
96104

105+
if let Some(parent_build_config) = parent_build_config {
106+
config.set_shared_fields_from_parent(parent_build_config);
107+
};
108+
97109
if let Some(src) = src() {
98110
config.src = src;
99111
}
100112

101113
set_config_output_dir(&mut config.out);
102114

103-
let toml: TomlConfig =
104-
set_and_return_toml_config(config.src.clone(), config_flag, &mut config.config);
115+
config.stage0_metadata = deserialize_stage0_metadata(&config.src);
116+
config.dry_run = if flags.dry_run { DryRun::UserSelected } else { DryRun::Disabled };
117+
118+
let toml: TomlConfig = set_cfg_path_and_return_toml_cfg(
119+
config.src.clone(),
120+
flags.config.clone(),
121+
&mut config.config,
122+
);
105123

106-
if let Some(build) = toml.build.unwrap_or_default().build {
107-
config.build = TargetSelection::from_user(&build);
124+
let build = toml.build.unwrap_or_default();
125+
if let Some(file_build) = build.build {
126+
config.build = TargetSelection::from_user(&file_build);
108127
}
109128

129+
config.verbose = cmp::max(config.verbose, flags.verbose as usize);
130+
110131
if config.dry_run() {
111132
let dir = config.out.join("tmp-dry-run");
112133
t!(fs::create_dir_all(&dir));
@@ -229,10 +250,8 @@ pub(crate) fn get_toml<T: Deserialize<'static> + Default>(file: &Path) -> T {
229250
/// Shared helper function to be used in `MinimalConfig::parse` and `bootstrap::config::Config::parse`
230251
///
231252
/// Use the build directory of the original x.py invocation, so that we can set `initial_rustc` properly.
232-
#[allow(unused_variables)]
233-
pub(crate) fn set_config_output_dir(output_path: &mut PathBuf) {
234-
#[cfg(test)]
235-
{
253+
fn set_config_output_dir(output_path: &mut PathBuf) {
254+
if cfg!(test) {
236255
*output_path = Path::new(
237256
&env::var_os("CARGO_TARGET_DIR").expect("cargo test directly is not supported"),
238257
)
@@ -243,7 +262,7 @@ pub(crate) fn set_config_output_dir(output_path: &mut PathBuf) {
243262
}
244263

245264
/// Shared helper function to be used in `MinimalConfig::parse` and `bootstrap::config::Config::parse`
246-
pub(crate) fn set_and_return_toml_config<T: Deserialize<'static> + Default>(
265+
pub(crate) fn set_cfg_path_and_return_toml_cfg<T: Deserialize<'static> + Default>(
247266
src: PathBuf,
248267
config_flag: Option<PathBuf>,
249268
cfg_path: &mut Option<PathBuf>,

0 commit comments

Comments
 (0)