Auto merge of #152721 - ehuss:beta-revert-target-spec, r=jackh726

[beta] Revert destabilise target-spec-json

This reverts https://github.com/rust-lang/rust/pull/150151 in order to deal with https://github.com/rust-lang/rust/issues/151729 where the destabilization caused a problem with building rustc itself with JSON target specs. There's a fix at https://github.com/rust-lang/rust/pull/152677, but we would prefer to not backport that, and instead give ourselves more time to work out the kinks. Also, the destabilization was incomplete, and the rest of the changes are in 1.95 (https://github.com/rust-lang/rust/pull/151534 and https://github.com/rust-lang/cargo/pull/16557), so it would be nice to keep all the changes together in one release.

This reverts commit a89683dd95, reversing changes made to 2f1bd3f378.
This commit is contained in:
bors 2026-02-18 17:12:50 +00:00
commit 172dc09412
7 changed files with 8 additions and 38 deletions

View file

@ -1129,10 +1129,9 @@ fn get_backend_from_raw_matches(
let backend_name = debug_flags let backend_name = debug_flags
.iter() .iter()
.find_map(|x| x.strip_prefix("codegen-backend=").or(x.strip_prefix("codegen_backend="))); .find_map(|x| x.strip_prefix("codegen-backend=").or(x.strip_prefix("codegen_backend=")));
let unstable_options = debug_flags.iter().find(|x| *x == "unstable-options").is_some();
let target = parse_target_triple(early_dcx, matches); let target = parse_target_triple(early_dcx, matches);
let sysroot = Sysroot::new(matches.opt_str("sysroot").map(PathBuf::from)); let sysroot = Sysroot::new(matches.opt_str("sysroot").map(PathBuf::from));
let target = config::build_target_config(early_dcx, &target, sysroot.path(), unstable_options); let target = config::build_target_config(early_dcx, &target, sysroot.path());
get_codegen_backend(early_dcx, &sysroot, backend_name, &target) get_codegen_backend(early_dcx, &sysroot, backend_name, &target)
} }

View file

@ -435,7 +435,6 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
&early_dcx, &early_dcx,
&config.opts.target_triple, &config.opts.target_triple,
config.opts.sysroot.path(), config.opts.sysroot.path(),
config.opts.unstable_opts.unstable_options,
); );
let file_loader = config.file_loader.unwrap_or_else(|| Box::new(RealFileLoader)); let file_loader = config.file_loader.unwrap_or_else(|| Box::new(RealFileLoader));
let path_mapping = config.opts.file_path_mapping(); let path_mapping = config.opts.file_path_mapping();

View file

@ -46,7 +46,6 @@ where
&early_dcx, &early_dcx,
&sessopts.target_triple, &sessopts.target_triple,
sessopts.sysroot.path(), sessopts.sysroot.path(),
sessopts.unstable_opts.unstable_options,
); );
let hash_kind = sessopts.unstable_opts.src_hash_algorithm(&target); let hash_kind = sessopts.unstable_opts.src_hash_algorithm(&target);
let checksum_hash_kind = sessopts.unstable_opts.checksum_hash_algorithm(); let checksum_hash_kind = sessopts.unstable_opts.checksum_hash_algorithm();

View file

@ -1589,9 +1589,8 @@ pub fn build_target_config(
early_dcx: &EarlyDiagCtxt, early_dcx: &EarlyDiagCtxt,
target: &TargetTuple, target: &TargetTuple,
sysroot: &Path, sysroot: &Path,
unstable_options: bool,
) -> Target { ) -> Target {
match Target::search(target, sysroot, unstable_options) { match Target::search(target, sysroot) {
Ok((target, warnings)) => { Ok((target, warnings)) => {
for warning in warnings.warning_messages() { for warning in warnings.warning_messages() {
early_dcx.early_warn(warning) early_dcx.early_warn(warning)

View file

@ -1002,11 +1002,8 @@ pub fn build_session(
} }
let host_triple = TargetTuple::from_tuple(config::host_tuple()); let host_triple = TargetTuple::from_tuple(config::host_tuple());
let (host, target_warnings) = let (host, target_warnings) = Target::search(&host_triple, sopts.sysroot.path())
Target::search(&host_triple, sopts.sysroot.path(), sopts.unstable_opts.unstable_options) .unwrap_or_else(|e| dcx.handle().fatal(format!("Error loading host specification: {e}")));
.unwrap_or_else(|e| {
dcx.handle().fatal(format!("Error loading host specification: {e}"))
});
for warning in target_warnings.warning_messages() { for warning in target_warnings.warning_messages() {
dcx.handle().warn(warning) dcx.handle().warn(warning)
} }

View file

@ -3296,19 +3296,10 @@ impl Target {
pub fn search( pub fn search(
target_tuple: &TargetTuple, target_tuple: &TargetTuple,
sysroot: &Path, sysroot: &Path,
unstable_options: bool,
) -> Result<(Target, TargetWarnings), String> { ) -> Result<(Target, TargetWarnings), String> {
use std::{env, fs}; use std::{env, fs};
fn load_file( fn load_file(path: &Path) -> Result<(Target, TargetWarnings), String> {
path: &Path,
unstable_options: bool,
) -> Result<(Target, TargetWarnings), String> {
if !unstable_options {
return Err(
"custom targets are unstable and require `-Zunstable-options`".to_string()
);
}
let contents = fs::read_to_string(path).map_err(|e| e.to_string())?; let contents = fs::read_to_string(path).map_err(|e| e.to_string())?;
Target::from_json(&contents) Target::from_json(&contents)
} }
@ -3332,7 +3323,7 @@ impl Target {
for dir in env::split_paths(&target_path) { for dir in env::split_paths(&target_path) {
let p = dir.join(&path); let p = dir.join(&path);
if p.is_file() { if p.is_file() {
return load_file(&p, unstable_options); return load_file(&p);
} }
} }
@ -3345,7 +3336,7 @@ impl Target {
Path::new("target.json"), Path::new("target.json"),
]); ]);
if p.is_file() { if p.is_file() {
return load_file(&p, unstable_options); return load_file(&p);
} }
Err(format!("could not find specification for target {target_tuple:?}")) Err(format!("could not find specification for target {target_tuple:?}"))

View file

@ -15,20 +15,11 @@ fn main() {
.run_fail() .run_fail()
.assert_stderr_contains("error loading target specification"); .assert_stderr_contains("error loading target specification");
rustc() rustc()
.arg("-Zunstable-options")
.input("foo.rs") .input("foo.rs")
.target("my-incomplete-platform.json") .target("my-incomplete-platform.json")
.run_fail() .run_fail()
.assert_stderr_contains("missing field `llvm-target`"); .assert_stderr_contains("missing field `llvm-target`");
let test_platform = rustc()
.input("foo.rs")
.target("my-x86_64-unknown-linux-gnu-platform")
.crate_type("lib")
.emit("asm")
.run_fail()
.assert_stderr_contains("custom targets are unstable and require `-Zunstable-options`");
rustc() rustc()
.arg("-Zunstable-options")
.env("RUST_TARGET_PATH", ".") .env("RUST_TARGET_PATH", ".")
.input("foo.rs") .input("foo.rs")
.target("my-awesome-platform") .target("my-awesome-platform")
@ -36,7 +27,6 @@ fn main() {
.emit("asm") .emit("asm")
.run(); .run();
rustc() rustc()
.arg("-Zunstable-options")
.env("RUST_TARGET_PATH", ".") .env("RUST_TARGET_PATH", ".")
.input("foo.rs") .input("foo.rs")
.target("my-x86_64-unknown-linux-gnu-platform") .target("my-x86_64-unknown-linux-gnu-platform")
@ -62,31 +52,27 @@ fn main() {
.actual_text("test-platform-2", test_platform_2) .actual_text("test-platform-2", test_platform_2)
.run(); .run();
rustc() rustc()
.arg("-Zunstable-options")
.input("foo.rs") .input("foo.rs")
.target("endianness-mismatch") .target("endianness-mismatch")
.run_fail() .run_fail()
.assert_stderr_contains(r#""data-layout" claims architecture is little-endian"#); .assert_stderr_contains(r#""data-layout" claims architecture is little-endian"#);
rustc() rustc()
.arg("-Zunstable-options")
.input("foo.rs") .input("foo.rs")
.target("mismatching-data-layout") .target("mismatching-data-layout")
.crate_type("lib") .crate_type("lib")
.run_fail() .run_fail()
.assert_stderr_contains("data-layout for target"); .assert_stderr_contains("data-layout for target");
rustc() rustc()
.arg("-Zunstable-options")
.input("foo.rs") .input("foo.rs")
.target("require-explicit-cpu") .target("require-explicit-cpu")
.crate_type("lib") .crate_type("lib")
.run_fail() .run_fail()
.assert_stderr_contains("target requires explicitly specifying a cpu"); .assert_stderr_contains("target requires explicitly specifying a cpu");
rustc() rustc()
.arg("-Zunstable-options")
.input("foo.rs") .input("foo.rs")
.target("require-explicit-cpu") .target("require-explicit-cpu")
.crate_type("lib") .crate_type("lib")
.arg("-Ctarget-cpu=generic") .arg("-Ctarget-cpu=generic")
.run(); .run();
rustc().arg("-Zunstable-options").target("require-explicit-cpu").print("target-cpus").run(); rustc().target("require-explicit-cpu").arg("--print=target-cpus").run();
} }