diff options
| author | Rajveer <rajveer.developer@icloud.com> | 2024-04-06 17:29:50 +0530 |
|---|---|---|
| committer | Rajveer <rajveer.developer@icloud.com> | 2024-04-27 23:50:48 +0530 |
| commit | 09c076810cb7649e5817f316215010d49e78e8d7 (patch) | |
| tree | 5a49d93dda62eb7a680649208b2a7b0b98e90cea | |
| parent | ca7d34efa94afe271accf2bd3d44152a5bd6fff1 (diff) | |
| download | rust-09c076810cb7649e5817f316215010d49e78e8d7.tar.gz rust-09c076810cb7649e5817f316215010d49e78e8d7.zip | |
Bootstrap: Check validity of `--target` and `--host` triples before starting a build
Resolves #122128
| -rw-r--r-- | src/bootstrap/src/core/sanity.rs | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/bootstrap/src/core/sanity.rs b/src/bootstrap/src/core/sanity.rs index e03b1e17908..6ccf29fb6cb 100644 --- a/src/bootstrap/src/core/sanity.rs +++ b/src/bootstrap/src/core/sanity.rs @@ -14,6 +14,7 @@ use std::ffi::{OsStr, OsString}; use std::fs; use std::path::PathBuf; use std::process::Command; +use walkdir::WalkDir; use crate::builder::Kind; use crate::core::config::Target; @@ -177,6 +178,34 @@ than building it. continue; } + // Check if there exists a built-in target in the list of supported targets. + let mut has_target = false; + let target_str = target.to_string(); + + let supported_target_list = + output(Command::new(&build.config.initial_rustc).args(["--print", "target-list"])); + + has_target |= supported_target_list.contains(&target_str); + + // If not, check for a valid file location that may have been specified + // by the user for the custom target. + if let Some(custom_target_path) = env::var_os("RUST_TARGET_PATH") { + let mut target_os_str = OsString::from(&target_str); + target_os_str.push(".json"); + // Recursively traverse through nested directories. + let walker = WalkDir::new(custom_target_path).into_iter(); + for entry in walker.filter_map(|e| e.ok()) { + has_target |= entry.file_name() == target_os_str; + } + } + + if !has_target && !["A", "B", "C"].contains(&target_str.as_str()) { + panic!( + "No such target exists in the target list, + specify a correct location of the JSON specification file for custom targets!" + ); + } + if !build.config.dry_run() { cmd_finder.must_have(build.cc(*target)); if let Some(ar) = build.ar(*target) { |
