Skip to content

Commit

Permalink
bootstrap: allow setting --jobs in config.toml
Browse files Browse the repository at this point in the history
  • Loading branch information
jieyouxu committed Oct 18, 2024
1 parent 03983fb commit 4adaf51
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 3 deletions.
4 changes: 4 additions & 0 deletions config.example.toml
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,10 @@
# Specify the location of the Android NDK. Used when targeting Android.
#android-ndk = "/path/to/android-ndk-r26d"

# Number of parallel jobs to be used for building and testing. If set to `0` or
# omitted, it will be automatically determined.
#jobs = 0

# =============================================================================
# General install configuration options
# =============================================================================
Expand Down
15 changes: 14 additions & 1 deletion src/bootstrap/src/core/config/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -891,6 +891,7 @@ define_config! {
metrics: Option<bool> = "metrics",
android_ndk: Option<PathBuf> = "android-ndk",
optimized_compiler_builtins: Option<bool> = "optimized-compiler-builtins",
jobs: Option<u32> = "jobs",
}
}

Expand Down Expand Up @@ -1289,7 +1290,8 @@ impl Config {
config.rustc_error_format = flags.rustc_error_format;
config.json_output = flags.json_output;
config.on_fail = flags.on_fail;
config.jobs = Some(threads_from_config(flags.jobs as u32));
config.jobs = flags.jobs.filter(|j| *j > 0);

config.cmd = flags.cmd;
config.incremental = flags.incremental;
config.dry_run = if flags.dry_run { DryRun::UserSelected } else { DryRun::Disabled };
Expand Down Expand Up @@ -1511,8 +1513,19 @@ impl Config {
metrics: _,
android_ndk,
optimized_compiler_builtins,
jobs,
} = toml.build.unwrap_or_default();

if config.jobs.is_none() {
config.jobs = match jobs {
Some(jobs) if jobs > 0 => Some(jobs),
_ => Some(
std::thread::available_parallelism().map_or(1, std::num::NonZeroUsize::get)
as u32,
),
};
}

if let Some(file_build) = build {
config.build = TargetSelection::from_user(&file_build);
};
Expand Down
3 changes: 1 addition & 2 deletions src/bootstrap/src/core/config/flags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,10 @@ pub struct Flags {
short,
long,
value_hint = clap::ValueHint::Other,
default_value_t = std::thread::available_parallelism().map_or(1, std::num::NonZeroUsize::get),
value_name = "JOBS"
)]
/// number of jobs to run in parallel
pub jobs: usize,
pub jobs: Option<u32>,
// This overrides the deny-warnings configuration option,
// which passes -Dwarnings to the compiler invocations.
#[arg(global = true, long)]
Expand Down
59 changes: 59 additions & 0 deletions src/bootstrap/src/core/config/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ runner = "x86_64-runner"
Some(["cargo".to_string()].into_iter().collect()),
"setting list value"
);
assert_eq!(config.jobs, Some(1));
assert_eq!(
config.llvm_build_config,
[("foo".to_string(), "bar".to_string())].into_iter().collect(),
Expand Down Expand Up @@ -352,3 +353,61 @@ fn parse_rust_std_features_empty() {
fn parse_rust_std_features_invalid() {
parse("rust.std-features = \"backtrace\"");
}

#[test]
fn parse_jobs() {
assert_eq!(parse("build.jobs = 1").jobs, Some(1));
}

#[test]
fn jobs_precedence() {
// `--jobs` should take precedence over using `--set build.jobs`.

let config = Config::parse_inner(
Flags::parse(&[
"check".to_owned(),
"--config=/does/not/exist".to_owned(),
"--jobs=67890".to_owned(),
"--set=build.jobs=12345".to_owned(),
]),
|&_| toml::from_str(""),
);
assert_eq!(config.jobs, Some(67890));

// `--set build.jobs` should take precedence over `config.toml`.
let config = Config::parse_inner(
Flags::parse(&[
"check".to_owned(),
"--config=/does/not/exist".to_owned(),
"--set=build.jobs=12345".to_owned(),
]),
|&_| {
toml::from_str(
r#"
[build]
jobs = 67890
"#,
)
},
);
assert_eq!(config.jobs, Some(67890));

// `--jobs` > `--set build.jobs` > `config.toml`
let config = Config::parse_inner(
Flags::parse(&[
"check".to_owned(),
"--jobs=123".to_owned(),
"--config=/does/not/exist".to_owned(),
"--set=build.jobs=456".to_owned(),
]),
|&_| {
toml::from_str(
r#"
[build]
jobs = 789
"#,
)
},
);
assert_eq!(config.jobs, Some(123));
}
5 changes: 5 additions & 0 deletions src/bootstrap/src/utils/change_tracker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -275,4 +275,9 @@ pub const CONFIG_CHANGE_HISTORY: &[ChangeInfo] = &[
severity: ChangeSeverity::Info,
summary: "New option `./x setup editor` added, replacing `./x setup vscode` and adding support for vim, emacs and helix.",
},
ChangeInfo {
change_id: 131838,
severity: ChangeSeverity::Info,
summary: "Allow setting `--jobs` in config.toml with `build.jobs`.",
},
];

0 comments on commit 4adaf51

Please sign in to comment.