Skip to content

Commit 1ba35e9

Browse files
committed
Auto merge of rust-lang#125515 - weihanglo:target-toml-override, r=onur-ozkan
bootstrap: support target specific config overrides Can't find any previous discussion about not supporting this, so I get it done. The motivation of this is from <rust-lang#125473 (comment)>.
2 parents 48f0011 + d1f0bc7 commit 1ba35e9

File tree

2 files changed

+59
-5
lines changed

2 files changed

+59
-5
lines changed

src/bootstrap/src/core/config/config.rs

+18-5
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ pub enum RustfmtState {
360360
LazyEvaluated,
361361
}
362362

363-
#[derive(Debug, Default, Clone, Copy, PartialEq)]
363+
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
364364
pub enum LlvmLibunwind {
365365
#[default]
366366
No,
@@ -381,7 +381,7 @@ impl FromStr for LlvmLibunwind {
381381
}
382382
}
383383

384-
#[derive(Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
384+
#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
385385
pub enum SplitDebuginfo {
386386
Packed,
387387
Unpacked,
@@ -542,7 +542,7 @@ impl PartialEq<&str> for TargetSelection {
542542
}
543543

544544
/// Per-target configuration stored in the global configuration structure.
545-
#[derive(Default, Clone)]
545+
#[derive(Debug, Default, Clone, PartialEq, Eq)]
546546
pub struct Target {
547547
/// Some(path to llvm-config) if using an external LLVM.
548548
pub llvm_config: Option<PathBuf>,
@@ -644,7 +644,20 @@ impl Merge for TomlConfig {
644644
do_merge(&mut self.llvm, llvm, replace);
645645
do_merge(&mut self.rust, rust, replace);
646646
do_merge(&mut self.dist, dist, replace);
647-
assert!(target.is_none(), "merging target-specific config is not currently supported");
647+
648+
match (self.target.as_mut(), target) {
649+
(_, None) => {}
650+
(None, Some(target)) => self.target = Some(target),
651+
(Some(original_target), Some(new_target)) => {
652+
for (triple, new) in new_target {
653+
if let Some(original) = original_target.get_mut(&triple) {
654+
original.merge(new, replace);
655+
} else {
656+
original_target.insert(triple, new);
657+
}
658+
}
659+
}
660+
}
648661
}
649662
}
650663

@@ -899,7 +912,7 @@ define_config! {
899912
}
900913
}
901914

902-
#[derive(Clone, Debug, Deserialize)]
915+
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
903916
#[serde(untagged)]
904917
pub enum StringOrBool {
905918
String(String),

src/bootstrap/src/core/config/tests.rs

+41
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use super::{flags::Flags, ChangeIdWrapper, Config};
22
use crate::core::build_steps::clippy::get_clippy_rules_in_order;
3+
use crate::core::config::Target;
4+
use crate::core::config::TargetSelection;
35
use crate::core::config::{LldMode, TomlConfig};
46

57
use clap::CommandFactory;
@@ -124,6 +126,10 @@ fn override_toml() {
124126
"--set=build.gdb=\"bar\"".to_owned(),
125127
"--set=build.tools=[\"cargo\"]".to_owned(),
126128
"--set=llvm.build-config={\"foo\" = \"bar\"}".to_owned(),
129+
"--set=target.x86_64-unknown-linux-gnu.runner=bar".to_owned(),
130+
"--set=target.x86_64-unknown-linux-gnu.rpath=false".to_owned(),
131+
"--set=target.aarch64-unknown-linux-gnu.sanitizers=false".to_owned(),
132+
"--set=target.aarch64-apple-darwin.runner=apple".to_owned(),
127133
],
128134
|&_| {
129135
toml::from_str(
@@ -140,6 +146,17 @@ tools = []
140146
[llvm]
141147
download-ci-llvm = false
142148
build-config = {}
149+
150+
[target.aarch64-unknown-linux-gnu]
151+
sanitizers = true
152+
rpath = true
153+
runner = "aarch64-runner"
154+
155+
[target.x86_64-unknown-linux-gnu]
156+
sanitizers = true
157+
rpath = true
158+
runner = "x86_64-runner"
159+
143160
"#,
144161
)
145162
.unwrap()
@@ -163,6 +180,30 @@ build-config = {}
163180
[("foo".to_string(), "bar".to_string())].into_iter().collect(),
164181
"setting dictionary value"
165182
);
183+
184+
let x86_64 = TargetSelection::from_user("x86_64-unknown-linux-gnu");
185+
let x86_64_values = Target {
186+
sanitizers: Some(true),
187+
rpath: Some(false),
188+
runner: Some("bar".into()),
189+
..Default::default()
190+
};
191+
let aarch64 = TargetSelection::from_user("aarch64-unknown-linux-gnu");
192+
let aarch64_values = Target {
193+
sanitizers: Some(false),
194+
rpath: Some(true),
195+
runner: Some("aarch64-runner".into()),
196+
..Default::default()
197+
};
198+
let darwin = TargetSelection::from_user("aarch64-apple-darwin");
199+
let darwin_values = Target { runner: Some("apple".into()), ..Default::default() };
200+
assert_eq!(
201+
config.target_config,
202+
[(x86_64, x86_64_values), (aarch64, aarch64_values), (darwin, darwin_values)]
203+
.into_iter()
204+
.collect(),
205+
"setting dictionary value"
206+
);
166207
}
167208

168209
#[test]

0 commit comments

Comments
 (0)