diff --git a/0001-Improve-generating-Custom-entry-function.patch b/0001-Improve-generating-Custom-entry-function.patch new file mode 100644 index 0000000000000000000000000000000000000000..77cb30e372671636711eccc229831ffbed8e7f0d --- /dev/null +++ b/0001-Improve-generating-Custom-entry-function.patch @@ -0,0 +1,302 @@ +From 9f0a8620bd7d325e6d42417b08daff3e55cb88f6 Mon Sep 17 00:00:00 2001 +From: Ayush Singh +Date: Sat, 5 Nov 2022 14:36:38 +0530 +Subject: [PATCH] Improve generating Custom entry function + +This commit is aimed at making compiler generated entry functions +(Basically just C `main` right now) more generic so other targets can do +similar things for custom entry. This was initially implemented as part +of https://github.com/rust-lang/rust/pull/100316. + +Currently, this moves the entry function name and Call convention to the +target spec. + +Signed-off-by: Ayush Singh +--- + compiler/rustc_codegen_llvm/src/abi.rs | 40 +++++++++++-------- + compiler/rustc_codegen_llvm/src/context.rs | 10 ++++- + compiler/rustc_codegen_llvm/src/declare.rs | 22 ++++++++++ + .../src/back/symbol_export.rs | 3 +- + compiler/rustc_target/src/abi/call/mod.rs | 28 +++++++++++++ + compiler/rustc_target/src/json.rs | 25 ++++++++++++ + compiler/rustc_target/src/spec/mod.rs | 27 +++++++++++++ + 7 files changed, 135 insertions(+), 20 deletions(-) + +diff --git a/compiler/rustc_codegen_llvm/src/abi.rs b/compiler/rustc_codegen_llvm/src/abi.rs +index d478efc863a9..a6fd2a7de6bd 100644 +--- a/compiler/rustc_codegen_llvm/src/abi.rs ++++ b/compiler/rustc_codegen_llvm/src/abi.rs +@@ -398,23 +398,7 @@ fn ptr_to_llvm_type(&self, cx: &CodegenCx<'ll, 'tcx>) -> &'ll Type { + } + + fn llvm_cconv(&self) -> llvm::CallConv { +- match self.conv { +- Conv::C | Conv::Rust | Conv::CCmseNonSecureCall => llvm::CCallConv, +- Conv::RustCold => llvm::ColdCallConv, +- Conv::AmdGpuKernel => llvm::AmdGpuKernel, +- Conv::AvrInterrupt => llvm::AvrInterrupt, +- Conv::AvrNonBlockingInterrupt => llvm::AvrNonBlockingInterrupt, +- Conv::ArmAapcs => llvm::ArmAapcsCallConv, +- Conv::Msp430Intr => llvm::Msp430Intr, +- Conv::PtxKernel => llvm::PtxKernel, +- Conv::X86Fastcall => llvm::X86FastcallCallConv, +- Conv::X86Intr => llvm::X86_Intr, +- Conv::X86Stdcall => llvm::X86StdcallCallConv, +- Conv::X86ThisCall => llvm::X86_ThisCall, +- Conv::X86VectorCall => llvm::X86_VectorCall, +- Conv::X86_64SysV => llvm::X86_64_SysV, +- Conv::X86_64Win64 => llvm::X86_64_Win64, +- } ++ self.conv.into() + } + + fn apply_attrs_llfn(&self, cx: &CodegenCx<'ll, 'tcx>, llfn: &'ll Value) { +@@ -596,3 +580,25 @@ fn get_param(&mut self, index: usize) -> Self::Value { + llvm::get_param(self.llfn(), index as c_uint) + } + } ++ ++impl From for llvm::CallConv { ++ fn from(conv: Conv) -> Self { ++ match conv { ++ Conv::C | Conv::Rust | Conv::CCmseNonSecureCall => llvm::CCallConv, ++ Conv::RustCold => llvm::ColdCallConv, ++ Conv::AmdGpuKernel => llvm::AmdGpuKernel, ++ Conv::AvrInterrupt => llvm::AvrInterrupt, ++ Conv::AvrNonBlockingInterrupt => llvm::AvrNonBlockingInterrupt, ++ Conv::ArmAapcs => llvm::ArmAapcsCallConv, ++ Conv::Msp430Intr => llvm::Msp430Intr, ++ Conv::PtxKernel => llvm::PtxKernel, ++ Conv::X86Fastcall => llvm::X86FastcallCallConv, ++ Conv::X86Intr => llvm::X86_Intr, ++ Conv::X86Stdcall => llvm::X86StdcallCallConv, ++ Conv::X86ThisCall => llvm::X86_ThisCall, ++ Conv::X86VectorCall => llvm::X86_VectorCall, ++ Conv::X86_64SysV => llvm::X86_64_SysV, ++ Conv::X86_64Win64 => llvm::X86_64_Win64, ++ } ++ } ++} +diff --git a/compiler/rustc_codegen_llvm/src/context.rs b/compiler/rustc_codegen_llvm/src/context.rs +index 79ddfd884dfa..f3ef618fff54 100644 +--- a/compiler/rustc_codegen_llvm/src/context.rs ++++ b/compiler/rustc_codegen_llvm/src/context.rs +@@ -570,8 +570,14 @@ fn apply_target_cpu_attr(&self, llfn: &'ll Value) { + } + + fn declare_c_main(&self, fn_type: Self::Type) -> Option { +- if self.get_declared_value("main").is_none() { +- Some(self.declare_cfn("main", llvm::UnnamedAddr::Global, fn_type)) ++ let entry_name = self.sess().target.entry_name.as_ref(); ++ if self.get_declared_value(entry_name).is_none() { ++ Some(self.declare_entry_fn( ++ entry_name, ++ self.sess().target.entry_abi.into(), ++ llvm::UnnamedAddr::Global, ++ fn_type, ++ )) + } else { + // If the symbol already exists, it is an error: for example, the user wrote + // #[no_mangle] extern "C" fn main(..) {..} +diff --git a/compiler/rustc_codegen_llvm/src/declare.rs b/compiler/rustc_codegen_llvm/src/declare.rs +index f79ef11720df..dc21a02cec44 100644 +--- a/compiler/rustc_codegen_llvm/src/declare.rs ++++ b/compiler/rustc_codegen_llvm/src/declare.rs +@@ -90,6 +90,28 @@ pub fn declare_cfn( + declare_raw_fn(self, name, llvm::CCallConv, unnamed, visibility, fn_type) + } + ++ /// Declare an entry Function ++ /// ++ /// The ABI of this function can change depending on the target (although for now the same as ++ /// `declare_cfn`) ++ /// ++ /// If there’s a value with the same name already declared, the function will ++ /// update the declaration and return existing Value instead. ++ pub fn declare_entry_fn( ++ &self, ++ name: &str, ++ callconv: llvm::CallConv, ++ unnamed: llvm::UnnamedAddr, ++ fn_type: &'ll Type, ++ ) -> &'ll Value { ++ let visibility = if self.tcx.sess.target.default_hidden_visibility { ++ llvm::Visibility::Hidden ++ } else { ++ llvm::Visibility::Default ++ }; ++ declare_raw_fn(self, name, callconv, unnamed, visibility, fn_type) ++ } ++ + /// Declare a Rust function. + /// + /// If there’s a value with the same name already declared, the function will +diff --git a/compiler/rustc_codegen_ssa/src/back/symbol_export.rs b/compiler/rustc_codegen_ssa/src/back/symbol_export.rs +index 752f6b1ef40c..22f534d909ab 100644 +--- a/compiler/rustc_codegen_ssa/src/back/symbol_export.rs ++++ b/compiler/rustc_codegen_ssa/src/back/symbol_export.rs +@@ -180,7 +180,8 @@ fn exported_symbols_provider_local<'tcx>( + .collect(); + + if tcx.entry_fn(()).is_some() { +- let exported_symbol = ExportedSymbol::NoDefId(SymbolName::new(tcx, "main")); ++ let exported_symbol = ++ ExportedSymbol::NoDefId(SymbolName::new(tcx, tcx.sess.target.entry_name.as_ref())); + + symbols.push(( + exported_symbol, +diff --git a/compiler/rustc_target/src/abi/call/mod.rs b/compiler/rustc_target/src/abi/call/mod.rs +index 9e5f0e4d158b..c622bd36b00c 100644 +--- a/compiler/rustc_target/src/abi/call/mod.rs ++++ b/compiler/rustc_target/src/abi/call/mod.rs +@@ -3,6 +3,7 @@ + use crate::spec::{self, HasTargetSpec}; + use rustc_span::Symbol; + use std::fmt; ++use std::str::FromStr; + + mod aarch64; + mod amdgpu; +@@ -735,6 +736,33 @@ pub fn adjust_for_foreign_abi( + } + } + ++impl FromStr for Conv { ++ type Err = String; ++ ++ fn from_str(s: &str) -> Result { ++ match s { ++ "C" => Ok(Conv::C), ++ "Rust" => Ok(Conv::Rust), ++ "RustCold" => Ok(Conv::Rust), ++ "ArmAapcs" => Ok(Conv::ArmAapcs), ++ "CCmseNonSecureCall" => Ok(Conv::CCmseNonSecureCall), ++ "Msp430Intr" => Ok(Conv::Msp430Intr), ++ "PtxKernel" => Ok(Conv::PtxKernel), ++ "X86Fastcall" => Ok(Conv::X86Fastcall), ++ "X86Intr" => Ok(Conv::X86Intr), ++ "X86Stdcall" => Ok(Conv::X86Stdcall), ++ "X86ThisCall" => Ok(Conv::X86ThisCall), ++ "X86VectorCall" => Ok(Conv::X86VectorCall), ++ "X86_64SysV" => Ok(Conv::X86_64SysV), ++ "X86_64Win64" => Ok(Conv::X86_64Win64), ++ "AmdGpuKernel" => Ok(Conv::AmdGpuKernel), ++ "AvrInterrupt" => Ok(Conv::AvrInterrupt), ++ "AvrNonBlockingInterrupt" => Ok(Conv::AvrNonBlockingInterrupt), ++ _ => Err(format!("'{}' is not a valid value for entry function call convetion.", s)), ++ } ++ } ++} ++ + // Some types are used a lot. Make sure they don't unintentionally get bigger. + #[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] + mod size_asserts { +diff --git a/compiler/rustc_target/src/json.rs b/compiler/rustc_target/src/json.rs +index b5d926352122..75bb76a9de08 100644 +--- a/compiler/rustc_target/src/json.rs ++++ b/compiler/rustc_target/src/json.rs +@@ -89,3 +89,28 @@ fn to_json(&self) -> Json { + } + } + } ++ ++impl ToJson for crate::abi::call::Conv { ++ fn to_json(&self) -> Json { ++ let s = match self { ++ Self::C => "C", ++ Self::Rust => "Rust", ++ Self::RustCold => "RustCold", ++ Self::ArmAapcs => "ArmAapcs", ++ Self::CCmseNonSecureCall => "CCmseNonSecureCall", ++ Self::Msp430Intr => "Msp430Intr", ++ Self::PtxKernel => "PtxKernel", ++ Self::X86Fastcall => "X86Fastcall", ++ Self::X86Intr => "X86Intr", ++ Self::X86Stdcall => "X86Stdcall", ++ Self::X86ThisCall => "X86ThisCall", ++ Self::X86VectorCall => "X86VectorCall", ++ Self::X86_64SysV => "X86_64SysV", ++ Self::X86_64Win64 => "X86_64Win64", ++ Self::AmdGpuKernel => "AmdGpuKernel", ++ Self::AvrInterrupt => "AvrInterrupt", ++ Self::AvrNonBlockingInterrupt => "AvrNonBlockingInterrupt", ++ }; ++ Json::String(s.to_owned()) ++ } ++} +diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs +index 72b088d663b1..617de46a55aa 100644 +--- a/compiler/rustc_target/src/spec/mod.rs ++++ b/compiler/rustc_target/src/spec/mod.rs +@@ -34,6 +34,7 @@ + //! the target's settings, though `target-feature` and `link-args` will *add* + //! to the list specified by the target, rather than replace. + ++use crate::abi::call::Conv; + use crate::abi::Endian; + use crate::json::{Json, ToJson}; + use crate::spec::abi::{lookup as lookup_abi, Abi}; +@@ -1668,6 +1669,14 @@ pub struct TargetOptions { + /// Whether the target supports stack canary checks. `true` by default, + /// since this is most common among tier 1 and tier 2 targets. + pub supports_stack_protector: bool, ++ ++ // The name of entry function. ++ // Default value is "main" ++ pub entry_name: StaticCow, ++ ++ // The ABI of entry function. ++ // Default value is `Conv::C`, i.e. C call convention ++ pub entry_abi: Conv, + } + + /// Add arguments for the given flavor and also for its "twin" flavors +@@ -1884,6 +1893,8 @@ fn default() -> TargetOptions { + c_enum_min_bits: 32, + generate_arange_section: true, + supports_stack_protector: true, ++ entry_name: "main".into(), ++ entry_abi: Conv::C, + } + } + } +@@ -2401,6 +2412,18 @@ macro_rules! key { + } + } + } ); ++ ($key_name:ident, Conv) => ( { ++ let name = (stringify!($key_name)).replace("_", "-"); ++ obj.remove(&name).and_then(|o| o.as_str().and_then(|s| { ++ match Conv::from_str(s) { ++ Ok(c) => { ++ base.$key_name = c; ++ Some(Ok(())) ++ } ++ Err(e) => Some(Err(e)) ++ } ++ })).unwrap_or(Ok(())) ++ } ); + } + + if let Some(j) = obj.remove("target-endian") { +@@ -2520,6 +2543,8 @@ macro_rules! key { + key!(c_enum_min_bits, u64); + key!(generate_arange_section, bool); + key!(supports_stack_protector, bool); ++ key!(entry_name); ++ key!(entry_abi, Conv)?; + + if base.is_builtin { + // This can cause unfortunate ICEs later down the line. +@@ -2770,6 +2795,8 @@ macro_rules! target_option_val { + target_option_val!(c_enum_min_bits); + target_option_val!(generate_arange_section); + target_option_val!(supports_stack_protector); ++ target_option_val!(entry_name); ++ target_option_val!(entry_abi); + + if let Some(abi) = self.default_adjusted_cabi { + d.insert("default-adjusted-cabi".into(), Abi::name(abi).to_json()); +-- +2.38.1 + diff --git a/0001-Mangle-main-as-__main_void-on-wasm32-wasi.patch b/0001-Mangle-main-as-__main_void-on-wasm32-wasi.patch new file mode 100644 index 0000000000000000000000000000000000000000..3f087ef9240162fac91f1cde3104085f82b2b77f --- /dev/null +++ b/0001-Mangle-main-as-__main_void-on-wasm32-wasi.patch @@ -0,0 +1,34 @@ +From 98ae83daae67e9e7663b8345eced1de8c667271f Mon Sep 17 00:00:00 2001 +From: Dan Gohman +Date: Thu, 8 Dec 2022 10:35:46 -0800 +Subject: [PATCH] Mangle "main" as "__main_void" on wasm32-wasi + +On wasm, the age-old C trick of having a main function which can either have +no arguments or argc+argv doesn't work, because wasm requires caller and +callee signatures to match. WASI's current strategy is to have compilers +mangle main's name to indicate which signature they're using. Rust uses the +no-argument form, which should be mangled as `__main_void`. + +This is needed on wasm32-wasi as of #105395. +--- + compiler/rustc_target/src/spec/wasm32_wasi.rs | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/compiler/rustc_target/src/spec/wasm32_wasi.rs b/compiler/rustc_target/src/spec/wasm32_wasi.rs +index 6f0bbf0672d4..a0476d542e64 100644 +--- a/compiler/rustc_target/src/spec/wasm32_wasi.rs ++++ b/compiler/rustc_target/src/spec/wasm32_wasi.rs +@@ -104,6 +104,10 @@ pub fn target() -> Target { + // `args::args()` makes the WASI API calls itself. + options.main_needs_argc_argv = false; + ++ // And, WASI mangles the name of "main" to distinguish between different ++ // signatures. ++ options.entry_name = "__main_void".into(); ++ + Target { + llvm_target: "wasm32-wasi".into(), + pointer_width: 32, +-- +2.38.1 + diff --git a/0001-Use-lld-provided-by-system-for-wasm.patch b/0001-Use-lld-provided-by-system-for-wasm.patch new file mode 100644 index 0000000000000000000000000000000000000000..5fcc2451d31a9254b061d692cc9e805d61b3c5aa --- /dev/null +++ b/0001-Use-lld-provided-by-system-for-wasm.patch @@ -0,0 +1,26 @@ +From 37cb177eb53145103ae72b67562884782dde01c3 Mon Sep 17 00:00:00 2001 +From: Ivan Mironov +Date: Sun, 8 Dec 2019 17:23:08 +0500 +Subject: [PATCH] Use lld provided by system for wasm + +--- + compiler/rustc_target/src/spec/wasm_base.rs | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/compiler/rustc_target/src/spec/wasm_base.rs b/compiler/rustc_target/src/spec/wasm_base.rs +index 528a84a8b37c..353d742161d1 100644 +--- a/compiler/rustc_target/src/spec/wasm_base.rs ++++ b/compiler/rustc_target/src/spec/wasm_base.rs +@@ -89,8 +89,7 @@ macro_rules! args { + // arguments just yet + limit_rdylib_exports: false, + +- // we use the LLD shipped with the Rust toolchain by default +- linker: Some("rust-lld".into()), ++ linker: Some("lld".into()), + linker_flavor: LinkerFlavor::WasmLld(Cc::No), + + pre_link_args, +-- +2.38.1 + diff --git a/0001-compiletest-set-the-dylib-path-when-gathering-target.patch b/0001-compiletest-set-the-dylib-path-when-gathering-target.patch new file mode 100644 index 0000000000000000000000000000000000000000..54185a761fd6aa2a9bf0f10209b8e582d2f353cb --- /dev/null +++ b/0001-compiletest-set-the-dylib-path-when-gathering-target.patch @@ -0,0 +1,185 @@ +From 2bdbc5fbf7f84c62f8c7b1007f3b6fd6d3da06f6 Mon Sep 17 00:00:00 2001 +From: Josh Stone +Date: Fri, 14 Oct 2022 16:11:28 -0700 +Subject: [PATCH] compiletest: set the dylib path when gathering target cfg + +If the compiler is built with `rpath = false`, then it won't find its +own libraries unless the library search path is set. We already do that +while running the actual compiletests, but #100260 added another rustc +command for getting the target cfg. + + Check compiletest suite=codegen mode=codegen (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu) + thread 'main' panicked at 'error: failed to get cfg info from "[...]/build/x86_64-unknown-linux-gnu/stage1/bin/rustc" + --- stdout + + --- stderr + [...]/build/x86_64-unknown-linux-gnu/stage1/bin/rustc: error while loading shared libraries: librustc_driver-a2a76dc626cd02d2.so: cannot open shared object file: No such file or directory + ', src/tools/compiletest/src/common.rs:476:13 + +Now the library path is set here as well, so it works without rpath. + +(cherry picked from commit f8a0cc2ca8a644ddb63867526711ba17cb7508c8) +--- + src/tools/compiletest/src/common.rs | 20 +++++++++++--------- + src/tools/compiletest/src/runtest.rs | 27 +++------------------------ + src/tools/compiletest/src/util.rs | 23 +++++++++++++++++++++++ + 3 files changed, 37 insertions(+), 33 deletions(-) + +diff --git a/src/tools/compiletest/src/common.rs b/src/tools/compiletest/src/common.rs +index 0260f6848386..9a432f11f82f 100644 +--- a/src/tools/compiletest/src/common.rs ++++ b/src/tools/compiletest/src/common.rs +@@ -2,11 +2,12 @@ + + use std::ffi::OsString; + use std::fmt; ++use std::iter; + use std::path::{Path, PathBuf}; + use std::process::Command; + use std::str::FromStr; + +-use crate::util::PathBufExt; ++use crate::util::{add_dylib_path, PathBufExt}; + use lazycell::LazyCell; + use test::ColorConfig; + +@@ -385,8 +386,7 @@ pub fn run_enabled(&self) -> bool { + } + + fn target_cfg(&self) -> &TargetCfg { +- self.target_cfg +- .borrow_with(|| TargetCfg::new(&self.rustc_path, &self.target, &self.target_rustcflags)) ++ self.target_cfg.borrow_with(|| TargetCfg::new(self)) + } + + pub fn matches_arch(&self, arch: &str) -> bool { +@@ -457,21 +457,23 @@ pub enum Endian { + } + + impl TargetCfg { +- fn new(rustc_path: &Path, target: &str, target_rustcflags: &Vec) -> TargetCfg { +- let output = match Command::new(rustc_path) ++ fn new(config: &Config) -> TargetCfg { ++ let mut command = Command::new(&config.rustc_path); ++ add_dylib_path(&mut command, iter::once(&config.compile_lib_path)); ++ let output = match command + .arg("--print=cfg") + .arg("--target") +- .arg(target) +- .args(target_rustcflags) ++ .arg(&config.target) ++ .args(&config.target_rustcflags) + .output() + { + Ok(output) => output, +- Err(e) => panic!("error: failed to get cfg info from {:?}: {e}", rustc_path), ++ Err(e) => panic!("error: failed to get cfg info from {:?}: {e}", config.rustc_path), + }; + if !output.status.success() { + panic!( + "error: failed to get cfg info from {:?}\n--- stdout\n{}\n--- stderr\n{}", +- rustc_path, ++ config.rustc_path, + String::from_utf8(output.stdout).unwrap(), + String::from_utf8(output.stderr).unwrap(), + ); +diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs +index 8af5f1da694b..f8903f754f09 100644 +--- a/src/tools/compiletest/src/runtest.rs ++++ b/src/tools/compiletest/src/runtest.rs +@@ -13,7 +13,7 @@ + use crate::header::TestProps; + use crate::json; + use crate::read2::read2_abbreviated; +-use crate::util::{logv, PathBufExt}; ++use crate::util::{add_dylib_path, dylib_env_var, logv, PathBufExt}; + use crate::ColorConfig; + use regex::{Captures, Regex}; + use rustfix::{apply_suggestions, get_suggestions_from_json, Filter}; +@@ -26,6 +26,7 @@ + use std::hash::{Hash, Hasher}; + use std::io::prelude::*; + use std::io::{self, BufReader}; ++use std::iter; + use std::path::{Path, PathBuf}; + use std::process::{Child, Command, ExitStatus, Output, Stdio}; + use std::str; +@@ -72,19 +73,6 @@ fn disable_error_reporting R, R>(f: F) -> R { + f() + } + +-/// The name of the environment variable that holds dynamic library locations. +-pub fn dylib_env_var() -> &'static str { +- if cfg!(windows) { +- "PATH" +- } else if cfg!(target_os = "macos") { +- "DYLD_LIBRARY_PATH" +- } else if cfg!(target_os = "haiku") { +- "LIBRARY_PATH" +- } else { +- "LD_LIBRARY_PATH" +- } +-} +- + /// The platform-specific library name + pub fn get_lib_name(lib: &str, dylib: bool) -> String { + // In some casess (e.g. MUSL), we build a static +@@ -1811,16 +1799,7 @@ fn compose_and_run( + + // Need to be sure to put both the lib_path and the aux path in the dylib + // search path for the child. +- let mut path = +- env::split_paths(&env::var_os(dylib_env_var()).unwrap_or_default()).collect::>(); +- if let Some(p) = aux_path { +- path.insert(0, PathBuf::from(p)) +- } +- path.insert(0, PathBuf::from(lib_path)); +- +- // Add the new dylib search path var +- let newpath = env::join_paths(&path).unwrap(); +- command.env(dylib_env_var(), newpath); ++ add_dylib_path(&mut command, iter::once(lib_path).chain(aux_path)); + + let mut child = disable_error_reporting(|| command.spawn()) + .unwrap_or_else(|_| panic!("failed to exec `{:?}`", &command)); +diff --git a/src/tools/compiletest/src/util.rs b/src/tools/compiletest/src/util.rs +index e5ff0906be8a..ec36f1e4fb72 100644 +--- a/src/tools/compiletest/src/util.rs ++++ b/src/tools/compiletest/src/util.rs +@@ -2,6 +2,7 @@ + use std::env; + use std::ffi::OsStr; + use std::path::PathBuf; ++use std::process::Command; + + use tracing::*; + +@@ -111,3 +112,25 @@ fn with_extra_extension>(&self, extension: S) -> PathBuf { + } + } + } ++ ++/// The name of the environment variable that holds dynamic library locations. ++pub fn dylib_env_var() -> &'static str { ++ if cfg!(windows) { ++ "PATH" ++ } else if cfg!(target_os = "macos") { ++ "DYLD_LIBRARY_PATH" ++ } else if cfg!(target_os = "haiku") { ++ "LIBRARY_PATH" ++ } else { ++ "LD_LIBRARY_PATH" ++ } ++} ++ ++/// Adds a list of lookup paths to `cmd`'s dynamic library lookup path. ++/// If the dylib_path_var is already set for this cmd, the old value will be overwritten! ++pub fn add_dylib_path(cmd: &mut Command, paths: impl Iterator>) { ++ let path_env = env::var_os(dylib_env_var()); ++ let old_paths = path_env.as_ref().map(env::split_paths); ++ let new_paths = paths.map(Into::into).chain(old_paths.into_iter().flatten()); ++ cmd.env(dylib_env_var(), env::join_paths(new_paths).unwrap()); ++} +-- +2.38.1 + diff --git a/cargo-1.65.0-aarch64-unknown-linux-gnu.tar.xz b/cargo-1.65.0-aarch64-unknown-linux-gnu.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..c3eceeb1f636be8c3142bb796221476bd32dfdb3 Binary files /dev/null and b/cargo-1.65.0-aarch64-unknown-linux-gnu.tar.xz differ diff --git a/cargo-1.65.0-x86_64-unknown-linux-gnu.tar.xz b/cargo-1.65.0-x86_64-unknown-linux-gnu.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..3fc608b19e1dd90c581f59a56bea042ebaedb3c0 Binary files /dev/null and b/cargo-1.65.0-x86_64-unknown-linux-gnu.tar.xz differ diff --git a/rust-std-1.65.0-aarch64-unknown-linux-gnu.tar.xz b/rust-std-1.65.0-aarch64-unknown-linux-gnu.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..51aa7ee71fea4b94dfe32f777a2c7a23eba7da3f Binary files /dev/null and b/rust-std-1.65.0-aarch64-unknown-linux-gnu.tar.xz differ diff --git a/rust-std-1.65.0-x86_64-unknown-linux-gnu.tar.xz b/rust-std-1.65.0-x86_64-unknown-linux-gnu.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..b61d3d89eb9a9bc4cd88f9935a00c9b1b62cc7bd Binary files /dev/null and b/rust-std-1.65.0-x86_64-unknown-linux-gnu.tar.xz differ diff --git a/rust.spec b/rust.spec index 8fcf71fd774f749aa55c03070344e3a1d3c863bf..f66d6d27f8c025841092b3313ff79a80dac1eafc 100644 --- a/rust.spec +++ b/rust.spec @@ -1,4 +1,5 @@ -%define anolis_release 2 +%define anolis_release 1 + # Only x86_64 and i686 are Tier 1 platforms at this time. # https://doc.rust-lang.org/nightly/rustc/platform-support.html %global rust_arches x86_64 aarch64 @@ -7,16 +8,18 @@ %{!?channel: %global channel stable} # To bootstrap from scratch, set the channel and date from src/stage0.json -# e.g. 1.10.0 wants rustc: 1.9.0-2016-05-24 +# e.g. 1.59.0 wants rustc: 1.58.0-2022-01-13 # or nightly wants some beta-YYYY-MM-DD -# Note that cargo matches the program version here, not its crate version. -%global bootstrap_rust 1.57.0 -%global bootstrap_cargo 1.57.0 -%global bootstrap_channel 1.57.0 -%global bootstrap_date 2021-12-02 +%global bootstrap_version 1.65.0 +%global bootstrap_channel 1.65.0 +%global bootstrap_date 2022-11-03 # Only the specified arches will use bootstrap binaries. -#global bootstrap_arches %%{rust_arches} +# NOTE: Those binaries used to be uploaded with every new release, but that was +# a waste of lookaside cache space when they're most often unused. +# Run "spectool -g rust.spec" after changing this and then "fedpkg upload" to +# add them to sources. Remember to remove them again after the bootstrap build! +%global bootstrap_arches %%{rust_arches} # Define a space-separated list of targets to ship rust-std-static-$triple for # cross-compilation. The packages are noarch, but they're not fully @@ -28,10 +31,11 @@ # We need CRT files for *-wasi targets, at least as new as the commit in # src/ci/docker/host-x86_64/dist-various-2/build-wasi-toolchain.sh +# (updated per https://github.com/rust-lang/rust/pull/96907) %global wasi_libc_url https://github.com/WebAssembly/wasi-libc -%global wasi_libc_commit ad5133410f66b93a2381db5b542aad5e0964db96 -%global wasi_libc_name wasi-libc-%{wasi_libc_commit} -%global wasi_libc_source %{wasi_libc_url}/archive/%{wasi_libc_commit}/%{wasi_libc_name}.tar.gz +%global wasi_libc_ref wasi-sdk-17 +%global wasi_libc_name wasi-libc-%{wasi_libc_ref} +%global wasi_libc_source %{wasi_libc_url}/archive/%{wasi_libc_ref}/%{wasi_libc_name}.tar.gz %global wasi_libc_dir %{_builddir}/%{wasi_libc_name} # Using llvm-static may be helpful as an opt-in, e.g. to aid LLVM rebases. @@ -39,13 +43,15 @@ # We can also choose to just use Rust's bundled LLVM, in case the system LLVM # is insufficient. Rust currently requires LLVM 12.0+. -%global min_llvm_version 12.0.0 -%global bundled_llvm_version 13.0.0 +%global min_llvm_version 13.0.0 +%global bundled_llvm_version 15.0.2 %bcond_with bundled_llvm -# Requires stable libgit2 1.3 -%global min_libgit2_version 1.3.0 -%global bundled_libgit2_version 1.3.0 +# Requires stable libgit2 1.5, and not the next minor soname change. +# This needs to be consistent with the bindings in vendor/libgit2-sys. +%global min_libgit2_version 1.5.0 +%global next_libgit2_version 1.6.0~ +%global bundled_libgit2_version 1.5.0 %bcond_with bundled_libgit2 # needs libssh2_userauth_publickey_frommemory @@ -57,7 +63,7 @@ %bcond_without lldb Name: rust -Version: 1.59.0 +Version: 1.66.0 Release: %{anolis_release}%{?dist} Summary: The Rust Programming Language License: (ASL 2.0 or MIT) and (BSD and MIT) @@ -70,10 +76,35 @@ ExclusiveArch: %{rust_arches} %else %global rustc_package rustc-%{channel}-src %endif -Source0: https://static.rust-lang.org/dist/%{rustc_package}.tar.gz +Source0: https://static.rust-lang.org/dist/%{rustc_package}.tar.xz Source1: %{wasi_libc_source} # Sources for bootstrap_arches are inserted by lua below +# By default, rust tries to use "rust-lld" as a linker for WebAssembly. +Patch1: 0001-Use-lld-provided-by-system-for-wasm.patch + +# Set a substitute-path in rust-gdb for standard library sources. +Patch2: rustc-1.61.0-rust-gdb-substitute-path.patch + +# https://github.com/rust-lang/rust/pull/103072 +Patch3: 0001-compiletest-set-the-dylib-path-when-gathering-target.patch + +# https://github.com/rust-lang/rust/pull/104001 +Patch4: 0001-Improve-generating-Custom-entry-function.patch + +# https://github.com/rust-lang/rust/pull/105468 +Patch5: 0001-Mangle-main-as-__main_void-on-wasm32-wasi.patch + +### RHEL-specific patches below ### + +# Disable cargo->libgit2->libssh2 on RHEL, as it's not approved for FIPS (rhbz1732949) +Patch100: rustc-1.65.0-disable-libssh2.patch + +# libcurl on RHEL7 doesn't have http2, but since cargo requests it, curl-sys +# will try to build it statically -- instead we turn off the feature. +Patch101: rustc-1.65.0-disable-http2.patch + + # Get the Rust triple for any arch. %{lua: function rust_triple(arch) return arch.."-unknown-linux-gnu" @@ -89,27 +120,31 @@ end} for arch in string.gmatch(rpm.expand("%{bootstrap_arches}"), "%S+") do table.insert(bootstrap_arches, arch) end - local base = rpm.expand("https://static.rust-lang.org/dist/%{bootstrap_date}" - .."/rust-%{bootstrap_channel}") + local base = rpm.expand("https://static.rust-lang.org/dist/%{bootstrap_date}") + local channel = rpm.expand("%{bootstrap_channel}") local target_arch = rpm.expand("%{_target_cpu}") for i, arch in ipairs(bootstrap_arches) do - i = 100 + i - print(string.format("Source%d: %s-%s.tar.xz\n", - i, base, rust_triple(arch))) + i = 1000 + i * 3 + local suffix = channel.."-"..rust_triple(arch) + print(string.format("Source%d: %s/cargo-%s.tar.xz\n", i, base, suffix)) + print(string.format("Source%d: %s/rustc-%s.tar.xz\n", i+1, base, suffix)) + print(string.format("Source%d: %s/rust-std-%s.tar.xz\n", i+2, base, suffix)) if arch == target_arch then - rpm.define("bootstrap_source "..i) + rpm.define("bootstrap_source_cargo "..i) + rpm.define("bootstrap_source_rustc "..i+1) + rpm.define("bootstrap_source_std "..i+2) + rpm.define("bootstrap_suffix "..suffix) end end end} %endif %ifarch %{bootstrap_arches} -%global bootstrap_root rust-%{bootstrap_channel}-%{rust_triple} -%global local_rust_root %{_builddir}/%{bootstrap_root}/usr -Provides: bundled(%{name}-bootstrap) = %{bootstrap_rust} +%global local_rust_root %{_builddir}/rust-%{bootstrap_suffix} +Provides: bundled(%{name}-bootstrap) = %{bootstrap_version} %else -BuildRequires: cargo >= %{bootstrap_cargo} -BuildRequires: (%{name} >= %{bootstrap_rust} with %{name} <= %{version}) +BuildRequires: cargo >= %{bootstrap_version} +BuildRequires: (%{name} >= %{bootstrap_version} with %{name} <= %{version}) %global local_rust_root %{_prefix} %endif @@ -125,7 +160,7 @@ BuildRequires: pkgconfig(openssl) BuildRequires: pkgconfig(zlib) %if %{without bundled_libgit2} -BuildRequires: pkgconfig(libgit2) >= %{min_libgit2_version} +BuildRequires: (pkgconfig(libgit2) >= %{min_libgit2_version} with pkgconfig(libgit2) < %{next_libgit2_version}) %endif %if %{without disabled_libssh2} @@ -160,12 +195,15 @@ BuildRequires: procps-ng # debuginfo-gdb tests need gdb BuildRequires: gdb +# For src/test/run-make/static-pie +BuildRequires: glibc-static + # Virtual provides for folks who attempt "dnf install rustc" Provides: rustc = %{version}-%{release} -Provides: rustc%{?_isa} = %{version}-%{release} +Provides: rustc = %{version}-%{release} # Always require our exact standard library -Requires: %{name}-std-static%{?_isa} = %{version}-%{release} +Requires: %{name}-std-static = %{version}-%{release} # The C compiler is needed at runtime just for linking. Someday rustc might # invoke the linker directly, and then we'll only need binutils. @@ -184,7 +222,6 @@ Requires: /usr/bin/cc # While we don't want to encourage dynamic linking to Rust shared libraries, as # there's no stable ABI, we still need the unallocated metadata (.rustc) to # support custom-derive plugins like #[proc_macro_derive(Foo)]. -# Newer find-debuginfo.sh supports --keep-section, which is preferable. rhbz1465997 %global _find_debuginfo_opts --keep-section .rustc %if %{without bundled_llvm} @@ -201,16 +238,21 @@ Requires: /usr/bin/cc %if %defined mingw_targets BuildRequires: mingw32-filesystem >= 95 BuildRequires: mingw64-filesystem >= 95 +BuildRequires: mingw32-crt +BuildRequires: mingw64-crt BuildRequires: mingw32-gcc BuildRequires: mingw64-gcc +BuildRequires: mingw32-winpthreads-static +BuildRequires: mingw64-winpthreads-static %endif %if %defined wasm_targets BuildRequires: clang +BuildRequires: lld # brp-strip-static-archive breaks the archive index for wasm %global __os_install_post \ %__os_install_post \ -find '%{buildroot}%{rustlibdir}' -type f -path '*/wasm*/lib/*.rlib' -print -exec '%{llvm_root}/bin/llvm-ranlib' '{}' ';' \ +find '%{buildroot}%{rustlibdir}'/wasm*/lib -type f -regex '.*\\.\\(a\\|rlib\\)' -print -exec '%{llvm_root}/bin/llvm-ranlib' '{}' ';' \ %{nil} %endif @@ -224,7 +266,7 @@ This package includes the Rust compiler and documentation generator. %package std-static Summary: Standard library for Rust Requires: %{name} = %{version}-%{release} -Requires: glibc-devel%{?_isa} >= 2.11 +Requires: glibc-devel >= 2.11 %description std-static This package includes the standard libraries for building applications @@ -334,6 +376,12 @@ Summary: Documentation for Rust # Koji will fail the build in rpmdiff if two architectures build a noarch # subpackage differently, so instead we have to keep its arch. +# Cargo no longer builds its own documentation +# https://github.com/rust-lang/cargo/pull/4904 +# We used to keep a shim cargo-doc package, but now that's merged too. +Obsoletes: cargo-doc < 1.65.0~ +Provides: cargo-doc = %{version}-%{release} + %description doc This package includes HTML documentation for the Rust programming language and its standard library. @@ -359,17 +407,6 @@ Cargo is a tool that allows Rust projects to declare their various dependencies and ensure that you'll always get a repeatable build. -%package -n cargo-doc -Summary: Documentation for Cargo -BuildArch: noarch -# Cargo no longer builds its own documentation -# https://github.com/rust-lang/cargo/pull/4904 -Requires: %{name}-doc = %{version}-%{release} - -%description -n cargo-doc -This package includes HTML documentation for Cargo. - - %package -n rustfmt Summary: Tool to find and fix Rust formatting issues Requires: cargo @@ -382,31 +419,29 @@ Provides: rustfmt-preview = %{version}-%{release} A tool for formatting Rust code according to style guidelines. -%package -n rls -Summary: Rust Language Server for IDE integration -%if %with bundled_libgit2 -Provides: bundled(libgit2) = %{bundled_libgit2_version} -%endif -Requires: %{name}-analysis -# /usr/bin/rls is dynamically linked against internal rustc libs -Requires: %{name}%{?_isa} = %{version}-%{release} +%package analyzer +Summary: Rust implementation of the Language Server Protocol +# The standard library sources are needed for most functionality. +Recommends: %{name}-src + +# RLS is no longer available as of Rust 1.65, but we're including the stub +# binary that implements LSP just enough to recommend rust-analyzer. +Obsoletes: rls < 1.65.0~ # The component/package was rls-preview until Rust 1.31. Obsoletes: rls-preview < 1.31.6 -Provides: rls-preview = %{version}-%{release} -%description -n rls -The Rust Language Server provides a server that runs in the background, -providing IDEs, editors, and other tools with information about Rust programs. -It supports functionality such as 'goto definition', symbol search, -reformatting, and code completion, and enables renaming and refactorings. +%description analyzer +rust-analyzer is an implementation of Language Server Protocol for the Rust +programming language. It provides features like completion and goto definition +for many code editors, including VS Code, Emacs and Vim. %package -n clippy Summary: Lints to catch common mistakes and improve your Rust code Requires: cargo # /usr/bin/clippy-driver is dynamically linked against internal rustc libs -Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: %{name} = %{version}-%{release} # The component/package was clippy-preview until Rust 1.31. Obsoletes: clippy-preview <= 0.0.212 @@ -419,6 +454,7 @@ A collection of lints to catch common mistakes and improve your Rust code. %package src Summary: Sources for the Rust standard library BuildArch: noarch +Recommends: %{name}-std-static = %{version}-%{release} %description src This package includes source files for the Rust standard library. It may be @@ -427,7 +463,7 @@ useful as a reference for code completion tools in various editors. %package analysis Summary: Compiler analysis data for the Rust standard library -Requires: %{name}-std-static%{?_isa} = %{version}-%{release} +Recommends: %{name}-std-static = %{version}-%{release} %description analysis This package contains analysis data files produced with rustc's -Zsave-analysis @@ -438,9 +474,13 @@ data to provide information about the Rust standard library. %prep %ifarch %{bootstrap_arches} -%setup -q -n %{bootstrap_root} -T -b %{bootstrap_source} -./install.sh --components=cargo,rustc,rust-std-%{rust_triple} \ - --prefix=%{local_rust_root} --disable-ldconfig +rm -rf %{local_rust_root} +%setup -q -n cargo-%{bootstrap_suffix} -T -b %{bootstrap_source_cargo} +./install.sh --prefix=%{local_rust_root} --disable-ldconfig +%setup -q -n rustc-%{bootstrap_suffix} -T -b %{bootstrap_source_rustc} +./install.sh --prefix=%{local_rust_root} --disable-ldconfig +%setup -q -n rust-std-%{bootstrap_suffix} -T -b %{bootstrap_source_std} +./install.sh --prefix=%{local_rust_root} --disable-ldconfig test -f '%{local_rust_root}/bin/cargo' test -f '%{local_rust_root}/bin/rustc' %endif @@ -451,9 +491,27 @@ test -f '%{local_rust_root}/bin/rustc' %setup -q -n %{rustc_package} +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 + +%if %with disabled_libssh2 +%patch100 -p1 +%endif + +%if %without curl_http2 +%patch101 -p1 +rm -rf vendor/libnghttp2-sys/ +%endif + # Use our explicit python3 first sed -i.try-python -e '/^try python3 /i try "%{__python3}" "$@"' ./configure +# Set a substitute-path in rust-gdb for standard library sources. +sed -i.rust-src -e "s#@BUILDDIR@#$PWD#" ./src/etc/rust-gdb + %if %without bundled_llvm rm -rf src/llvm-project/ mkdir -p src/llvm-project/libunwind/ @@ -461,7 +519,8 @@ mkdir -p src/llvm-project/libunwind/ # Remove other unused vendored libraries rm -rf vendor/curl-sys/curl/ -rm -rf vendor/jemalloc-sys/jemalloc/ +rm -rf vendor/*jemalloc-sys*/jemalloc/ +rm -rf vendor/libmimalloc-sys/c_src/mimalloc/ rm -rf vendor/libssh2-sys/libssh2/ rm -rf vendor/libz-sys/src/zlib/ rm -rf vendor/libz-sys/src/zlib-ng/ @@ -483,7 +542,7 @@ sed -i.lzma -e '/LZMA_API_STATIC/d' src/bootstrap/tool.rs # Static linking to distro LLVM needs to add -lffi # https://github.com/rust-lang/rust/issues/34486 sed -i.ffi -e '$a #[link(name = "ffi")] extern {}' \ - src/librustc_llvm/lib.rs + compiler/rustc_llvm/src/lib.rs %endif # The configure macro will modify some autoconf-related files, which upsets @@ -511,14 +570,6 @@ find -name '*.rs' -type f -perm /111 -exec chmod -v -x '{}' '+' %build %{export_rust_env} -%ifarch %{arm} -# full debuginfo is exhausting memory; just do libstd for now -# https://github.com/rust-lang/rust/issues/45854 -%define enable_debuginfo --debuginfo-level=0 --debuginfo-level-std=2 -%else -%define enable_debuginfo --debuginfo-level=2 -%endif - # Some builders have relatively little memory for their CPU count. # At least 2GB per CPU is a good rule of thumb for building rustc. ncpus=$(/usr/bin/getconf _NPROCESSORS_ONLN) @@ -527,14 +578,6 @@ if [ "$max_cpus" -ge 1 -a "$max_cpus" -lt "$ncpus" ]; then ncpus="$max_cpus" fi -%define target_config %{shrink: - --set target.%{rust_triple}.linker=%{__cc} - --set target.%{rust_triple}.cc=%{__cc} - --set target.%{rust_triple}.cxx=%{__cxx} - --set target.%{rust_triple}.ar=%{__ar} - --set target.%{rust_triple}.ranlib=%{__ranlib} -} - %if %defined mingw_targets %{lua: do local cfg = "" @@ -543,20 +586,21 @@ fi triple = triple, mingw = string.sub(triple, 1, 4) == "i686" and "mingw32" or "mingw64", } - local s = string.gsub([[%{shrink: + local s = string.gsub([[ --set target.{{triple}}.linker=%{{{mingw}}_cc} --set target.{{triple}}.cc=%{{{mingw}}_cc} --set target.{{triple}}.ar=%{{{mingw}}_ar} --set target.{{triple}}.ranlib=%{{{mingw}}_ranlib} - }]], "{{(%w+)}}", subs) + ]], "{{(%w+)}}", subs) cfg = cfg .. " " .. s end + cfg = string.gsub(cfg, "%s+", " ") rpm.define("mingw_target_config " .. cfg) end} %endif %if %defined wasm_targets -%make_build --quiet -C %{wasi_libc_dir} +%make_build --quiet -C %{wasi_libc_dir} CC=clang AR=llvm-ar NM=llvm-nm %{lua: do local wasi_root = rpm.expand("%{wasi_libc_dir}") .. "/sysroot" local cfg = "" @@ -572,29 +616,40 @@ end} %configure --disable-option-checking \ --libdir=%{common_libdir} \ --build=%{rust_triple} --host=%{rust_triple} --target=%{rust_triple} \ - %{target_config} \ + --set target.%{rust_triple}.linker=%{__cc} \ + --set target.%{rust_triple}.cc=%{__cc} \ + --set target.%{rust_triple}.cxx=%{__cxx} \ + --set target.%{rust_triple}.ar=%{__ar} \ + --set target.%{rust_triple}.ranlib=%{__ranlib} \ %{?mingw_target_config} \ %{?wasm_target_config} \ --python=%{__python3} \ --local-rust-root=%{local_rust_root} \ + --set build.rustfmt=/bin/true \ %{!?with_bundled_llvm: --llvm-root=%{llvm_root} \ %{!?llvm_has_filecheck: --disable-codegen-tests} \ %{!?with_llvm_static: --enable-llvm-link-shared } } \ + --disable-llvm-static-stdcpp \ --disable-rpath \ %{enable_debuginfo} \ --set rust.codegen-units-std=1 \ + --set build.build-stage=2 \ + --set build.doc-stage=2 \ + --set build.install-stage=2 \ + --set build.test-stage=2 \ --enable-extended \ - --tools=analysis,cargo,clippy,rls,rustfmt,src \ + --tools=analysis,cargo,clippy,rls,rust-analyzer,rustfmt,src \ --enable-vendor \ --enable-verbose-tests \ --dist-compression-formats=gz \ - --release-channel=%{channel} + --release-channel=%{channel} \ + --release-description="%{?fedora:Fedora }%{?rhel:Red Hat }%{version}-%{release}" -%{__python3} ./x.py build -j "$ncpus" --stage 2 -%{__python3} ./x.py doc --stage 2 +%{__python3} ./x.py build -j "$ncpus" +%{__python3} ./x.py doc for triple in %{?mingw_targets} %{?wasm_targets}; do - %{__python3} ./x.py build --stage 2 --target=$triple std + %{__python3} ./x.py build --target=$triple std done %install @@ -606,6 +661,9 @@ for triple in %{?mingw_targets} %{?wasm_targets}; do DESTDIR=%{buildroot} %{__python3} ./x.py install --target=$triple std done +# The rls stub doesn't have an install target, but we can just copy it. +%{__install} -t %{buildroot}%{_bindir} build/%{rust_triple}/stage2-tools-bin/rls + # These are transient files used by x.py dist and install rm -rf ./build/dist/ ./build/tmp/ @@ -623,15 +681,15 @@ find %{buildroot}%{_libdir} -maxdepth 1 -type f -name '*.so' \ # The libdir libraries are identical to those under rustlib/. It's easier on # library loading if we keep them in libdir, but we do need them in rustlib/ # to support dynamic linking for compiler plugins, so we'll symlink. -(cd "%{buildroot}%{rustlibdir}/%{rust_triple}/lib" && - find ../../../../%{_lib} -maxdepth 1 -name '*.so' | - while read lib; do - if [ -f "${lib##*/}" ]; then - # make sure they're actually identical! - cmp "$lib" "${lib##*/}" - ln -v -f -s -t . "$lib" - fi - done) +find %{buildroot}%{rustlibdir}/%{rust_triple}/lib/ -maxdepth 1 -type f -name '*.so' | +while read lib; do + lib2="%{buildroot}%{_libdir}/${lib##*/}" + if [ -f "$lib2" ]; then + # make sure they're actually identical! + cmp "$lib" "$lib2" + ln -v -f -r -s -T "$lib2" "$lib" + fi +done # Remove installer artifacts (manifests, uninstall scripts, etc.) find %{buildroot}%{rustlibdir} -maxdepth 1 -type f -exec rm -v '{}' '+' @@ -675,7 +733,6 @@ rm -f %{buildroot}%{rustlibdir}/etc/lldb_* # We don't want Rust copies of LLVM tools (rust-lld, rust-llvm-dwp) rm -f %{buildroot}%{rustlibdir}/%{rust_triple}/bin/rust-ll* - %check %{export_rust_env} @@ -685,23 +742,27 @@ env RUSTC=%{buildroot}%{_bindir}/rustc \ LD_LIBRARY_PATH="%{buildroot}%{_libdir}:$LD_LIBRARY_PATH" \ %{buildroot}%{_bindir}/cargo run --manifest-path build/hello-world/Cargo.toml +# Try a build sanity-check for other targets +for triple in %{?mingw_targets} %{?wasm_targets}; do + env RUSTC=%{buildroot}%{_bindir}/rustc \ + LD_LIBRARY_PATH="%{buildroot}%{_libdir}:$LD_LIBRARY_PATH" \ + %{buildroot}%{_bindir}/cargo build --manifest-path build/hello-world/Cargo.toml --target=$triple +done + # The results are not stable on koji, so mask errors and just log it. # Some of the larger test artifacts are manually cleaned to save space. -%{__python3} ./x.py test --no-fail-fast --stage 2 || : +%{__python3} ./x.py test --no-fail-fast || : rm -rf "./build/%{rust_triple}/test/" -%{__python3} ./x.py test --no-fail-fast --stage 2 cargo || : +%{__python3} ./x.py test --no-fail-fast cargo || : rm -rf "./build/%{rust_triple}/stage2-tools/%{rust_triple}/cit/" -%{__python3} ./x.py test --no-fail-fast --stage 2 clippy || : - -env RLS_TEST_WAIT_FOR_AGES=1 \ -%{__python3} ./x.py test --no-fail-fast --stage 2 rls || : +%{__python3} ./x.py test --no-fail-fast clippy || : -%{__python3} ./x.py test --no-fail-fast --stage 2 rustfmt || : +%{__python3} ./x.py test --no-fail-fast rust-analyzer || : +%{__python3} ./x.py test --no-fail-fast rustfmt || : -%ldconfig_scriptlets %files @@ -710,6 +771,7 @@ env RLS_TEST_WAIT_FOR_AGES=1 \ %{_bindir}/rustc %{_bindir}/rustdoc %{_libdir}/*.so +%{_libexecdir}/rust-analyzer-proc-macro-srv %{_mandir}/man1/rustc.1* %{_mandir}/man1/rustdoc.1* %dir %{rustlibdir} @@ -808,14 +870,17 @@ end} %{_docdir}/%{name}/html/*.js %{_docdir}/%{name}/html/*.png %{_docdir}/%{name}/html/*.svg -%{_docdir}/%{name}/html/*.woff %{_docdir}/%{name}/html/*.woff2 %license %{_docdir}/%{name}/html/*.txt %license %{_docdir}/%{name}/html/*.md +# former cargo-doc +%docdir %{_docdir}/cargo +%dir %{_docdir}/cargo +%{_docdir}/cargo/html %files -n cargo -%license src/tools/cargo/LICENSE-APACHE src/tools/cargo/LICENSE-MIT src/tools/cargo/LICENSE-THIRD-PARTY +%license src/tools/cargo/LICENSE-{APACHE,MIT,THIRD-PARTY} %doc src/tools/cargo/README.md %{_bindir}/cargo %{_libexecdir}/cargo* @@ -826,12 +891,6 @@ end} %dir %{_datadir}/cargo/registry -%files -n cargo-doc -%docdir %{_docdir}/cargo -%dir %{_docdir}/cargo -%{_docdir}/cargo/html - - %files -n rustfmt %{_bindir}/rustfmt %{_bindir}/cargo-fmt @@ -839,10 +898,11 @@ end} %license src/tools/rustfmt/LICENSE-{APACHE,MIT} -%files -n rls +%files analyzer %{_bindir}/rls -%doc src/tools/rls/{README.md,COPYRIGHT,debugging.md} -%license src/tools/rls/LICENSE-{APACHE,MIT} +%{_bindir}/rust-analyzer +%doc src/tools/rust-analyzer/README.md +%license src/tools/rust-analyzer/LICENSE-{APACHE,MIT} %files -n clippy @@ -862,6 +922,9 @@ end} %changelog +* Mon Dec 19 2022 Funda Wang - 1.66.0-1 +- New version 1.66.0 (1st round bootstrap) + * Tue Mar 15 2022 Zhongling He - 1.59.0-2 - add aarch64 @@ -869,4 +932,4 @@ end} - Update to upstream v1.59.0 * Wed Mar 9 2022 Zhongling He - 1.58.1-1 -- Init for Anolis OS 23 +- Init for Anolis OS 23 diff --git a/rustc-1.61.0-rust-gdb-substitute-path.patch b/rustc-1.61.0-rust-gdb-substitute-path.patch new file mode 100644 index 0000000000000000000000000000000000000000..b94e23ec779439692d48ae499549b46c7b11ab56 --- /dev/null +++ b/rustc-1.61.0-rust-gdb-substitute-path.patch @@ -0,0 +1,18 @@ +--- rustc-1.61.0-src/src/etc/rust-gdb.orig 2022-05-17 18:29:36.000000000 -0700 ++++ rustc-1.61.0-src/src/etc/rust-gdb 2022-05-18 11:18:13.732709661 -0700 +@@ -14,6 +14,9 @@ fi + RUSTC_SYSROOT="$("$RUSTC" --print=sysroot)" + GDB_PYTHON_MODULE_DIRECTORY="$RUSTC_SYSROOT/lib/rustlib/etc" + ++RUST_STD_BUILD="@BUILDDIR@/library/" ++RUST_STD_SRC="$RUSTC_SYSROOT/lib/rustlib/src/rust/library/" ++ + # Run GDB with the additional arguments that load the pretty printers + # Set the environment variable `RUST_GDB` to overwrite the call to a + # different/specific command (defaults to `gdb`). +@@ -21,4 +24,5 @@ RUST_GDB="${RUST_GDB:-gdb}" + PYTHONPATH="$PYTHONPATH:$GDB_PYTHON_MODULE_DIRECTORY" exec ${RUST_GDB} \ + --directory="$GDB_PYTHON_MODULE_DIRECTORY" \ + -iex "add-auto-load-safe-path $GDB_PYTHON_MODULE_DIRECTORY" \ ++ -iex "set substitute-path $RUST_STD_BUILD $RUST_STD_SRC" \ + "$@" diff --git a/rustc-1.65.0-aarch64-unknown-linux-gnu.tar.xz b/rustc-1.65.0-aarch64-unknown-linux-gnu.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..f06f2df4db0705099b185d391b2a5f33ad1e8152 Binary files /dev/null and b/rustc-1.65.0-aarch64-unknown-linux-gnu.tar.xz differ diff --git a/rustc-1.65.0-disable-http2.patch b/rustc-1.65.0-disable-http2.patch new file mode 100644 index 0000000000000000000000000000000000000000..99e33c708bfa01eb91ee17f41910e929ebb26e6d --- /dev/null +++ b/rustc-1.65.0-disable-http2.patch @@ -0,0 +1,90 @@ +--- rustc-beta-src/Cargo.lock.orig 2022-10-04 10:55:48.797517289 -0700 ++++ rustc-beta-src/Cargo.lock 2022-10-04 10:55:48.799517248 -0700 +@@ -1026,7 +1026,6 @@ + dependencies = [ + "cc", + "libc", +- "libnghttp2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", +@@ -1993,16 +1992,6 @@ + checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" + + [[package]] +-name = "libnghttp2-sys" +-version = "0.1.4+1.41.0" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "03624ec6df166e79e139a2310ca213283d6b3c30810c54844f307086d4488df1" +-dependencies = [ +- "cc", +- "libc", +-] +- +-[[package]] + name = "libz-sys" + version = "1.1.3" + source = "registry+https://github.com/rust-lang/crates.io-index" +--- rustc-beta-src/src/tools/cargo/Cargo.toml.orig 2022-10-04 10:55:48.799517248 -0700 ++++ rustc-beta-src/src/tools/cargo/Cargo.toml 2022-10-04 11:00:55.057162743 -0700 +@@ -21,7 +21,7 @@ + cargo-platform = { path = "crates/cargo-platform", version = "0.1.2" } + cargo-util = { path = "crates/cargo-util", version = "0.2.1" } + crates-io = { path = "crates/crates-io", version = "0.34.0" } +-curl = { version = "0.4.43", features = ["http2"] } ++curl = { version = "0.4.43", features = [] } + curl-sys = "0.4.55" + env_logger = "0.9.0" + pretty_env_logger = { version = "0.4", optional = true } +--- rustc-beta-src/src/tools/cargo/src/cargo/sources/registry/http_remote.rs.orig 2022-09-24 10:23:17.000000000 -0700 ++++ rustc-beta-src/src/tools/cargo/src/cargo/sources/registry/http_remote.rs 2022-10-04 10:55:48.799517248 -0700 +@@ -192,16 +192,8 @@ + } + self.fetch_started = true; + +- // We've enabled the `http2` feature of `curl` in Cargo, so treat +- // failures here as fatal as it would indicate a build-time problem. +- self.multiplexing = self.config.http_config()?.multiplexing.unwrap_or(true); +- +- self.multi +- .pipelining(false, self.multiplexing) +- .with_context(|| "failed to enable multiplexing/pipelining in curl")?; +- +- // let's not flood the server with connections +- self.multi.set_max_host_connections(2)?; ++ // Multiplexing is disabled because the system libcurl doesn't support it. ++ self.multiplexing = false; + + self.config + .shell() +--- rustc-beta-src/src/tools/cargo/src/cargo/core/package.rs.orig 2022-09-24 10:23:17.000000000 -0700 ++++ rustc-beta-src/src/tools/cargo/src/cargo/core/package.rs 2022-10-04 10:55:48.800517227 -0700 +@@ -403,16 +403,9 @@ + sources: SourceMap<'cfg>, + config: &'cfg Config, + ) -> CargoResult> { +- // We've enabled the `http2` feature of `curl` in Cargo, so treat +- // failures here as fatal as it would indicate a build-time problem. +- let mut multi = Multi::new(); +- let multiplexing = config.http_config()?.multiplexing.unwrap_or(true); +- multi +- .pipelining(false, multiplexing) +- .with_context(|| "failed to enable multiplexing/pipelining in curl")?; +- +- // let's not flood crates.io with connections +- multi.set_max_host_connections(2)?; ++ // Multiplexing is disabled because the system libcurl doesn't support it. ++ let multi = Multi::new(); ++ let multiplexing = false; + + Ok(PackageSet { + packages: package_ids +@@ -658,7 +651,7 @@ + macro_rules! try_old_curl { + ($e:expr, $msg:expr) => { + let result = $e; +- if cfg!(target_os = "macos") { ++ if cfg!(any(target_os = "linux", target_os = "macos")) { + if let Err(e) = result { + warn!("ignoring libcurl {} error: {}", $msg, e); + } diff --git a/rustc-1.65.0-disable-libssh2.patch b/rustc-1.65.0-disable-libssh2.patch new file mode 100644 index 0000000000000000000000000000000000000000..24be1f3a5a859608ad9f7baddae055c1749c6c49 --- /dev/null +++ b/rustc-1.65.0-disable-libssh2.patch @@ -0,0 +1,43 @@ +--- rustc-beta-src/Cargo.lock.orig 2022-09-24 10:20:14.000000000 -0700 ++++ rustc-beta-src/Cargo.lock 2022-10-04 10:26:35.490270607 -0700 +@@ -1971,7 +1971,6 @@ + dependencies = [ + "cc", + "libc", +- "libssh2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", +@@ -2004,20 +2003,6 @@ + ] + + [[package]] +-name = "libssh2-sys" +-version = "0.2.23" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca" +-dependencies = [ +- "cc", +- "libc", +- "libz-sys", +- "openssl-sys", +- "pkg-config", +- "vcpkg", +-] +- +-[[package]] + name = "libz-sys" + version = "1.1.3" + source = "registry+https://github.com/rust-lang/crates.io-index" +--- rustc-beta-src/vendor/git2/Cargo.toml.orig 2022-10-04 10:26:35.490270607 -0700 ++++ rustc-beta-src/vendor/git2/Cargo.toml 2022-10-04 10:28:14.002187686 -0700 +@@ -58,9 +58,7 @@ + + [features] + default = [ +- "ssh", + "https", +- "ssh_key_from_memory", + ] + https = [ + "libgit2-sys/https", diff --git a/rustc-1.65.0-x86_64-unknown-linux-gnu.tar.xz b/rustc-1.65.0-x86_64-unknown-linux-gnu.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..81bc7070c585891a00a561de7de66509b9238aaf Binary files /dev/null and b/rustc-1.65.0-x86_64-unknown-linux-gnu.tar.xz differ diff --git a/rustc-1.59.0-src.tar.gz b/rustc-1.66.0-src.tar.xz similarity index 72% rename from rustc-1.59.0-src.tar.gz rename to rustc-1.66.0-src.tar.xz index 747ba34e2b679fc4b2178cadf49fbc1c8d2f5cc0..44d121d76e47bd0d6a9efc083550d6cfab76ac2c 100644 Binary files a/rustc-1.59.0-src.tar.gz and b/rustc-1.66.0-src.tar.xz differ diff --git a/wasi-libc-ad5133410f66b93a2381db5b542aad5e0964db96.tar.gz b/wasi-libc-ad5133410f66b93a2381db5b542aad5e0964db96.tar.gz deleted file mode 100644 index 0cdf78848504e6813c71cb04a604d09a863da863..0000000000000000000000000000000000000000 Binary files a/wasi-libc-ad5133410f66b93a2381db5b542aad5e0964db96.tar.gz and /dev/null differ diff --git a/wasi-libc-wasi-sdk-17.tar.gz b/wasi-libc-wasi-sdk-17.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..c74348bab3a286257c261202cbf618544b1b3361 Binary files /dev/null and b/wasi-libc-wasi-sdk-17.tar.gz differ