| rust: Fix BOOTSTRAP_CARGO failure during Rust Oe-selftest |
| |
| BOOTSTRAP_CARGO command fails due to codegen flags like `-Cpanic` were |
| prevented from being reflected in the current target configuration which |
| leads to Rust build(rust version 1.70) failure in Oe-selftest. |
| |
| Upstream-Status: Backport [https://github.com/rust-lang/rust/commit/9dffb52738e0b2ccd15af36d4607a709b21e020c] |
| |
| Signed-off-by: Yash Shinde <yashinde145@gmail.com> |
| --- |
| diff --git a/src/tools/compiletest/src/common.rs b/src/tools/compiletest/src/common.rs |
| --- a/src/tools/compiletest/src/common.rs |
| +++ b/src/tools/compiletest/src/common.rs |
| @@ -431,7 +431,6 @@ |
| .unwrap() |
| }; |
| |
| - let mut current = None; |
| let mut all_targets = HashSet::new(); |
| let mut all_archs = HashSet::new(); |
| let mut all_oses = HashSet::new(); |
| @@ -452,14 +451,11 @@ |
| } |
| all_pointer_widths.insert(format!("{}bit", cfg.pointer_width)); |
| |
| - if target == config.target { |
| - current = Some(cfg); |
| - } |
| all_targets.insert(target.into()); |
| } |
| |
| Self { |
| - current: current.expect("current target not found"), |
| + current: Self::get_current_target_config(config), |
| all_targets, |
| all_archs, |
| all_oses, |
| @@ -471,6 +467,89 @@ |
| } |
| } |
| |
| + fn get_current_target_config(config: &Config) -> TargetCfg { |
| + let mut arch = None; |
| + let mut os = None; |
| + let mut env = None; |
| + let mut abi = None; |
| + let mut families = Vec::new(); |
| + let mut pointer_width = None; |
| + let mut endian = None; |
| + let mut panic = None; |
| + |
| + for config in |
| + rustc_output(config, &["--print=cfg", "--target", &config.target]).trim().lines() |
| + { |
| + let (name, value) = config |
| + .split_once("=\"") |
| + .map(|(name, value)| { |
| + ( |
| + name, |
| + Some( |
| + value |
| + .strip_suffix("\"") |
| + .expect("key-value pair should be properly quoted"), |
| + ), |
| + ) |
| + }) |
| + .unwrap_or_else(|| (config, None)); |
| + |
| + match name { |
| + "target_arch" => { |
| + arch = Some(value.expect("target_arch should be a key-value pair").to_string()); |
| + } |
| + "target_os" => { |
| + os = Some(value.expect("target_os sould be a key-value pair").to_string()); |
| + } |
| + "target_env" => { |
| + env = Some(value.expect("target_env should be a key-value pair").to_string()); |
| + } |
| + "target_abi" => { |
| + abi = Some(value.expect("target_abi should be a key-value pair").to_string()); |
| + } |
| + "target_family" => { |
| + families |
| + .push(value.expect("target_family should be a key-value pair").to_string()); |
| + } |
| + "target_pointer_width" => { |
| + pointer_width = Some( |
| + value |
| + .expect("target_pointer_width should be a key-value pair") |
| + .parse::<u32>() |
| + .expect("target_pointer_width should be a valid u32"), |
| + ); |
| + } |
| + "target_endian" => { |
| + endian = Some(match value.expect("target_endian should be a key-value pair") { |
| + "big" => Endian::Big, |
| + "little" => Endian::Little, |
| + _ => panic!("target_endian should be either 'big' or 'little'"), |
| + }); |
| + } |
| + "panic" => { |
| + panic = Some(match value.expect("panic should be a key-value pair") { |
| + "abort" => PanicStrategy::Abort, |
| + "unwind" => PanicStrategy::Unwind, |
| + _ => panic!("panic should be either 'abort' or 'unwind'"), |
| + }); |
| + } |
| + _ => (), |
| + } |
| + } |
| + |
| + TargetCfg { |
| + arch: arch.expect("target configuration should specify target_arch"), |
| + os: os.expect("target configuration should specify target_os"), |
| + env: env.expect("target configuration should specify target_env"), |
| + abi: abi.expect("target configuration should specify target_abi"), |
| + families, |
| + pointer_width: pointer_width |
| + .expect("target configuration should specify target_pointer_width"), |
| + endian: endian.expect("target configuration should specify target_endian"), |
| + panic: panic.expect("target configuration should specify panic"), |
| + } |
| + } |
| + |
| // #[cfg(bootstrap)] |
| // Needed only for one cycle, remove during the bootstrap bump. |
| fn collect_all_slow(config: &Config) -> HashMap<String, TargetCfg> { |