Skip to content

Commit 93fbc4a

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

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
{

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};
@@ -21,9 +19,7 @@ use crate::cc_detect::{ndk_compiler, Language};
2119
use crate::channel::{self, GitInfo};
2220
pub use crate::flags::Subcommand;
2321
use 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};
2723
use crate::util::{exe, output, t};
2824
use crate::MinimalConfig;
2925
use 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

524521
define_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
}

src/bootstrap/config/tests.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use super::{Config, TomlConfig};
22
use std::{env, path::Path};
33

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

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

1212
#[test]

src/bootstrap/flags.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ To learn more about a subcommand, run `./x.py <subcommand> -h`",
366366
} else {
367367
"setup"
368368
};
369-
let config = Config::parse(&[cmd.to_string()]);
369+
let config = Config::parse(&[cmd.to_string()], None);
370370
let build = Build::new(config);
371371
let paths = Builder::get_help(&build, subcommand);
372372

src/bootstrap/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ mod job {
8888
pub use crate::builder::PathSet;
8989
use crate::cache::{Interned, INTERNER};
9090
pub use crate::config::Config;
91+
pub use crate::flags::Flags;
9192
pub use crate::flags::Subcommand;
9293
use termcolor::{ColorChoice, StandardStream, WriteColor};
9394
pub use crate::min_config::MinimalConfig;

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},
@@ -10,6 +11,8 @@ use serde::Deserialize;
1011

1112
use crate::{
1213
cache::{Interned, INTERNER},
14+
config::{self, set},
15+
flags::Flags,
1316
t,
1417
util::output,
1518
};
@@ -90,22 +93,40 @@ impl MinimalConfig {
9093
}
9194
}
9295

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

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

100112
set_config_output_dir(&mut config.out);
101113

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

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

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

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

0 commit comments

Comments
 (0)