Auto merge of #125579 - Noratrieb:print-host, r=davidtwco

Add `--print host-tuple` to print host target tuple

People often parse `-vV` output to get to the host tuple, which is annoying to do. It's easier to just get it directly.

I called it "host-tuple" instead of "host" because it's clearer that it's just the target name. I'm open to different names, but I think this one is fine.

a quick GitHub search for `'^host` reveals many instances of people doing the parsing, for example:

68e0ca57cd/README.md (L369)
0e38473b0c/main.sh (L96)
8a3553b865/README.md (L625)
43f3ec3970/do.sh (L35)

needs a compiler FCP. I could also do an MCP but I think just an FCP here makes the most sense.
This commit is contained in:
bors 2024-11-02 23:04:42 +00:00
commit 8ccb78e0d5
40 changed files with 180 additions and 171 deletions

View File

@ -118,8 +118,8 @@ impl GlobalAsmConfig {
GlobalAsmConfig { GlobalAsmConfig {
assembler: crate::toolchain::get_toolchain_binary(tcx.sess, "as"), assembler: crate::toolchain::get_toolchain_binary(tcx.sess, "as"),
target: match &tcx.sess.opts.target_triple { target: match &tcx.sess.opts.target_triple {
rustc_target::spec::TargetTriple::TargetTriple(triple) => triple.clone(), rustc_target::spec::TargetTuple::TargetTuple(triple) => triple.clone(),
rustc_target::spec::TargetTriple::TargetJson { path_for_rustdoc, .. } => { rustc_target::spec::TargetTuple::TargetJson { path_for_rustdoc, .. } => {
path_for_rustdoc.to_str().unwrap().to_owned() path_for_rustdoc.to_str().unwrap().to_owned()
} }
}, },

View File

@ -146,7 +146,7 @@ impl<'gcc, 'tcx> StaticCodegenMethods for CodegenCx<'gcc, 'tcx> {
// Wasm statics with custom link sections get special treatment as they // Wasm statics with custom link sections get special treatment as they
// go into custom sections of the wasm executable. // go into custom sections of the wasm executable.
if self.tcx.sess.opts.target_triple.triple().starts_with("wasm32") { if self.tcx.sess.opts.target_triple.tuple().starts_with("wasm32") {
if let Some(_section) = attrs.link_section { if let Some(_section) = attrs.link_section {
unimplemented!(); unimplemented!();
} }

View File

@ -946,7 +946,7 @@ fn create_section_with_flags_asm(section_name: &str, section_flags: &str, data:
} }
fn target_is_apple(cgcx: &CodegenContext<LlvmCodegenBackend>) -> bool { fn target_is_apple(cgcx: &CodegenContext<LlvmCodegenBackend>) -> bool {
let triple = cgcx.opts.target_triple.triple(); let triple = cgcx.opts.target_triple.tuple();
triple.contains("-ios") triple.contains("-ios")
|| triple.contains("-darwin") || triple.contains("-darwin")
|| triple.contains("-tvos") || triple.contains("-tvos")
@ -955,7 +955,7 @@ fn target_is_apple(cgcx: &CodegenContext<LlvmCodegenBackend>) -> bool {
} }
fn target_is_aix(cgcx: &CodegenContext<LlvmCodegenBackend>) -> bool { fn target_is_aix(cgcx: &CodegenContext<LlvmCodegenBackend>) -> bool {
cgcx.opts.target_triple.triple().contains("-aix") cgcx.opts.target_triple.tuple().contains("-aix")
} }
pub(crate) fn bitcode_section_name(cgcx: &CodegenContext<LlvmCodegenBackend>) -> &'static CStr { pub(crate) fn bitcode_section_name(cgcx: &CodegenContext<LlvmCodegenBackend>) -> &'static CStr {
@ -1031,7 +1031,7 @@ unsafe fn embed_bitcode(
let is_aix = target_is_aix(cgcx); let is_aix = target_is_aix(cgcx);
let is_apple = target_is_apple(cgcx); let is_apple = target_is_apple(cgcx);
unsafe { unsafe {
if is_apple || is_aix || cgcx.opts.target_triple.triple().starts_with("wasm") { if is_apple || is_aix || cgcx.opts.target_triple.tuple().starts_with("wasm") {
// We don't need custom section flags, create LLVM globals. // We don't need custom section flags, create LLVM globals.
let llconst = common::bytes_in_context(llcx, bitcode); let llconst = common::bytes_in_context(llcx, bitcode);
let llglobal = llvm::LLVMAddGlobal( let llglobal = llvm::LLVMAddGlobal(

View File

@ -997,7 +997,7 @@ fn link_natively(
{ {
let is_vs_installed = windows_registry::find_vs_version().is_ok(); let is_vs_installed = windows_registry::find_vs_version().is_ok();
let has_linker = windows_registry::find_tool( let has_linker = windows_registry::find_tool(
sess.opts.target_triple.triple(), sess.opts.target_triple.tuple(),
"link.exe", "link.exe",
) )
.is_some(); .is_some();
@ -1323,10 +1323,8 @@ fn link_sanitizer_runtime(
} else { } else {
let default_sysroot = let default_sysroot =
filesearch::get_or_default_sysroot().expect("Failed finding sysroot"); filesearch::get_or_default_sysroot().expect("Failed finding sysroot");
let default_tlib = filesearch::make_target_lib_path( let default_tlib =
&default_sysroot, filesearch::make_target_lib_path(&default_sysroot, sess.opts.target_triple.tuple());
sess.opts.target_triple.triple(),
);
default_tlib default_tlib
} }
} }

View File

@ -47,7 +47,7 @@ pub(crate) fn get_linker<'a>(
self_contained: bool, self_contained: bool,
target_cpu: &'a str, target_cpu: &'a str,
) -> Box<dyn Linker + 'a> { ) -> Box<dyn Linker + 'a> {
let msvc_tool = windows_registry::find_tool(sess.opts.target_triple.triple(), "link.exe"); let msvc_tool = windows_registry::find_tool(sess.opts.target_triple.tuple(), "link.exe");
// If our linker looks like a batch script on Windows then to execute this // If our linker looks like a batch script on Windows then to execute this
// we'll need to spawn `cmd` explicitly. This is primarily done to handle // we'll need to spawn `cmd` explicitly. This is primarily done to handle

View File

@ -62,7 +62,7 @@ use rustc_session::{EarlyDiagCtxt, Session, config, filesearch};
use rustc_span::FileName; use rustc_span::FileName;
use rustc_span::source_map::FileLoader; use rustc_span::source_map::FileLoader;
use rustc_target::json::ToJson; use rustc_target::json::ToJson;
use rustc_target::spec::{Target, TargetTriple}; use rustc_target::spec::{Target, TargetTuple};
use time::OffsetDateTime; use time::OffsetDateTime;
use tracing::trace; use tracing::trace;
@ -731,6 +731,7 @@ fn print_crate_info(
targets.sort_unstable(); targets.sort_unstable();
println_info!("{}", targets.join("\n")); println_info!("{}", targets.join("\n"));
} }
HostTuple => println_info!("{}", rustc_session::config::host_tuple()),
Sysroot => println_info!("{}", sess.sysroot.display()), Sysroot => println_info!("{}", sess.sysroot.display()),
TargetLibdir => println_info!("{}", sess.target_tlib_path.dir.display()), TargetLibdir => println_info!("{}", sess.target_tlib_path.dir.display()),
TargetSpec => { TargetSpec => {
@ -739,7 +740,7 @@ fn print_crate_info(
AllTargetSpecs => { AllTargetSpecs => {
let mut targets = BTreeMap::new(); let mut targets = BTreeMap::new();
for name in rustc_target::spec::TARGETS { for name in rustc_target::spec::TARGETS {
let triple = TargetTriple::from_triple(name); let triple = TargetTuple::from_tuple(name);
let target = Target::expect_builtin(&triple); let target = Target::expect_builtin(&triple);
targets.insert(name, target.to_json()); targets.insert(name, target.to_json());
} }
@ -918,7 +919,7 @@ pub fn version_at_macro_invocation(
safe_println!("binary: {binary}"); safe_println!("binary: {binary}");
safe_println!("commit-hash: {commit_hash}"); safe_println!("commit-hash: {commit_hash}");
safe_println!("commit-date: {commit_date}"); safe_println!("commit-date: {commit_date}");
safe_println!("host: {}", config::host_triple()); safe_println!("host: {}", config::host_tuple());
safe_println!("release: {release}"); safe_println!("release: {release}");
let debug_flags = matches.opt_strs("Z"); let debug_flags = matches.opt_strs("Z");
@ -1495,7 +1496,7 @@ fn report_ice(
} }
let version = util::version_str!().unwrap_or("unknown_version"); let version = util::version_str!().unwrap_or("unknown_version");
let triple = config::host_triple(); let tuple = config::host_tuple();
static FIRST_PANIC: AtomicBool = AtomicBool::new(true); static FIRST_PANIC: AtomicBool = AtomicBool::new(true);
@ -1505,7 +1506,7 @@ fn report_ice(
Ok(mut file) => { Ok(mut file) => {
dcx.emit_note(session_diagnostics::IcePath { path: path.clone() }); dcx.emit_note(session_diagnostics::IcePath { path: path.clone() });
if FIRST_PANIC.swap(false, Ordering::SeqCst) { if FIRST_PANIC.swap(false, Ordering::SeqCst) {
let _ = write!(file, "\n\nrustc version: {version}\nplatform: {triple}"); let _ = write!(file, "\n\nrustc version: {version}\nplatform: {tuple}");
} }
Some(file) Some(file)
} }
@ -1518,12 +1519,12 @@ fn report_ice(
.map(PathBuf::from) .map(PathBuf::from)
.map(|env_var| session_diagnostics::IcePathErrorEnv { env_var }), .map(|env_var| session_diagnostics::IcePathErrorEnv { env_var }),
}); });
dcx.emit_note(session_diagnostics::IceVersion { version, triple }); dcx.emit_note(session_diagnostics::IceVersion { version, triple: tuple });
None None
} }
} }
} else { } else {
dcx.emit_note(session_diagnostics::IceVersion { version, triple }); dcx.emit_note(session_diagnostics::IceVersion { version, triple: tuple });
None None
}; };

View File

@ -11,7 +11,7 @@ use rustc_macros::Subdiagnostic;
use rustc_span::Span; use rustc_span::Span;
use rustc_span::edition::Edition; use rustc_span::edition::Edition;
use rustc_span::symbol::{Ident, MacroRulesNormalizedIdent, Symbol}; use rustc_span::symbol::{Ident, MacroRulesNormalizedIdent, Symbol};
use rustc_target::spec::{PanicStrategy, SplitDebuginfo, StackProtector, TargetTriple}; use rustc_target::spec::{PanicStrategy, SplitDebuginfo, StackProtector, TargetTuple};
use rustc_type_ir::{ClosureKind, FloatTy}; use rustc_type_ir::{ClosureKind, FloatTy};
use {rustc_ast as ast, rustc_hir as hir}; use {rustc_ast as ast, rustc_hir as hir};
@ -89,7 +89,7 @@ into_diag_arg_using_display!(
MacroRulesNormalizedIdent, MacroRulesNormalizedIdent,
ParseIntError, ParseIntError,
StackProtector, StackProtector,
&TargetTriple, &TargetTuple,
SplitDebuginfo, SplitDebuginfo,
ExitStatus, ExitStatus,
ErrCode, ErrCode,

View File

@ -493,7 +493,7 @@ fn fatally_break_rust(tcx: TyCtxt<'_>, span: Span) -> ! {
"we would appreciate a joke overview: \ "we would appreciate a joke overview: \
https://github.com/rust-lang/rust/issues/43162#issuecomment-320764675", https://github.com/rust-lang/rust/issues/43162#issuecomment-320764675",
); );
diag.note(format!("rustc {} running on {}", tcx.sess.cfg_version, config::host_triple(),)); diag.note(format!("rustc {} running on {}", tcx.sess.cfg_version, config::host_tuple(),));
if let Some((flags, excluded_cargo_defaults)) = rustc_session::utils::extra_compiler_flags() { if let Some((flags, excluded_cargo_defaults)) = rustc_session::utils::extra_compiler_flags() {
diag.note(format!("compiler flags: {}", flags.join(" "))); diag.note(format!("compiler flags: {}", flags.join(" ")));
if excluded_cargo_defaults { if excluded_cargo_defaults {

View File

@ -11,7 +11,7 @@ use rustc_data_structures::sync;
use rustc_metadata::{DylibError, load_symbol_from_dylib}; use rustc_metadata::{DylibError, load_symbol_from_dylib};
use rustc_middle::ty::CurrentGcx; use rustc_middle::ty::CurrentGcx;
use rustc_parse::validate_attr; use rustc_parse::validate_attr;
use rustc_session::config::{Cfg, OutFileName, OutputFilenames, OutputTypes, host_triple}; use rustc_session::config::{Cfg, OutFileName, OutputFilenames, OutputTypes, host_tuple};
use rustc_session::filesearch::sysroot_candidates; use rustc_session::filesearch::sysroot_candidates;
use rustc_session::lint::{self, BuiltinLintDiag, LintBuffer}; use rustc_session::lint::{self, BuiltinLintDiag, LintBuffer};
use rustc_session::output::{CRATE_TYPES, categorize_crate_type}; use rustc_session::output::{CRATE_TYPES, categorize_crate_type};
@ -310,7 +310,7 @@ fn get_codegen_sysroot(
"cannot load the default codegen backend twice" "cannot load the default codegen backend twice"
); );
let target = host_triple(); let target = host_tuple();
let sysroot_candidates = sysroot_candidates(); let sysroot_candidates = sysroot_candidates();
let sysroot = iter::once(sysroot) let sysroot = iter::once(sysroot)

View File

@ -30,7 +30,7 @@ use rustc_session::search_paths::PathKind;
use rustc_span::edition::Edition; use rustc_span::edition::Edition;
use rustc_span::symbol::{Ident, Symbol, sym}; use rustc_span::symbol::{Ident, Symbol, sym};
use rustc_span::{DUMMY_SP, Span}; use rustc_span::{DUMMY_SP, Span};
use rustc_target::spec::{PanicStrategy, Target, TargetTriple}; use rustc_target::spec::{PanicStrategy, Target, TargetTuple};
use tracing::{debug, info, trace}; use tracing::{debug, info, trace};
use crate::errors; use crate::errors;
@ -506,7 +506,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
locator.reset(); locator.reset();
locator.is_proc_macro = true; locator.is_proc_macro = true;
locator.target = &self.sess.host; locator.target = &self.sess.host;
locator.triple = TargetTriple::from_triple(config::host_triple()); locator.tuple = TargetTuple::from_tuple(config::host_tuple());
locator.filesearch = self.sess.host_filesearch(path_kind); locator.filesearch = self.sess.host_filesearch(path_kind);
let Some(host_result) = self.load(locator)? else { let Some(host_result) = self.load(locator)? else {
@ -635,7 +635,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
// FIXME: why is this condition necessary? It was adding in #33625 but I // FIXME: why is this condition necessary? It was adding in #33625 but I
// don't know why and the original author doesn't remember ... // don't know why and the original author doesn't remember ...
let can_reuse_cratenum = let can_reuse_cratenum =
locator.triple == self.sess.opts.target_triple || locator.is_proc_macro; locator.tuple == self.sess.opts.target_triple || locator.is_proc_macro;
Ok(Some(if can_reuse_cratenum { Ok(Some(if can_reuse_cratenum {
let mut result = LoadResult::Loaded(library); let mut result = LoadResult::Loaded(library);
for (cnum, data) in self.cstore.iter_crate_data() { for (cnum, data) in self.cstore.iter_crate_data() {

View File

@ -5,7 +5,7 @@ use rustc_errors::codes::*;
use rustc_errors::{Diag, DiagCtxtHandle, Diagnostic, EmissionGuarantee, Level}; use rustc_errors::{Diag, DiagCtxtHandle, Diagnostic, EmissionGuarantee, Level};
use rustc_macros::{Diagnostic, Subdiagnostic}; use rustc_macros::{Diagnostic, Subdiagnostic};
use rustc_span::{Span, Symbol, sym}; use rustc_span::{Span, Symbol, sym};
use rustc_target::spec::{PanicStrategy, TargetTriple}; use rustc_target::spec::{PanicStrategy, TargetTuple};
use crate::fluent_generated as fluent; use crate::fluent_generated as fluent;
use crate::locator::CrateFlavor; use crate::locator::CrateFlavor;
@ -630,7 +630,7 @@ pub struct CannotFindCrate {
pub current_crate: String, pub current_crate: String,
pub is_nightly_build: bool, pub is_nightly_build: bool,
pub profiler_runtime: Symbol, pub profiler_runtime: Symbol,
pub locator_triple: TargetTriple, pub locator_triple: TargetTuple,
pub is_ui_testing: bool, pub is_ui_testing: bool,
} }
@ -641,7 +641,7 @@ impl<G: EmissionGuarantee> Diagnostic<'_, G> for CannotFindCrate {
diag.arg("crate_name", self.crate_name); diag.arg("crate_name", self.crate_name);
diag.arg("current_crate", self.current_crate); diag.arg("current_crate", self.current_crate);
diag.arg("add_info", self.add_info); diag.arg("add_info", self.add_info);
diag.arg("locator_triple", self.locator_triple.triple()); diag.arg("locator_triple", self.locator_triple.tuple());
diag.code(E0463); diag.code(E0463);
diag.span(self.span); diag.span(self.span);
if self.crate_name == sym::std || self.crate_name == sym::core { if self.crate_name == sym::std || self.crate_name == sym::core {

View File

@ -231,7 +231,7 @@ use rustc_session::search_paths::PathKind;
use rustc_session::utils::CanonicalizedPath; use rustc_session::utils::CanonicalizedPath;
use rustc_span::Span; use rustc_span::Span;
use rustc_span::symbol::Symbol; use rustc_span::symbol::Symbol;
use rustc_target::spec::{Target, TargetTriple}; use rustc_target::spec::{Target, TargetTuple};
use tracing::{debug, info}; use tracing::{debug, info};
use crate::creader::{Library, MetadataLoader}; use crate::creader::{Library, MetadataLoader};
@ -252,7 +252,7 @@ pub(crate) struct CrateLocator<'a> {
pub hash: Option<Svh>, pub hash: Option<Svh>,
extra_filename: Option<&'a str>, extra_filename: Option<&'a str>,
pub target: &'a Target, pub target: &'a Target,
pub triple: TargetTriple, pub tuple: TargetTuple,
pub filesearch: FileSearch<'a>, pub filesearch: FileSearch<'a>,
pub is_proc_macro: bool, pub is_proc_macro: bool,
@ -338,7 +338,7 @@ impl<'a> CrateLocator<'a> {
hash, hash,
extra_filename, extra_filename,
target: &sess.target, target: &sess.target,
triple: sess.opts.target_triple.clone(), tuple: sess.opts.target_triple.clone(),
filesearch: sess.target_filesearch(path_kind), filesearch: sess.target_filesearch(path_kind),
is_proc_macro: false, is_proc_macro: false,
crate_rejections: CrateRejections::default(), crate_rejections: CrateRejections::default(),
@ -677,8 +677,8 @@ impl<'a> CrateLocator<'a> {
return None; return None;
} }
if header.triple != self.triple { if header.triple != self.tuple {
info!("Rejecting via crate triple: expected {} got {}", self.triple, header.triple); info!("Rejecting via crate triple: expected {} got {}", self.tuple, header.triple);
self.crate_rejections.via_triple.push(CrateMismatch { self.crate_rejections.via_triple.push(CrateMismatch {
path: libpath.to_path_buf(), path: libpath.to_path_buf(),
got: header.triple.to_string(), got: header.triple.to_string(),
@ -766,7 +766,7 @@ impl<'a> CrateLocator<'a> {
CrateError::LocatorCombined(Box::new(CombinedLocatorError { CrateError::LocatorCombined(Box::new(CombinedLocatorError {
crate_name: self.crate_name, crate_name: self.crate_name,
root, root,
triple: self.triple, triple: self.tuple,
dll_prefix: self.target.dll_prefix.to_string(), dll_prefix: self.target.dll_prefix.to_string(),
dll_suffix: self.target.dll_suffix.to_string(), dll_suffix: self.target.dll_suffix.to_string(),
crate_rejections: self.crate_rejections, crate_rejections: self.crate_rejections,
@ -909,7 +909,7 @@ struct CrateRejections {
pub(crate) struct CombinedLocatorError { pub(crate) struct CombinedLocatorError {
crate_name: Symbol, crate_name: Symbol,
root: Option<CratePaths>, root: Option<CratePaths>,
triple: TargetTriple, triple: TargetTuple,
dll_prefix: String, dll_prefix: String,
dll_suffix: String, dll_suffix: String,
crate_rejections: CrateRejections, crate_rejections: CrateRejections,
@ -1034,7 +1034,7 @@ impl CrateError {
dcx.emit_err(errors::NoCrateWithTriple { dcx.emit_err(errors::NoCrateWithTriple {
span, span,
crate_name, crate_name,
locator_triple: locator.triple.triple(), locator_triple: locator.triple.tuple(),
add_info, add_info,
found_crates, found_crates,
}); });

View File

@ -770,7 +770,7 @@ impl MetadataBlob {
root.stable_crate_id root.stable_crate_id
)?; )?;
writeln!(out, "proc_macro {:?}", root.proc_macro_data.is_some())?; writeln!(out, "proc_macro {:?}", root.proc_macro_data.is_some())?;
writeln!(out, "triple {}", root.header.triple.triple())?; writeln!(out, "triple {}", root.header.triple.tuple())?;
writeln!(out, "edition {}", root.edition)?; writeln!(out, "edition {}", root.edition)?;
writeln!(out, "symbol_mangling_version {:?}", root.symbol_mangling_version)?; writeln!(out, "symbol_mangling_version {:?}", root.symbol_mangling_version)?;
writeln!( writeln!(

View File

@ -38,7 +38,7 @@ use rustc_span::edition::Edition;
use rustc_span::hygiene::{ExpnIndex, MacroKind, SyntaxContextData}; use rustc_span::hygiene::{ExpnIndex, MacroKind, SyntaxContextData};
use rustc_span::symbol::{Ident, Symbol}; use rustc_span::symbol::{Ident, Symbol};
use rustc_span::{self, ExpnData, ExpnHash, ExpnId, Span}; use rustc_span::{self, ExpnData, ExpnHash, ExpnId, Span};
use rustc_target::spec::{PanicStrategy, TargetTriple}; use rustc_target::spec::{PanicStrategy, TargetTuple};
use table::TableBuilder; use table::TableBuilder;
use {rustc_ast as ast, rustc_attr as attr, rustc_hir as hir}; use {rustc_ast as ast, rustc_attr as attr, rustc_hir as hir};
@ -213,7 +213,7 @@ pub(crate) struct ProcMacroData {
/// If you do modify this struct, also bump the [`METADATA_VERSION`] constant. /// If you do modify this struct, also bump the [`METADATA_VERSION`] constant.
#[derive(MetadataEncodable, MetadataDecodable)] #[derive(MetadataEncodable, MetadataDecodable)]
pub(crate) struct CrateHeader { pub(crate) struct CrateHeader {
pub(crate) triple: TargetTriple, pub(crate) triple: TargetTuple,
pub(crate) hash: Svh, pub(crate) hash: Svh,
pub(crate) name: Symbol, pub(crate) name: Symbol,
/// Whether this is the header for a proc-macro crate. /// Whether this is the header for a proc-macro crate.

View File

@ -26,7 +26,7 @@ use rustc_span::{
FileName, FileNameDisplayPreference, RealFileName, SourceFileHashAlgorithm, Symbol, sym, FileName, FileNameDisplayPreference, RealFileName, SourceFileHashAlgorithm, Symbol, sym,
}; };
use rustc_target::spec::{ use rustc_target::spec::{
FramePointer, LinkSelfContainedComponents, LinkerFeatures, SplitDebuginfo, Target, TargetTriple, FramePointer, LinkSelfContainedComponents, LinkerFeatures, SplitDebuginfo, Target, TargetTuple,
}; };
use tracing::debug; use tracing::debug;
@ -813,6 +813,7 @@ pub struct PrintRequest {
#[derive(Copy, Clone, PartialEq, Eq, Debug)] #[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum PrintKind { pub enum PrintKind {
FileNames, FileNames,
HostTuple,
Sysroot, Sysroot,
TargetLibdir, TargetLibdir,
CrateName, CrateName,
@ -1116,7 +1117,7 @@ bitflags::bitflags! {
} }
} }
pub fn host_triple() -> &'static str { pub fn host_tuple() -> &'static str {
// Get the host triple out of the build environment. This ensures that our // Get the host triple out of the build environment. This ensures that our
// idea of the host triple is the same as for the set of libraries we've // idea of the host triple is the same as for the set of libraries we've
// actually built. We can't just take LLVM's host triple because they // actually built. We can't just take LLVM's host triple because they
@ -1158,7 +1159,7 @@ impl Default for Options {
output_types: OutputTypes(BTreeMap::new()), output_types: OutputTypes(BTreeMap::new()),
search_paths: vec![], search_paths: vec![],
maybe_sysroot: None, maybe_sysroot: None,
target_triple: TargetTriple::from_triple(host_triple()), target_triple: TargetTuple::from_tuple(host_tuple()),
test: false, test: false,
incremental: None, incremental: None,
untracked_state_hash: Default::default(), untracked_state_hash: Default::default(),
@ -1354,7 +1355,7 @@ pub fn build_target_config(early_dcx: &EarlyDiagCtxt, opts: &Options, sysroot: &
// rust-lang/compiler-team#695. Warn unconditionally on usage to // rust-lang/compiler-team#695. Warn unconditionally on usage to
// raise awareness of the renaming. This code will be deleted in // raise awareness of the renaming. This code will be deleted in
// October 2024. // October 2024.
if opts.target_triple.triple() == "wasm32-wasi" { if opts.target_triple.tuple() == "wasm32-wasi" {
early_dcx.early_warn( early_dcx.early_warn(
"the `wasm32-wasi` target is being renamed to \ "the `wasm32-wasi` target is being renamed to \
`wasm32-wasip1` and the `wasm32-wasi` target will be \ `wasm32-wasip1` and the `wasm32-wasi` target will be \
@ -1945,6 +1946,7 @@ fn collect_print_requests(
("crate-name", PrintKind::CrateName), ("crate-name", PrintKind::CrateName),
("deployment-target", PrintKind::DeploymentTarget), ("deployment-target", PrintKind::DeploymentTarget),
("file-names", PrintKind::FileNames), ("file-names", PrintKind::FileNames),
("host-tuple", PrintKind::HostTuple),
("link-args", PrintKind::LinkArgs), ("link-args", PrintKind::LinkArgs),
("native-static-libs", PrintKind::NativeStaticLibs), ("native-static-libs", PrintKind::NativeStaticLibs),
("relocation-models", PrintKind::RelocationModels), ("relocation-models", PrintKind::RelocationModels),
@ -2030,16 +2032,16 @@ fn collect_print_requests(
prints prints
} }
pub fn parse_target_triple(early_dcx: &EarlyDiagCtxt, matches: &getopts::Matches) -> TargetTriple { pub fn parse_target_triple(early_dcx: &EarlyDiagCtxt, matches: &getopts::Matches) -> TargetTuple {
match matches.opt_str("target") { match matches.opt_str("target") {
Some(target) if target.ends_with(".json") => { Some(target) if target.ends_with(".json") => {
let path = Path::new(&target); let path = Path::new(&target);
TargetTriple::from_path(path).unwrap_or_else(|_| { TargetTuple::from_path(path).unwrap_or_else(|_| {
early_dcx.early_fatal(format!("target file {path:?} does not exist")) early_dcx.early_fatal(format!("target file {path:?} does not exist"))
}) })
} }
Some(target) => TargetTriple::TargetTriple(target), Some(target) => TargetTuple::TargetTuple(target),
_ => TargetTriple::from_triple(host_triple()), _ => TargetTuple::from_tuple(host_tuple()),
} }
} }
@ -3005,7 +3007,7 @@ pub(crate) mod dep_tracking {
use rustc_span::edition::Edition; use rustc_span::edition::Edition;
use rustc_target::spec::{ use rustc_target::spec::{
CodeModel, FramePointer, MergeFunctions, OnBrokenPipe, PanicStrategy, RelocModel, CodeModel, FramePointer, MergeFunctions, OnBrokenPipe, PanicStrategy, RelocModel,
RelroLevel, SanitizerSet, SplitDebuginfo, StackProtector, SymbolVisibility, TargetTriple, RelroLevel, SanitizerSet, SplitDebuginfo, StackProtector, SymbolVisibility, TargetTuple,
TlsModel, WasmCAbi, TlsModel, WasmCAbi,
}; };
@ -3090,7 +3092,7 @@ pub(crate) mod dep_tracking {
SanitizerSet, SanitizerSet,
CFGuard, CFGuard,
CFProtection, CFProtection,
TargetTriple, TargetTuple,
Edition, Edition,
LinkerPluginLto, LinkerPluginLto,
ResolveDocLinks, ResolveDocLinks,

View File

@ -29,7 +29,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexSet};
use rustc_lint_defs::BuiltinLintDiag; use rustc_lint_defs::BuiltinLintDiag;
use rustc_lint_defs::builtin::EXPLICIT_BUILTIN_CFGS_IN_FLAGS; use rustc_lint_defs::builtin::EXPLICIT_BUILTIN_CFGS_IN_FLAGS;
use rustc_span::symbol::{Symbol, sym}; use rustc_span::symbol::{Symbol, sym};
use rustc_target::spec::{PanicStrategy, RelocModel, SanitizerSet, TARGETS, Target, TargetTriple}; use rustc_target::spec::{PanicStrategy, RelocModel, SanitizerSet, TARGETS, Target, TargetTuple};
use crate::Session; use crate::Session;
use crate::config::{CrateType, FmtDebug}; use crate::config::{CrateType, FmtDebug};
@ -417,7 +417,7 @@ impl CheckCfg {
for target in TARGETS for target in TARGETS
.iter() .iter()
.map(|target| Target::expect_builtin(&TargetTriple::from_triple(target))) .map(|target| Target::expect_builtin(&TargetTuple::from_tuple(target)))
.chain(iter::once(current_target.clone())) .chain(iter::once(current_target.clone()))
{ {
values_target_abi.insert(Symbol::intern(&target.options.abi)); values_target_abi.insert(Symbol::intern(&target.options.abi));

View File

@ -9,7 +9,7 @@ use rustc_errors::{
}; };
use rustc_macros::{Diagnostic, Subdiagnostic}; use rustc_macros::{Diagnostic, Subdiagnostic};
use rustc_span::{Span, Symbol}; use rustc_span::{Span, Symbol};
use rustc_target::spec::{SplitDebuginfo, StackProtector, TargetTriple}; use rustc_target::spec::{SplitDebuginfo, StackProtector, TargetTuple};
use crate::config::CrateType; use crate::config::CrateType;
use crate::parse::ParseSess; use crate::parse::ParseSess;
@ -179,13 +179,13 @@ pub(crate) struct EmbedSourceRequiresDebugInfo;
#[diag(session_target_stack_protector_not_supported)] #[diag(session_target_stack_protector_not_supported)]
pub(crate) struct StackProtectorNotSupportedForTarget<'a> { pub(crate) struct StackProtectorNotSupportedForTarget<'a> {
pub(crate) stack_protector: StackProtector, pub(crate) stack_protector: StackProtector,
pub(crate) target_triple: &'a TargetTriple, pub(crate) target_triple: &'a TargetTuple,
} }
#[derive(Diagnostic)] #[derive(Diagnostic)]
#[diag(session_target_small_data_threshold_not_supported)] #[diag(session_target_small_data_threshold_not_supported)]
pub(crate) struct SmallDataThresholdNotSupportedForTarget<'a> { pub(crate) struct SmallDataThresholdNotSupportedForTarget<'a> {
pub(crate) target_triple: &'a TargetTriple, pub(crate) target_triple: &'a TargetTuple,
} }
#[derive(Diagnostic)] #[derive(Diagnostic)]
@ -383,7 +383,7 @@ struct BinaryFloatLiteralNotSupported {
#[diag(session_unsupported_crate_type_for_target)] #[diag(session_unsupported_crate_type_for_target)]
pub(crate) struct UnsupportedCrateTypeForTarget<'a> { pub(crate) struct UnsupportedCrateTypeForTarget<'a> {
pub(crate) crate_type: CrateType, pub(crate) crate_type: CrateType,
pub(crate) target_triple: &'a TargetTriple, pub(crate) target_triple: &'a TargetTuple,
} }
pub fn report_lit_error( pub fn report_lit_error(

View File

@ -152,7 +152,7 @@ fn current_dll_path() -> Result<PathBuf, String> {
} }
pub fn sysroot_candidates() -> SmallVec<[PathBuf; 2]> { pub fn sysroot_candidates() -> SmallVec<[PathBuf; 2]> {
let target = crate::config::host_triple(); let target = crate::config::host_tuple();
let mut sysroot_candidates: SmallVec<[PathBuf; 2]> = let mut sysroot_candidates: SmallVec<[PathBuf; 2]> =
smallvec![get_or_default_sysroot().expect("Failed finding sysroot")]; smallvec![get_or_default_sysroot().expect("Failed finding sysroot")];
let path = current_dll_path().and_then(|s| try_canonicalize(s).map_err(|e| e.to_string())); let path = current_dll_path().and_then(|s| try_canonicalize(s).map_err(|e| e.to_string()));
@ -218,7 +218,7 @@ pub fn get_or_default_sysroot() -> Result<PathBuf, String> {
))?; ))?;
// if `dir` points target's dir, move up to the sysroot // if `dir` points target's dir, move up to the sysroot
let mut sysroot_dir = if dir.ends_with(crate::config::host_triple()) { let mut sysroot_dir = if dir.ends_with(crate::config::host_tuple()) {
dir.parent() // chop off `$target` dir.parent() // chop off `$target`
.and_then(|p| p.parent()) // chop off `rustlib` .and_then(|p| p.parent()) // chop off `rustlib`
.and_then(|p| p.parent()) // chop off `lib` .and_then(|p| p.parent()) // chop off `lib`

View File

@ -14,7 +14,7 @@ use rustc_span::{RealFileName, SourceFileHashAlgorithm};
use rustc_target::spec::{ use rustc_target::spec::{
CodeModel, FramePointer, LinkerFlavorCli, MergeFunctions, OnBrokenPipe, PanicStrategy, CodeModel, FramePointer, LinkerFlavorCli, MergeFunctions, OnBrokenPipe, PanicStrategy,
RelocModel, RelroLevel, SanitizerSet, SplitDebuginfo, StackProtector, SymbolVisibility, RelocModel, RelroLevel, SanitizerSet, SplitDebuginfo, StackProtector, SymbolVisibility,
TargetTriple, TlsModel, WasmCAbi, TargetTuple, TlsModel, WasmCAbi,
}; };
use crate::config::*; use crate::config::*;
@ -146,7 +146,7 @@ top_level_options!(
libs: Vec<NativeLib> [TRACKED], libs: Vec<NativeLib> [TRACKED],
maybe_sysroot: Option<PathBuf> [UNTRACKED], maybe_sysroot: Option<PathBuf> [UNTRACKED],
target_triple: TargetTriple [TRACKED], target_triple: TargetTuple [TRACKED],
/// Effective logical environment used by `env!`/`option_env!` macros /// Effective logical environment used by `env!`/`option_env!` macros
logical_env: FxIndexMap<String, String> [TRACKED], logical_env: FxIndexMap<String, String> [TRACKED],

View File

@ -1,7 +1,7 @@
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use rustc_macros::{Decodable, Encodable, HashStable_Generic}; use rustc_macros::{Decodable, Encodable, HashStable_Generic};
use rustc_target::spec::TargetTriple; use rustc_target::spec::TargetTuple;
use crate::EarlyDiagCtxt; use crate::EarlyDiagCtxt;
use crate::filesearch::make_target_lib_path; use crate::filesearch::make_target_lib_path;
@ -52,7 +52,7 @@ impl PathKind {
impl SearchPath { impl SearchPath {
pub fn from_cli_opt( pub fn from_cli_opt(
sysroot: &Path, sysroot: &Path,
triple: &TargetTriple, triple: &TargetTuple,
early_dcx: &EarlyDiagCtxt, early_dcx: &EarlyDiagCtxt,
path: &str, path: &str,
is_unstable_enabled: bool, is_unstable_enabled: bool,
@ -80,7 +80,7 @@ impl SearchPath {
); );
} }
make_target_lib_path(sysroot, triple.triple()).join("builtin").join(stripped) make_target_lib_path(sysroot, triple.tuple()).join("builtin").join(stripped)
} }
None => PathBuf::from(path), None => PathBuf::from(path),
}; };

View File

@ -32,7 +32,7 @@ use rustc_target::asm::InlineAsmArch;
use rustc_target::spec::{ use rustc_target::spec::{
CodeModel, DebuginfoKind, PanicStrategy, RelocModel, RelroLevel, SanitizerSet, CodeModel, DebuginfoKind, PanicStrategy, RelocModel, RelroLevel, SanitizerSet,
SmallDataThresholdSupport, SplitDebuginfo, StackProtector, SymbolVisibility, Target, SmallDataThresholdSupport, SplitDebuginfo, StackProtector, SymbolVisibility, Target,
TargetTriple, TlsModel, TargetTuple, TlsModel,
}; };
use crate::code_stats::CodeStats; use crate::code_stats::CodeStats;
@ -451,12 +451,12 @@ impl Session {
/// directories are also returned, for example if `--sysroot` is used but tools are missing /// directories are also returned, for example if `--sysroot` is used but tools are missing
/// (#125246): we also add the bin directories to the sysroot where rustc is located. /// (#125246): we also add the bin directories to the sysroot where rustc is located.
pub fn get_tools_search_paths(&self, self_contained: bool) -> Vec<PathBuf> { pub fn get_tools_search_paths(&self, self_contained: bool) -> Vec<PathBuf> {
let bin_path = filesearch::make_target_bin_path(&self.sysroot, config::host_triple()); let bin_path = filesearch::make_target_bin_path(&self.sysroot, config::host_tuple());
let fallback_sysroot_paths = filesearch::sysroot_candidates() let fallback_sysroot_paths = filesearch::sysroot_candidates()
.into_iter() .into_iter()
// Ignore sysroot candidate if it was the same as the sysroot path we just used. // Ignore sysroot candidate if it was the same as the sysroot path we just used.
.filter(|sysroot| *sysroot != self.sysroot) .filter(|sysroot| *sysroot != self.sysroot)
.map(|sysroot| filesearch::make_target_bin_path(&sysroot, config::host_triple())); .map(|sysroot| filesearch::make_target_bin_path(&sysroot, config::host_tuple()));
let search_paths = std::iter::once(bin_path).chain(fallback_sysroot_paths); let search_paths = std::iter::once(bin_path).chain(fallback_sysroot_paths);
if self_contained { if self_contained {
@ -1023,7 +1023,7 @@ pub fn build_session(
let cap_lints_allow = sopts.lint_cap.is_some_and(|cap| cap == lint::Allow); let cap_lints_allow = sopts.lint_cap.is_some_and(|cap| cap == lint::Allow);
let can_emit_warnings = !(warnings_allow || cap_lints_allow); let can_emit_warnings = !(warnings_allow || cap_lints_allow);
let host_triple = TargetTriple::from_triple(config::host_triple()); let host_triple = TargetTuple::from_tuple(config::host_tuple());
let (host, target_warnings) = Target::search(&host_triple, &sysroot).unwrap_or_else(|e| { let (host, target_warnings) = Target::search(&host_triple, &sysroot).unwrap_or_else(|e| {
early_dcx.early_fatal(format!("Error loading host specification: {e}")) early_dcx.early_fatal(format!("Error loading host specification: {e}"))
}); });
@ -1074,8 +1074,8 @@ pub fn build_session(
let mut psess = ParseSess::with_dcx(dcx, source_map); let mut psess = ParseSess::with_dcx(dcx, source_map);
psess.assume_incomplete_release = sopts.unstable_opts.assume_incomplete_release; psess.assume_incomplete_release = sopts.unstable_opts.assume_incomplete_release;
let host_triple = config::host_triple(); let host_triple = config::host_tuple();
let target_triple = sopts.target_triple.triple(); let target_triple = sopts.target_triple.tuple();
let host_tlib_path = Lrc::new(SearchPath::from_sysroot_and_triple(&sysroot, host_triple)); let host_tlib_path = Lrc::new(SearchPath::from_sysroot_and_triple(&sysroot, host_triple));
let target_tlib_path = if host_triple == target_triple { let target_tlib_path = if host_triple == target_triple {
// Use the same `SearchPath` if host and target triple are identical to avoid unnecessary // Use the same `SearchPath` if host and target triple are identical to avoid unnecessary

View File

@ -1,21 +1,21 @@
//! [Flexible target specification.](https://github.com/rust-lang/rfcs/pull/131) //! [Flexible target specification.](https://github.com/rust-lang/rfcs/pull/131)
//! //!
//! Rust targets a wide variety of usecases, and in the interest of flexibility, //! Rust targets a wide variety of usecases, and in the interest of flexibility,
//! allows new target triples to be defined in configuration files. Most users //! allows new target tuples to be defined in configuration files. Most users
//! will not need to care about these, but this is invaluable when porting Rust //! will not need to care about these, but this is invaluable when porting Rust
//! to a new platform, and allows for an unprecedented level of control over how //! to a new platform, and allows for an unprecedented level of control over how
//! the compiler works. //! the compiler works.
//! //!
//! # Using custom targets //! # Using custom targets
//! //!
//! A target triple, as passed via `rustc --target=TRIPLE`, will first be //! A target tuple, as passed via `rustc --target=TUPLE`, will first be
//! compared against the list of built-in targets. This is to ease distributing //! compared against the list of built-in targets. This is to ease distributing
//! rustc (no need for configuration files) and also to hold these built-in //! rustc (no need for configuration files) and also to hold these built-in
//! targets as immutable and sacred. If `TRIPLE` is not one of the built-in //! targets as immutable and sacred. If `TUPLE` is not one of the built-in
//! targets, rustc will check if a file named `TRIPLE` exists. If it does, it //! targets, rustc will check if a file named `TUPLE` exists. If it does, it
//! will be loaded as the target configuration. If the file does not exist, //! will be loaded as the target configuration. If the file does not exist,
//! rustc will search each directory in the environment variable //! rustc will search each directory in the environment variable
//! `RUST_TARGET_PATH` for a file named `TRIPLE.json`. The first one found will //! `RUST_TARGET_PATH` for a file named `TUPLE.json`. The first one found will
//! be loaded. If no file is found in any of those directories, a fatal error //! be loaded. If no file is found in any of those directories, a fatal error
//! will be given. //! will be given.
//! //!
@ -1586,17 +1586,17 @@ impl fmt::Display for StackProtector {
} }
macro_rules! supported_targets { macro_rules! supported_targets {
( $(($triple:literal, $module:ident),)+ ) => { ( $(($tuple:literal, $module:ident),)+ ) => {
mod targets { mod targets {
$(pub(crate) mod $module;)+ $(pub(crate) mod $module;)+
} }
/// List of supported targets /// List of supported targets
pub const TARGETS: &[&str] = &[$($triple),+]; pub const TARGETS: &[&str] = &[$($tuple),+];
fn load_builtin(target: &str) -> Option<Target> { fn load_builtin(target: &str) -> Option<Target> {
let mut t = match target { let mut t = match target {
$( $triple => targets::$module::target(), )+ $( $tuple => targets::$module::target(), )+
_ => return None, _ => return None,
}; };
t.is_builtin = true; t.is_builtin = true;
@ -2005,9 +2005,9 @@ impl TargetWarnings {
/// Every field here must be specified, and has no default value. /// Every field here must be specified, and has no default value.
#[derive(PartialEq, Clone, Debug)] #[derive(PartialEq, Clone, Debug)]
pub struct Target { pub struct Target {
/// Unversioned target triple to pass to LLVM. /// Unversioned target tuple to pass to LLVM.
/// ///
/// Target triples can optionally contain an OS version (notably Apple targets), which rustc /// Target tuples can optionally contain an OS version (notably Apple targets), which rustc
/// cannot know without querying the environment. /// cannot know without querying the environment.
/// ///
/// Use `rustc_codegen_ssa::back::versioned_llvm_target` if you need the full LLVM target. /// Use `rustc_codegen_ssa::back::versioned_llvm_target` if you need the full LLVM target.
@ -3477,28 +3477,28 @@ impl Target {
} }
/// Load a built-in target /// Load a built-in target
pub fn expect_builtin(target_triple: &TargetTriple) -> Target { pub fn expect_builtin(target_tuple: &TargetTuple) -> Target {
match *target_triple { match *target_tuple {
TargetTriple::TargetTriple(ref target_triple) => { TargetTuple::TargetTuple(ref target_tuple) => {
load_builtin(target_triple).expect("built-in target") load_builtin(target_tuple).expect("built-in target")
} }
TargetTriple::TargetJson { .. } => { TargetTuple::TargetJson { .. } => {
panic!("built-in targets doesn't support target-paths") panic!("built-in targets doesn't support target-paths")
} }
} }
} }
/// Search for a JSON file specifying the given target triple. /// Search for a JSON file specifying the given target tuple.
/// ///
/// If none is found in `$RUST_TARGET_PATH`, look for a file called `target.json` inside the /// If none is found in `$RUST_TARGET_PATH`, look for a file called `target.json` inside the
/// sysroot under the target-triple's `rustlib` directory. Note that it could also just be a /// sysroot under the target-tuple's `rustlib` directory. Note that it could also just be a
/// bare filename already, so also check for that. If one of the hardcoded targets we know /// bare filename already, so also check for that. If one of the hardcoded targets we know
/// about, just return it directly. /// about, just return it directly.
/// ///
/// The error string could come from any of the APIs called, including filesystem access and /// The error string could come from any of the APIs called, including filesystem access and
/// JSON decoding. /// JSON decoding.
pub fn search( pub fn search(
target_triple: &TargetTriple, target_tuple: &TargetTuple,
sysroot: &Path, sysroot: &Path,
) -> Result<(Target, TargetWarnings), String> { ) -> Result<(Target, TargetWarnings), String> {
use std::{env, fs}; use std::{env, fs};
@ -3509,16 +3509,16 @@ impl Target {
Target::from_json(obj) Target::from_json(obj)
} }
match *target_triple { match *target_tuple {
TargetTriple::TargetTriple(ref target_triple) => { TargetTuple::TargetTuple(ref target_tuple) => {
// check if triple is in list of built-in targets // check if tuple is in list of built-in targets
if let Some(t) = load_builtin(target_triple) { if let Some(t) = load_builtin(target_tuple) {
return Ok((t, TargetWarnings::empty())); return Ok((t, TargetWarnings::empty()));
} }
// search for a file named `target_triple`.json in RUST_TARGET_PATH // search for a file named `target_tuple`.json in RUST_TARGET_PATH
let path = { let path = {
let mut target = target_triple.to_string(); let mut target = target_tuple.to_string();
target.push_str(".json"); target.push_str(".json");
PathBuf::from(target) PathBuf::from(target)
}; };
@ -3532,9 +3532,9 @@ impl Target {
} }
} }
// Additionally look in the sysroot under `lib/rustlib/<triple>/target.json` // Additionally look in the sysroot under `lib/rustlib/<tuple>/target.json`
// as a fallback. // as a fallback.
let rustlib_path = crate::relative_target_rustlib_path(sysroot, target_triple); let rustlib_path = crate::relative_target_rustlib_path(sysroot, target_tuple);
let p = PathBuf::from_iter([ let p = PathBuf::from_iter([
Path::new(sysroot), Path::new(sysroot),
Path::new(&rustlib_path), Path::new(&rustlib_path),
@ -3544,9 +3544,9 @@ impl Target {
return load_file(&p); return load_file(&p);
} }
Err(format!("Could not find specification for target {target_triple:?}")) Err(format!("Could not find specification for target {target_tuple:?}"))
} }
TargetTriple::TargetJson { ref contents, .. } => { TargetTuple::TargetJson { ref contents, .. } => {
let obj = serde_json::from_str(contents).map_err(|e| e.to_string())?; let obj = serde_json::from_str(contents).map_err(|e| e.to_string())?;
Target::from_json(obj) Target::from_json(obj)
} }
@ -3751,44 +3751,44 @@ impl ToJson for Target {
} }
} }
/// Either a target triple string or a path to a JSON file. /// Either a target tuple string or a path to a JSON file.
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub enum TargetTriple { pub enum TargetTuple {
TargetTriple(String), TargetTuple(String),
TargetJson { TargetJson {
/// Warning: This field may only be used by rustdoc. Using it anywhere else will lead to /// Warning: This field may only be used by rustdoc. Using it anywhere else will lead to
/// inconsistencies as it is discarded during serialization. /// inconsistencies as it is discarded during serialization.
path_for_rustdoc: PathBuf, path_for_rustdoc: PathBuf,
triple: String, tuple: String,
contents: String, contents: String,
}, },
} }
// Use a manual implementation to ignore the path field // Use a manual implementation to ignore the path field
impl PartialEq for TargetTriple { impl PartialEq for TargetTuple {
fn eq(&self, other: &Self) -> bool { fn eq(&self, other: &Self) -> bool {
match (self, other) { match (self, other) {
(Self::TargetTriple(l0), Self::TargetTriple(r0)) => l0 == r0, (Self::TargetTuple(l0), Self::TargetTuple(r0)) => l0 == r0,
( (
Self::TargetJson { path_for_rustdoc: _, triple: l_triple, contents: l_contents }, Self::TargetJson { path_for_rustdoc: _, tuple: l_tuple, contents: l_contents },
Self::TargetJson { path_for_rustdoc: _, triple: r_triple, contents: r_contents }, Self::TargetJson { path_for_rustdoc: _, tuple: r_tuple, contents: r_contents },
) => l_triple == r_triple && l_contents == r_contents, ) => l_tuple == r_tuple && l_contents == r_contents,
_ => false, _ => false,
} }
} }
} }
// Use a manual implementation to ignore the path field // Use a manual implementation to ignore the path field
impl Hash for TargetTriple { impl Hash for TargetTuple {
fn hash<H: Hasher>(&self, state: &mut H) -> () { fn hash<H: Hasher>(&self, state: &mut H) -> () {
match self { match self {
TargetTriple::TargetTriple(triple) => { TargetTuple::TargetTuple(tuple) => {
0u8.hash(state); 0u8.hash(state);
triple.hash(state) tuple.hash(state)
} }
TargetTriple::TargetJson { path_for_rustdoc: _, triple, contents } => { TargetTuple::TargetJson { path_for_rustdoc: _, tuple, contents } => {
1u8.hash(state); 1u8.hash(state);
triple.hash(state); tuple.hash(state);
contents.hash(state) contents.hash(state)
} }
} }
@ -3796,45 +3796,45 @@ impl Hash for TargetTriple {
} }
// Use a manual implementation to prevent encoding the target json file path in the crate metadata // Use a manual implementation to prevent encoding the target json file path in the crate metadata
impl<S: Encoder> Encodable<S> for TargetTriple { impl<S: Encoder> Encodable<S> for TargetTuple {
fn encode(&self, s: &mut S) { fn encode(&self, s: &mut S) {
match self { match self {
TargetTriple::TargetTriple(triple) => { TargetTuple::TargetTuple(tuple) => {
s.emit_u8(0); s.emit_u8(0);
s.emit_str(triple); s.emit_str(tuple);
} }
TargetTriple::TargetJson { path_for_rustdoc: _, triple, contents } => { TargetTuple::TargetJson { path_for_rustdoc: _, tuple, contents } => {
s.emit_u8(1); s.emit_u8(1);
s.emit_str(triple); s.emit_str(tuple);
s.emit_str(contents); s.emit_str(contents);
} }
} }
} }
} }
impl<D: Decoder> Decodable<D> for TargetTriple { impl<D: Decoder> Decodable<D> for TargetTuple {
fn decode(d: &mut D) -> Self { fn decode(d: &mut D) -> Self {
match d.read_u8() { match d.read_u8() {
0 => TargetTriple::TargetTriple(d.read_str().to_owned()), 0 => TargetTuple::TargetTuple(d.read_str().to_owned()),
1 => TargetTriple::TargetJson { 1 => TargetTuple::TargetJson {
path_for_rustdoc: PathBuf::new(), path_for_rustdoc: PathBuf::new(),
triple: d.read_str().to_owned(), tuple: d.read_str().to_owned(),
contents: d.read_str().to_owned(), contents: d.read_str().to_owned(),
}, },
_ => { _ => {
panic!("invalid enum variant tag while decoding `TargetTriple`, expected 0..2"); panic!("invalid enum variant tag while decoding `TargetTuple`, expected 0..2");
} }
} }
} }
} }
impl TargetTriple { impl TargetTuple {
/// Creates a target triple from the passed target triple string. /// Creates a target tuple from the passed target tuple string.
pub fn from_triple(triple: &str) -> Self { pub fn from_tuple(tuple: &str) -> Self {
TargetTriple::TargetTriple(triple.into()) TargetTuple::TargetTuple(tuple.into())
} }
/// Creates a target triple from the passed target path. /// Creates a target tuple from the passed target path.
pub fn from_path(path: &Path) -> Result<Self, io::Error> { pub fn from_path(path: &Path) -> Result<Self, io::Error> {
let canonicalized_path = try_canonicalize(path)?; let canonicalized_path = try_canonicalize(path)?;
let contents = std::fs::read_to_string(&canonicalized_path).map_err(|err| { let contents = std::fs::read_to_string(&canonicalized_path).map_err(|err| {
@ -3843,46 +3843,47 @@ impl TargetTriple {
format!("target path {canonicalized_path:?} is not a valid file: {err}"), format!("target path {canonicalized_path:?} is not a valid file: {err}"),
) )
})?; })?;
let triple = canonicalized_path let tuple = canonicalized_path
.file_stem() .file_stem()
.expect("target path must not be empty") .expect("target path must not be empty")
.to_str() .to_str()
.expect("target path must be valid unicode") .expect("target path must be valid unicode")
.to_owned(); .to_owned();
Ok(TargetTriple::TargetJson { path_for_rustdoc: canonicalized_path, triple, contents }) Ok(TargetTuple::TargetJson { path_for_rustdoc: canonicalized_path, tuple, contents })
} }
/// Returns a string triple for this target. /// Returns a string tuple for this target.
/// ///
/// If this target is a path, the file name (without extension) is returned. /// If this target is a path, the file name (without extension) is returned.
pub fn triple(&self) -> &str { pub fn tuple(&self) -> &str {
match *self { match *self {
TargetTriple::TargetTriple(ref triple) TargetTuple::TargetTuple(ref tuple) | TargetTuple::TargetJson { ref tuple, .. } => {
| TargetTriple::TargetJson { ref triple, .. } => triple, tuple
}
} }
} }
/// Returns an extended string triple for this target. /// Returns an extended string tuple for this target.
/// ///
/// If this target is a path, a hash of the path is appended to the triple returned /// If this target is a path, a hash of the path is appended to the tuple returned
/// by `triple()`. /// by `tuple()`.
pub fn debug_triple(&self) -> String { pub fn debug_tuple(&self) -> String {
use std::hash::DefaultHasher; use std::hash::DefaultHasher;
match self { match self {
TargetTriple::TargetTriple(triple) => triple.to_owned(), TargetTuple::TargetTuple(tuple) => tuple.to_owned(),
TargetTriple::TargetJson { path_for_rustdoc: _, triple, contents: content } => { TargetTuple::TargetJson { path_for_rustdoc: _, tuple, contents: content } => {
let mut hasher = DefaultHasher::new(); let mut hasher = DefaultHasher::new();
content.hash(&mut hasher); content.hash(&mut hasher);
let hash = hasher.finish(); let hash = hasher.finish();
format!("{triple}-{hash}") format!("{tuple}-{hash}")
} }
} }
} }
} }
impl fmt::Display for TargetTriple { impl fmt::Display for TargetTuple {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.debug_triple()) write!(f, "{}", self.debug_tuple())
} }
} }

View File

@ -256,7 +256,8 @@ The valid types of print values are:
- `crate-name` — The name of the crate. - `crate-name` — The name of the crate.
- `file-names` — The names of the files created by the `link` emit kind. - `file-names` — The names of the files created by the `link` emit kind.
- `sysroot` — Path to the sysroot. - `sysroot` — Path to the sysroot.
- `target-libdir` - Path to the target libdir. - `target-libdir` — Path to the target libdir.
- `host-tuple` — The target-tuple string of the host compiler (e.g. `x86_64-unknown-linux-gnu`)
- `cfg` — List of cfg values. See [conditional compilation] for more - `cfg` — List of cfg values. See [conditional compilation] for more
information about cfg values. information about cfg values.
- `target-list` — List of known targets. The target may be selected with the - `target-list` — List of known targets. The target may be selected with the
@ -286,7 +287,7 @@ The valid types of print values are:
exact format of this debugging output is not a stable guarantee, other than exact format of this debugging output is not a stable guarantee, other than
that it will include the linker executable and the text of each command-line that it will include the linker executable and the text of each command-line
argument passed to the linker. argument passed to the linker.
- `deployment-target` - The currently selected [deployment target] (or minimum OS version) - `deployment-target` The currently selected [deployment target] (or minimum OS version)
for the selected Apple platform target. This value can be used or passed along to other for the selected Apple platform target. This value can be used or passed along to other
components alongside a Rust build that need this information, such as C compilers. components alongside a Rust build that need this information, such as C compilers.
This returns rustc's minimum supported deployment target if no `*_DEPLOYMENT_TARGET` variable This returns rustc's minimum supported deployment target if no `*_DEPLOYMENT_TARGET` variable

View File

@ -52,7 +52,7 @@ rustdoc 1.17.0 (56124baa9 2017-04-24)
binary: rustdoc binary: rustdoc
commit-hash: hash commit-hash: hash
commit-date: date commit-date: date
host: host-triple host: host-tuple
release: 1.17.0 release: 1.17.0
LLVM version: 3.9 LLVM version: 3.9
``` ```

View File

@ -17,7 +17,7 @@ use rustc_session::search_paths::SearchPath;
use rustc_session::{EarlyDiagCtxt, getopts}; use rustc_session::{EarlyDiagCtxt, getopts};
use rustc_span::FileName; use rustc_span::FileName;
use rustc_span::edition::Edition; use rustc_span::edition::Edition;
use rustc_target::spec::TargetTriple; use rustc_target::spec::TargetTuple;
use crate::core::new_dcx; use crate::core::new_dcx;
use crate::externalfiles::ExternalHtml; use crate::externalfiles::ExternalHtml;
@ -96,7 +96,7 @@ pub(crate) struct Options {
/// Unstable (`-Z`) options strings to pass to the compiler. /// Unstable (`-Z`) options strings to pass to the compiler.
pub(crate) unstable_opts_strs: Vec<String>, pub(crate) unstable_opts_strs: Vec<String>,
/// The target used to compile the crate against. /// The target used to compile the crate against.
pub(crate) target: TargetTriple, pub(crate) target: TargetTuple,
/// Edition used when reading the crate. Defaults to "2015". Also used by default when /// Edition used when reading the crate. Defaults to "2015". Also used by default when
/// compiling doctests from the crate. /// compiling doctests from the crate.
pub(crate) edition: Edition, pub(crate) edition: Edition,

View File

@ -24,7 +24,7 @@ use rustc_session::lint;
use rustc_span::FileName; use rustc_span::FileName;
use rustc_span::edition::Edition; use rustc_span::edition::Edition;
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
use rustc_target::spec::{Target, TargetTriple}; use rustc_target::spec::{Target, TargetTuple};
use tempfile::{Builder as TempFileBuilder, TempDir}; use tempfile::{Builder as TempFileBuilder, TempDir};
use tracing::debug; use tracing::debug;
@ -414,10 +414,10 @@ pub(crate) struct UnusedExterns {
unused_extern_names: Vec<String>, unused_extern_names: Vec<String>,
} }
fn add_exe_suffix(input: String, target: &TargetTriple) -> String { fn add_exe_suffix(input: String, target: &TargetTuple) -> String {
let exe_suffix = match target { let exe_suffix = match target {
TargetTriple::TargetTriple(_) => Target::expect_builtin(target).options.exe_suffix, TargetTuple::TargetTuple(_) => Target::expect_builtin(target).options.exe_suffix,
TargetTriple::TargetJson { contents, .. } => { TargetTuple::TargetJson { contents, .. } => {
Target::from_json(contents.parse().unwrap()).unwrap().0.options.exe_suffix Target::from_json(contents.parse().unwrap()).unwrap().0.options.exe_suffix
} }
}; };
@ -513,8 +513,8 @@ fn run_test(
compiler.arg("--emit=metadata"); compiler.arg("--emit=metadata");
} }
compiler.arg("--target").arg(match &rustdoc_options.target { compiler.arg("--target").arg(match &rustdoc_options.target {
TargetTriple::TargetTriple(s) => s, TargetTuple::TargetTuple(s) => s,
TargetTriple::TargetJson { path_for_rustdoc, .. } => { TargetTuple::TargetJson { path_for_rustdoc, .. } => {
path_for_rustdoc.to_str().expect("target path must be valid unicode") path_for_rustdoc.to_str().expect("target path must be valid unicode")
} }
}); });

View File

@ -761,7 +761,7 @@ pub const UI_COVERAGE_MAP: &str = "cov-map";
/// Absolute path to the directory where all output for all tests in the given /// Absolute path to the directory where all output for all tests in the given
/// `relative_dir` group should reside. Example: /// `relative_dir` group should reside. Example:
/// /path/to/build/host-triple/test/ui/relative/ /// /path/to/build/host-tuple/test/ui/relative/
/// This is created early when tests are collected to avoid race conditions. /// This is created early when tests are collected to avoid race conditions.
pub fn output_relative_path(config: &Config, relative_dir: &Path) -> PathBuf { pub fn output_relative_path(config: &Config, relative_dir: &Path) -> PathBuf {
config.build_base.join(relative_dir) config.build_base.join(relative_dir)
@ -784,7 +784,7 @@ pub fn output_testname_unique(
/// Absolute path to the directory where all output for the given /// Absolute path to the directory where all output for the given
/// test/revision should reside. Example: /// test/revision should reside. Example:
/// /path/to/build/host-triple/test/ui/relative/testname.revision.mode/ /// /path/to/build/host-tuple/test/ui/relative/testname.revision.mode/
pub fn output_base_dir(config: &Config, testpaths: &TestPaths, revision: Option<&str>) -> PathBuf { pub fn output_base_dir(config: &Config, testpaths: &TestPaths, revision: Option<&str>) -> PathBuf {
output_relative_path(config, &testpaths.relative_dir) output_relative_path(config, &testpaths.relative_dir)
.join(output_testname_unique(config, testpaths, revision)) .join(output_testname_unique(config, testpaths, revision))
@ -792,13 +792,13 @@ pub fn output_base_dir(config: &Config, testpaths: &TestPaths, revision: Option<
/// Absolute path to the base filename used as output for the given /// Absolute path to the base filename used as output for the given
/// test/revision. Example: /// test/revision. Example:
/// /path/to/build/host-triple/test/ui/relative/testname.revision.mode/testname /// /path/to/build/host-tuple/test/ui/relative/testname.revision.mode/testname
pub fn output_base_name(config: &Config, testpaths: &TestPaths, revision: Option<&str>) -> PathBuf { pub fn output_base_name(config: &Config, testpaths: &TestPaths, revision: Option<&str>) -> PathBuf {
output_base_dir(config, testpaths, revision).join(testpaths.file.file_stem().unwrap()) output_base_dir(config, testpaths, revision).join(testpaths.file.file_stem().unwrap())
} }
/// Absolute path to the directory to use for incremental compilation. Example: /// Absolute path to the directory to use for incremental compilation. Example:
/// /path/to/build/host-triple/test/ui/relative/testname.mode/testname.inc /// /path/to/build/host-tuple/test/ui/relative/testname.mode/testname.inc
pub fn incremental_dir(config: &Config, testpaths: &TestPaths, revision: Option<&str>) -> PathBuf { pub fn incremental_dir(config: &Config, testpaths: &TestPaths, revision: Option<&str>) -> PathBuf {
output_base_name(config, testpaths, revision).with_extension("inc") output_base_name(config, testpaths, revision).with_extension("inc")
} }

View File

@ -1825,7 +1825,7 @@ impl<'test> TestCx<'test> {
/// Gets the absolute path to the directory where all output for the given /// Gets the absolute path to the directory where all output for the given
/// test/revision should reside. /// test/revision should reside.
/// E.g., `/path/to/build/host-triple/test/ui/relative/testname.revision.mode/`. /// E.g., `/path/to/build/host-tuple/test/ui/relative/testname.revision.mode/`.
fn output_base_dir(&self) -> PathBuf { fn output_base_dir(&self) -> PathBuf {
output_base_dir(self.config, self.testpaths, self.safe_revision()) output_base_dir(self.config, self.testpaths, self.safe_revision())
} }

View File

@ -691,7 +691,7 @@ impl<'tcx> MiriMachine<'tcx> {
clock: Clock::new(config.isolated_op == IsolatedOp::Allow), clock: Clock::new(config.isolated_op == IsolatedOp::Allow),
#[cfg(unix)] #[cfg(unix)]
native_lib: config.native_lib.as_ref().map(|lib_file_path| { native_lib: config.native_lib.as_ref().map(|lib_file_path| {
let target_triple = tcx.sess.opts.target_triple.triple(); let target_triple = tcx.sess.opts.target_triple.tuple();
// Check if host target == the session target. // Check if host target == the session target.
if env!("TARGET") != target_triple { if env!("TARGET") != target_triple {
panic!( panic!(

View File

@ -3,7 +3,7 @@ use derive_builder::Builder;
#[derive(Builder)] #[derive(Builder)]
pub struct Environment { pub struct Environment {
host_triple: String, host_tuple: String,
python_binary: String, python_binary: String,
/// The rustc checkout, where the compiler source is located. /// The rustc checkout, where the compiler source is located.
checkout_dir: Utf8PathBuf, checkout_dir: Utf8PathBuf,
@ -28,8 +28,8 @@ pub struct Environment {
} }
impl Environment { impl Environment {
pub fn host_triple(&self) -> &str { pub fn host_tuple(&self) -> &str {
&self.host_triple &self.host_tuple
} }
pub fn python_binary(&self) -> &str { pub fn python_binary(&self) -> &str {
@ -45,7 +45,7 @@ impl Environment {
} }
pub fn build_artifacts(&self) -> Utf8PathBuf { pub fn build_artifacts(&self) -> Utf8PathBuf {
self.build_root().join("build").join(&self.host_triple) self.build_root().join("build").join(&self.host_tuple)
} }
pub fn artifact_dir(&self) -> Utf8PathBuf { pub fn artifact_dir(&self) -> Utf8PathBuf {

View File

@ -105,9 +105,9 @@ impl Bootstrap {
env.checkout_path().join("x.py").as_str(), env.checkout_path().join("x.py").as_str(),
"build", "build",
"--target", "--target",
&env.host_triple(), &env.host_tuple(),
"--host", "--host",
&env.host_triple(), &env.host_tuple(),
"--stage", "--stage",
"2", "2",
"library/std", "library/std",

View File

@ -127,7 +127,7 @@ fn create_environment(args: Args) -> anyhow::Result<(Environment, Vec<String>)>
shared, shared,
} => { } => {
let env = EnvironmentBuilder::default() let env = EnvironmentBuilder::default()
.host_triple(target_triple) .host_tuple(target_triple)
.python_binary(python) .python_binary(python)
.checkout_dir(checkout_dir.clone()) .checkout_dir(checkout_dir.clone())
.host_llvm_dir(llvm_dir) .host_llvm_dir(llvm_dir)
@ -148,7 +148,7 @@ fn create_environment(args: Args) -> anyhow::Result<(Environment, Vec<String>)>
let checkout_dir = Utf8PathBuf::from("/checkout"); let checkout_dir = Utf8PathBuf::from("/checkout");
let env = EnvironmentBuilder::default() let env = EnvironmentBuilder::default()
.host_triple(target_triple) .host_tuple(target_triple)
.python_binary("python3".to_string()) .python_binary("python3".to_string())
.checkout_dir(checkout_dir.clone()) .checkout_dir(checkout_dir.clone())
.host_llvm_dir(Utf8PathBuf::from("/rustroot")) .host_llvm_dir(Utf8PathBuf::from("/rustroot"))
@ -170,7 +170,7 @@ fn create_environment(args: Args) -> anyhow::Result<(Environment, Vec<String>)>
let checkout_dir: Utf8PathBuf = std::env::current_dir()?.try_into()?; let checkout_dir: Utf8PathBuf = std::env::current_dir()?.try_into()?;
let env = EnvironmentBuilder::default() let env = EnvironmentBuilder::default()
.host_triple(target_triple) .host_tuple(target_triple)
.python_binary("python".to_string()) .python_binary("python".to_string())
.checkout_dir(checkout_dir.clone()) .checkout_dir(checkout_dir.clone())
.host_llvm_dir(checkout_dir.join("citools").join("clang-rust")) .host_llvm_dir(checkout_dir.join("citools").join("clang-rust"))

View File

@ -22,7 +22,7 @@ pub fn run_tests(env: &Environment) -> anyhow::Result<()> {
assert!(extracted_path.is_dir()); assert!(extracted_path.is_dir());
Ok(extracted_path) Ok(extracted_path)
}; };
let host_triple = env.host_triple(); let host_triple = env.host_tuple();
let version = find_dist_version(&dist_dir)?; let version = find_dist_version(&dist_dir)?;
// Extract rustc, libstd, cargo and src archives to create the optimized sysroot // Extract rustc, libstd, cargo and src archives to create the optimized sysroot
@ -87,7 +87,7 @@ llvm-config = "{llvm_config}"
x_py.as_str(), x_py.as_str(),
"test", "test",
"--build", "--build",
env.host_triple(), env.host_tuple(),
"--stage", "--stage",
"0", "0",
"tests/assembly", "tests/assembly",

View File

@ -1,4 +1,4 @@
error: unknown print request: `yyyy` error: unknown print request: `yyyy`
| |
= help: valid print requests are: `all-target-specs-json`, `calling-conventions`, `cfg`, `check-cfg`, `code-models`, `crate-name`, `deployment-target`, `file-names`, `link-args`, `native-static-libs`, `relocation-models`, `split-debuginfo`, `stack-protector-strategies`, `sysroot`, `target-cpus`, `target-features`, `target-libdir`, `target-list`, `target-spec-json`, `tls-models` = help: valid print requests are: `all-target-specs-json`, `calling-conventions`, `cfg`, `check-cfg`, `code-models`, `crate-name`, `deployment-target`, `file-names`, `host-tuple`, `link-args`, `native-static-libs`, `relocation-models`, `split-debuginfo`, `stack-protector-strategies`, `sysroot`, `target-cpus`, `target-features`, `target-libdir`, `target-list`, `target-spec-json`, `tls-models`

View File

@ -0,0 +1,5 @@
//@ only-x86_64-unknown-linux-gnu
//@ compile-flags: --print host-tuple
//@ check-pass
fn main() {}

View File

@ -0,0 +1 @@
x86_64-unknown-linux-gnu