diff --git a/.gitignore b/.gitignore index 2e090d7..cd447ec 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -SOURCES/rustc-1.71.1-src.tar.xz -SOURCES/wasi-libc-wasi-sdk-20.tar.gz +SOURCES/rustc-1.75.0-src.tar.xz +SOURCES/wasi-libc-bd950eb128bff337153de217b11270f948d04bb4.tar.gz diff --git a/.rust.metadata b/.rust.metadata index 7213a20..f65d0ce 100644 --- a/.rust.metadata +++ b/.rust.metadata @@ -1,2 +1,2 @@ -ffa03139b447604322d689eefe4e157a49c39f51 SOURCES/rustc-1.71.1-src.tar.xz -8678e3510c88ef1de4d8c2940fa8ddad8f4eb084 SOURCES/wasi-libc-wasi-sdk-20.tar.gz +9ad7bb54dc9572c103b855cdcc823addbb34d15d SOURCES/rustc-1.75.0-src.tar.xz +55eaa32c99cc8ec970f2db2d340a605724589f9b SOURCES/wasi-libc-bd950eb128bff337153de217b11270f948d04bb4.tar.gz diff --git a/SOURCES/0001-Allow-using-external-builds-of-the-compiler-rt-profi.patch b/SOURCES/0001-Allow-using-external-builds-of-the-compiler-rt-profi.patch deleted file mode 100644 index 2b1ecb5..0000000 --- a/SOURCES/0001-Allow-using-external-builds-of-the-compiler-rt-profi.patch +++ /dev/null @@ -1,142 +0,0 @@ -From f2fd2d01f96b50b039402c9ab4278230687f7922 Mon Sep 17 00:00:00 2001 -From: Josh Stone -Date: Tue, 25 Jul 2023 13:11:50 -0700 -Subject: [PATCH] Allow using external builds of the compiler-rt profile lib - -This changes the bootstrap config `target.*.profiler` from a plain bool -to also allow a string, which will be used as a path to the pre-built -profiling runtime for that target. Then `profiler_builtins/build.rs` -reads that in a `LLVM_PROFILER_RT_LIB` environment variable. ---- - config.example.toml | 6 ++++-- - library/profiler_builtins/build.rs | 6 ++++++ - src/bootstrap/compile.rs | 4 ++++ - src/bootstrap/config.rs | 30 ++++++++++++++++++++++++------ - 4 files changed, 38 insertions(+), 8 deletions(-) - -diff --git a/config.example.toml b/config.example.toml -index d0eaa9fd7ffa..e0e991e679af 100644 ---- a/config.example.toml -+++ b/config.example.toml -@@ -745,8 +745,10 @@ changelog-seen = 2 - # This option will override the same option under [build] section. - #sanitizers = build.sanitizers (bool) - --# Build the profiler runtime for this target(required when compiling with options that depend --# on this runtime, such as `-C profile-generate` or `-C instrument-coverage`). -+# When true, build the profiler runtime for this target(required when compiling -+# with options that depend on this runtime, such as `-C profile-generate` or -+# `-C instrument-coverage`). This may also be given a path to an existing build -+# of the profiling runtime library from LLVM's compiler-rt. - # This option will override the same option under [build] section. - #profiler = build.profiler (bool) - -diff --git a/library/profiler_builtins/build.rs b/library/profiler_builtins/build.rs -index 1b1f11798d74..d14d0b82229a 100644 ---- a/library/profiler_builtins/build.rs -+++ b/library/profiler_builtins/build.rs -@@ -6,6 +6,12 @@ - use std::path::Path; - - fn main() { -+ println!("cargo:rerun-if-env-changed=LLVM_PROFILER_RT_LIB"); -+ if let Ok(rt) = env::var("LLVM_PROFILER_RT_LIB") { -+ println!("cargo:rustc-link-lib=static:+verbatim={rt}"); -+ return; -+ } -+ - let target = env::var("TARGET").expect("TARGET was not set"); - let cfg = &mut cc::Build::new(); - -diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs -index 33addb90da37..1d8b3c6e5435 100644 ---- a/src/bootstrap/compile.rs -+++ b/src/bootstrap/compile.rs -@@ -305,6 +305,10 @@ pub fn std_cargo(builder: &Builder<'_>, target: TargetSelection, stage: u32, car - cargo.env("MACOSX_DEPLOYMENT_TARGET", target); - } - -+ if let Some(path) = builder.config.profiler_path(target) { -+ cargo.env("LLVM_PROFILER_RT_LIB", path); -+ } -+ - // Determine if we're going to compile in optimized C intrinsics to - // the `compiler-builtins` crate. These intrinsics live in LLVM's - // `compiler-rt` repository, but our `src/llvm-project` submodule isn't -diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs -index e192cda9a9a7..a4803db0a470 100644 ---- a/src/bootstrap/config.rs -+++ b/src/bootstrap/config.rs -@@ -467,7 +467,7 @@ pub struct Target { - pub linker: Option, - pub ndk: Option, - pub sanitizers: Option, -- pub profiler: Option, -+ pub profiler: Option, - pub rpath: Option, - pub crt_static: Option, - pub musl_root: Option, -@@ -796,9 +796,9 @@ struct Dist { - } - } - --#[derive(Debug, Deserialize)] -+#[derive(Clone, Debug, Deserialize)] - #[serde(untagged)] --enum StringOrBool { -+pub enum StringOrBool { - String(String), - Bool(bool), - } -@@ -809,6 +809,12 @@ fn default() -> StringOrBool { - } - } - -+impl StringOrBool { -+ fn is_string_or_true(&self) -> bool { -+ matches!(self, Self::String(_) | Self::Bool(true)) -+ } -+} -+ - define_config! { - /// TOML representation of how the Rust build is configured. - struct Rust { -@@ -880,7 +886,7 @@ struct TomlTarget { - llvm_libunwind: Option = "llvm-libunwind", - android_ndk: Option = "android-ndk", - sanitizers: Option = "sanitizers", -- profiler: Option = "profiler", -+ profiler: Option = "profiler", - rpath: Option = "rpath", - crt_static: Option = "crt-static", - musl_root: Option = "musl-root", -@@ -1744,12 +1750,24 @@ pub fn any_sanitizers_enabled(&self) -> bool { - self.target_config.values().any(|t| t.sanitizers == Some(true)) || self.sanitizers - } - -+ pub fn profiler_path(&self, target: TargetSelection) -> Option<&str> { -+ match self.target_config.get(&target)?.profiler.as_ref()? { -+ StringOrBool::String(s) => Some(s), -+ StringOrBool::Bool(_) => None, -+ } -+ } -+ - pub fn profiler_enabled(&self, target: TargetSelection) -> bool { -- self.target_config.get(&target).map(|t| t.profiler).flatten().unwrap_or(self.profiler) -+ self.target_config -+ .get(&target) -+ .and_then(|t| t.profiler.as_ref()) -+ .map(StringOrBool::is_string_or_true) -+ .unwrap_or(self.profiler) - } - - pub fn any_profiler_enabled(&self) -> bool { -- self.target_config.values().any(|t| t.profiler == Some(true)) || self.profiler -+ self.target_config.values().any(|t| matches!(&t.profiler, Some(p) if p.is_string_or_true())) -+ || self.profiler - } - - pub fn rpath_enabled(&self, target: TargetSelection) -> bool { --- -2.41.0 - diff --git a/SOURCES/0001-Let-environment-variables-override-some-default-CPUs.patch b/SOURCES/0001-Let-environment-variables-override-some-default-CPUs.patch index c394f78..dc8be55 100644 --- a/SOURCES/0001-Let-environment-variables-override-some-default-CPUs.patch +++ b/SOURCES/0001-Let-environment-variables-override-some-default-CPUs.patch @@ -1,33 +1,33 @@ -From 6e2adb05860b72610291d3b0e8bd525c44cb0cc9 Mon Sep 17 00:00:00 2001 +From 184d61d2c12aa2db01de9a14ccb2be0cfae5039b Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Fri, 9 Jun 2023 15:23:08 -0700 Subject: [PATCH] Let environment variables override some default CPUs --- - compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs | 2 +- - compiler/rustc_target/src/spec/s390x_unknown_linux_gnu.rs | 2 +- - compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs | 2 +- + .../src/spec/targets/powerpc64le_unknown_linux_gnu.rs | 2 +- + .../rustc_target/src/spec/targets/s390x_unknown_linux_gnu.rs | 2 +- + .../rustc_target/src/spec/targets/x86_64_unknown_linux_gnu.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) -diff --git a/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs -index fd896e086b54..08d0c43d20b4 100644 ---- a/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs -+++ b/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs +diff --git a/compiler/rustc_target/src/spec/targets/powerpc64le_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/targets/powerpc64le_unknown_linux_gnu.rs +index 194c3170e683..9806ca78297c 100644 +--- a/compiler/rustc_target/src/spec/targets/powerpc64le_unknown_linux_gnu.rs ++++ b/compiler/rustc_target/src/spec/targets/powerpc64le_unknown_linux_gnu.rs @@ -2,7 +2,7 @@ pub fn target() -> Target { - let mut base = super::linux_gnu_base::opts(); + let mut base = base::linux_gnu::opts(); - base.cpu = "ppc64le".into(); + base.cpu = option_env!("RUSTC_TARGET_CPU_PPC64LE").unwrap_or("ppc64le").into(); base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]); base.max_atomic_width = Some(64); base.stack_probes = StackProbeType::Inline; -diff --git a/compiler/rustc_target/src/spec/s390x_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/s390x_unknown_linux_gnu.rs -index f2c722b9a89d..17a14d10b27e 100644 ---- a/compiler/rustc_target/src/spec/s390x_unknown_linux_gnu.rs -+++ b/compiler/rustc_target/src/spec/s390x_unknown_linux_gnu.rs +diff --git a/compiler/rustc_target/src/spec/targets/s390x_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/targets/s390x_unknown_linux_gnu.rs +index 6fc410eb2235..c8f84edb9715 100644 +--- a/compiler/rustc_target/src/spec/targets/s390x_unknown_linux_gnu.rs ++++ b/compiler/rustc_target/src/spec/targets/s390x_unknown_linux_gnu.rs @@ -5,7 +5,7 @@ pub fn target() -> Target { - let mut base = super::linux_gnu_base::opts(); + let mut base = base::linux_gnu::opts(); base.endian = Endian::Big; // z10 is the oldest CPU supported by LLVM - base.cpu = "z10".into(); @@ -35,19 +35,19 @@ index f2c722b9a89d..17a14d10b27e 100644 // FIXME: The ABI implementation in cabi_s390x.rs is for now hard-coded to assume the no-vector // ABI. Pass the -vector feature string to LLVM to respect this assumption. On LLVM < 16, we // also strip v128 from the data_layout below to match the older LLVM's expectation. -diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs -index 9af1049b8702..68f876dd18c3 100644 ---- a/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs -+++ b/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs +diff --git a/compiler/rustc_target/src/spec/targets/x86_64_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/targets/x86_64_unknown_linux_gnu.rs +index 80e267c163fa..8436a00e66d5 100644 +--- a/compiler/rustc_target/src/spec/targets/x86_64_unknown_linux_gnu.rs ++++ b/compiler/rustc_target/src/spec/targets/x86_64_unknown_linux_gnu.rs @@ -2,7 +2,7 @@ pub fn target() -> Target { - let mut base = super::linux_gnu_base::opts(); + let mut base = base::linux_gnu::opts(); - base.cpu = "x86-64".into(); + base.cpu = option_env!("RUSTC_TARGET_CPU_X86_64").unwrap_or("x86-64").into(); + base.plt_by_default = false; base.max_atomic_width = Some(64); base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]); - base.stack_probes = StackProbeType::X86; -- -2.40.1 +2.41.0 diff --git a/SOURCES/0001-Use-lld-provided-by-system-for-wasm.patch b/SOURCES/0001-Use-lld-provided-by-system-for-wasm.patch deleted file mode 100644 index 5fcc245..0000000 --- a/SOURCES/0001-Use-lld-provided-by-system-for-wasm.patch +++ /dev/null @@ -1,26 +0,0 @@ -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/SOURCES/0001-Use-lld-provided-by-system.patch b/SOURCES/0001-Use-lld-provided-by-system.patch new file mode 100644 index 0000000..bee8e16 --- /dev/null +++ b/SOURCES/0001-Use-lld-provided-by-system.patch @@ -0,0 +1,53 @@ +From 61b5cc96337da2121221dd1bcdb63fd36551d065 Mon Sep 17 00:00:00 2001 +From: Josh Stone +Date: Wed, 1 Nov 2023 15:21:15 -0700 +Subject: [PATCH] Use lld provided by system + +--- + compiler/rustc_target/src/spec/base/wasm.rs | 3 +-- + compiler/rustc_target/src/spec/targets/x86_64_unknown_none.rs | 2 +- + compiler/rustc_target/src/spec/targets/x86_64_unknown_uefi.rs | 1 + + 3 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/compiler/rustc_target/src/spec/base/wasm.rs b/compiler/rustc_target/src/spec/base/wasm.rs +index 87ade9e58cf4..2ddff95febab 100644 +--- a/compiler/rustc_target/src/spec/base/wasm.rs ++++ b/compiler/rustc_target/src/spec/base/wasm.rs +@@ -91,8 +91,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, +diff --git a/compiler/rustc_target/src/spec/targets/x86_64_unknown_none.rs b/compiler/rustc_target/src/spec/targets/x86_64_unknown_none.rs +index 9aa95a35f8e5..a9172f9441b7 100644 +--- a/compiler/rustc_target/src/spec/targets/x86_64_unknown_none.rs ++++ b/compiler/rustc_target/src/spec/targets/x86_64_unknown_none.rs +@@ -17,7 +17,7 @@ pub fn target() -> Target { + static_position_independent_executables: true, + relro_level: RelroLevel::Full, + linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes), +- linker: Some("rust-lld".into()), ++ linker: Some("lld".into()), + features: + "-mmx,-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-3dnow,-3dnowa,-avx,-avx2,+soft-float" + .into(), +diff --git a/compiler/rustc_target/src/spec/targets/x86_64_unknown_uefi.rs b/compiler/rustc_target/src/spec/targets/x86_64_unknown_uefi.rs +index 5abfb8162f70..13cb43bda1a4 100644 +--- a/compiler/rustc_target/src/spec/targets/x86_64_unknown_uefi.rs ++++ b/compiler/rustc_target/src/spec/targets/x86_64_unknown_uefi.rs +@@ -16,6 +16,7 @@ pub fn target() -> Target { + base.plt_by_default = false; + base.max_atomic_width = Some(64); + base.entry_abi = Conv::X86_64Win64; ++ base.linker = Some("lld".into()); + + // We disable MMX and SSE for now, even though UEFI allows using them. Problem is, you have to + // enable these CPU features explicitly before their first use, otherwise their instructions +-- +2.41.0 + diff --git a/SOURCES/0001-bootstrap-allow-disabling-target-self-contained.patch b/SOURCES/0001-bootstrap-allow-disabling-target-self-contained.patch new file mode 100644 index 0000000..2a3cbd7 --- /dev/null +++ b/SOURCES/0001-bootstrap-allow-disabling-target-self-contained.patch @@ -0,0 +1,102 @@ +From df0d6f1d8b46db82d7599ca8eff6e8f844cf52f2 Mon Sep 17 00:00:00 2001 +From: Josh Stone +Date: Thu, 28 Sep 2023 18:14:28 -0700 +Subject: [PATCH 1/2] bootstrap: allow disabling target self-contained + +--- + config.example.toml | 5 +++++ + src/bootstrap/src/core/build_steps/compile.rs | 4 ++++ + src/bootstrap/src/core/config/config.rs | 8 ++++++++ + src/bootstrap/src/lib.rs | 5 +++++ + 4 files changed, 22 insertions(+) + +diff --git a/config.example.toml b/config.example.toml +index e5df28a49af6..2fcd8b8cb057 100644 +--- a/config.example.toml ++++ b/config.example.toml +@@ -807,6 +807,11 @@ change-id = 116881 + # target triples containing `-none`, `nvptx`, `switch`, or `-uefi`. + #no-std = (bool) + ++# Copy libc and CRT objects into the target lib/self-contained/ directory. ++# Enabled by default on `musl`, `wasi`, and `windows-gnu` targets. Other ++# targets may ignore this setting if they have nothing to be contained. ++#self-contained = (bool) ++ + # ============================================================================= + # Distribution options + # +diff --git a/src/bootstrap/src/core/build_steps/compile.rs b/src/bootstrap/src/core/build_steps/compile.rs +index 7021a9543582..11555c65ca87 100644 +--- a/src/bootstrap/src/core/build_steps/compile.rs ++++ b/src/bootstrap/src/core/build_steps/compile.rs +@@ -302,6 +302,10 @@ fn copy_self_contained_objects( + compiler: &Compiler, + target: TargetSelection, + ) -> Vec<(PathBuf, DependencyType)> { ++ if builder.self_contained(target) != Some(true) { ++ return vec![]; ++ } ++ + let libdir_self_contained = builder.sysroot_libdir(*compiler, target).join("self-contained"); + t!(fs::create_dir_all(&libdir_self_contained)); + let mut target_deps = vec![]; +diff --git a/src/bootstrap/src/core/config/config.rs b/src/bootstrap/src/core/config/config.rs +index 0a9175aa3ea5..a2e028b25036 100644 +--- a/src/bootstrap/src/core/config/config.rs ++++ b/src/bootstrap/src/core/config/config.rs +@@ -533,6 +533,7 @@ pub struct Target { + pub wasi_root: Option, + pub qemu_rootfs: Option, + pub no_std: bool, ++ pub self_contained: bool, + } + + impl Target { +@@ -541,6 +542,9 @@ pub fn from_triple(triple: &str) -> Self { + if triple.contains("-none") || triple.contains("nvptx") || triple.contains("switch") { + target.no_std = true; + } ++ if triple.contains("-musl") || triple.contains("-wasi") || triple.contains("-windows-gnu") { ++ target.self_contained = true; ++ } + target + } + } +@@ -1051,6 +1055,7 @@ struct TomlTarget { + wasi_root: Option = "wasi-root", + qemu_rootfs: Option = "qemu-rootfs", + no_std: Option = "no-std", ++ self_contained: Option = "self-contained", + } + } + +@@ -1600,6 +1605,9 @@ fn get_table(option: &str) -> Result { + if let Some(s) = cfg.no_std { + target.no_std = s; + } ++ if let Some(s) = cfg.self_contained { ++ target.self_contained = s; ++ } + target.cc = cfg.cc.map(PathBuf::from); + target.cxx = cfg.cxx.map(PathBuf::from); + target.ar = cfg.ar.map(PathBuf::from); +diff --git a/src/bootstrap/src/lib.rs b/src/bootstrap/src/lib.rs +index 33b8f1a7ce72..f36e53187576 100644 +--- a/src/bootstrap/src/lib.rs ++++ b/src/bootstrap/src/lib.rs +@@ -1335,6 +1335,11 @@ fn no_std(&self, target: TargetSelection) -> Option { + self.config.target_config.get(&target).map(|t| t.no_std) + } + ++ /// Returns `true` if this is a self-contained `target`, if defined ++ fn self_contained(&self, target: TargetSelection) -> Option { ++ self.config.target_config.get(&target).map(|t| t.self_contained) ++ } ++ + /// Returns `true` if the target will be tested using the `remote-test-client` + /// and `remote-test-server` binaries. + fn remote_tested(&self, target: TargetSelection) -> bool { +-- +2.41.0 + diff --git a/SOURCES/0001-bootstrap-config-fix-version-comparison-bug.patch b/SOURCES/0001-bootstrap-config-fix-version-comparison-bug.patch deleted file mode 100644 index f0c4e55..0000000 --- a/SOURCES/0001-bootstrap-config-fix-version-comparison-bug.patch +++ /dev/null @@ -1,36 +0,0 @@ -From a627c8f54cab6880dc7d36c55092a94c6f750a6e Mon Sep 17 00:00:00 2001 -From: Ariadne Conill -Date: Thu, 3 Aug 2023 15:05:40 -0700 -Subject: [PATCH] bootstrap: config: fix version comparison bug - -Rust requires a previous version of Rust to build, such as the current version, or the -previous version. However, the version comparison logic did not take patch releases -into consideration when doing the version comparison for the current branch, e.g. -Rust 1.71.1 could not be built by Rust 1.71.0 because it is neither an exact version -match, or the previous version. - -Adjust the version comparison logic to tolerate mismatches in the patch version. - -Signed-off-by: Ariadne Conill -(cherry picked from commit 31a81a08786826cc6e832bd0b49fb8b934e29648) ---- - src/bootstrap/config.rs | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs -index e192cda9a9a7..2b5d0b94e968 100644 ---- a/src/bootstrap/config.rs -+++ b/src/bootstrap/config.rs -@@ -1805,7 +1805,8 @@ pub fn check_build_rustc_version(&self) { - .unwrap(); - if !(source_version == rustc_version - || (source_version.major == rustc_version.major -- && source_version.minor == rustc_version.minor + 1)) -+ && (source_version.minor == rustc_version.minor -+ || source_version.minor == rustc_version.minor + 1))) - { - let prev_version = format!("{}.{}.x", source_version.major, source_version.minor - 1); - eprintln!( --- -2.41.0 - diff --git a/SOURCES/0001-bootstrap-only-show-PGO-warnings-when-verbose.patch b/SOURCES/0001-bootstrap-only-show-PGO-warnings-when-verbose.patch new file mode 100644 index 0000000..ca36844 --- /dev/null +++ b/SOURCES/0001-bootstrap-only-show-PGO-warnings-when-verbose.patch @@ -0,0 +1,33 @@ +From 776146e9ebb6bbe17a37bfad955f3dac95317275 Mon Sep 17 00:00:00 2001 +From: Josh Stone +Date: Thu, 16 Nov 2023 10:42:23 -0800 +Subject: [PATCH] bootstrap: only show PGO warnings when verbose + +Building rustc with `--rust-profile-use` is currently dumping a lot of +warnings of "no profile data available for function" from `rustc_smir` +and `stable_mir`. These simply aren't exercised by the current profile- +gathering steps, but that's to be expected for new or experimental +functionality. I think for most people, these warnings will be just +noise, so it makes sense to only have them in verbose builds. +--- + src/bootstrap/src/core/build_steps/compile.rs | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/bootstrap/src/core/build_steps/compile.rs b/src/bootstrap/src/core/build_steps/compile.rs +index af69860df1c5..51e4195827fc 100644 +--- a/src/bootstrap/src/core/build_steps/compile.rs ++++ b/src/bootstrap/src/core/build_steps/compile.rs +@@ -887,7 +887,9 @@ fn run(self, builder: &Builder<'_>) { + } else if let Some(path) = &builder.config.rust_profile_use { + if compiler.stage == 1 { + cargo.rustflag(&format!("-Cprofile-use={path}")); +- cargo.rustflag("-Cllvm-args=-pgo-warn-missing-function"); ++ if builder.is_verbose() { ++ cargo.rustflag("-Cllvm-args=-pgo-warn-missing-function"); ++ } + true + } else { + false +-- +2.43.0 + diff --git a/SOURCES/0002-set-an-external-library-path-for-wasm32-wasi.patch b/SOURCES/0002-set-an-external-library-path-for-wasm32-wasi.patch new file mode 100644 index 0000000..e2da2fe --- /dev/null +++ b/SOURCES/0002-set-an-external-library-path-for-wasm32-wasi.patch @@ -0,0 +1,78 @@ +From 79bb610c8fc5d9df7dd4720ae847b8f17e7b1ad4 Mon Sep 17 00:00:00 2001 +From: Josh Stone +Date: Thu, 28 Sep 2023 18:18:16 -0700 +Subject: [PATCH 2/2] set an external library path for wasm32-wasi + +--- + compiler/rustc_codegen_ssa/src/back/link.rs | 9 +++++++++ + compiler/rustc_target/src/spec/mod.rs | 2 ++ + compiler/rustc_target/src/spec/targets/wasm32_wasi.rs | 6 +++++- + 3 files changed, 16 insertions(+), 1 deletion(-) + +diff --git a/compiler/rustc_codegen_ssa/src/back/link.rs b/compiler/rustc_codegen_ssa/src/back/link.rs +index dd9d277fb775..3d0f0502f255 100644 +--- a/compiler/rustc_codegen_ssa/src/back/link.rs ++++ b/compiler/rustc_codegen_ssa/src/back/link.rs +@@ -1496,6 +1496,12 @@ fn get_object_file_path(sess: &Session, name: &str, self_contained: bool) -> Pat + return file_path; + } + } ++ if let Some(lib_path) = &sess.target.options.external_lib_path { ++ let file_path = Path::new(lib_path.as_ref()).join(name); ++ if file_path.exists() { ++ return file_path; ++ } ++ } + for search_path in fs.search_paths() { + let file_path = search_path.dir.join(name); + if file_path.exists() { +@@ -1982,6 +1988,9 @@ fn add_library_search_dirs(cmd: &mut dyn Linker, sess: &Session, self_contained: + let lib_path = sess.target_filesearch(PathKind::All).get_self_contained_lib_path(); + cmd.include_path(&fix_windows_verbatim_for_gcc(&lib_path)); + } ++ if let Some(lib_path) = &sess.target.options.external_lib_path { ++ cmd.include_path(Path::new(lib_path.as_ref())); ++ } + } + + /// Add options making relocation sections in the produced ELF files read-only +diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs +index f04799482c83..25410b37ba24 100644 +--- a/compiler/rustc_target/src/spec/mod.rs ++++ b/compiler/rustc_target/src/spec/mod.rs +@@ -1874,6 +1874,7 @@ pub struct TargetOptions { + /// Objects to link before and after all other object code. + pub pre_link_objects: CrtObjects, + pub post_link_objects: CrtObjects, ++ pub external_lib_path: Option>, + /// Same as `(pre|post)_link_objects`, but when self-contained linking mode is enabled. + pub pre_link_objects_self_contained: CrtObjects, + pub post_link_objects_self_contained: CrtObjects, +@@ -2352,6 +2353,7 @@ fn default() -> TargetOptions { + relro_level: RelroLevel::None, + pre_link_objects: Default::default(), + post_link_objects: Default::default(), ++ external_lib_path: None, + pre_link_objects_self_contained: Default::default(), + post_link_objects_self_contained: Default::default(), + link_self_contained: LinkSelfContainedDefault::False, +diff --git a/compiler/rustc_target/src/spec/targets/wasm32_wasi.rs b/compiler/rustc_target/src/spec/targets/wasm32_wasi.rs +index 6dbcb01ea436..2151f86d0648 100644 +--- a/compiler/rustc_target/src/spec/targets/wasm32_wasi.rs ++++ b/compiler/rustc_target/src/spec/targets/wasm32_wasi.rs +@@ -86,7 +86,11 @@ pub fn target() -> Target { + options.post_link_objects_self_contained = crt_objects::post_wasi_self_contained(); + + // FIXME: Figure out cases in which WASM needs to link with a native toolchain. +- options.link_self_contained = LinkSelfContainedDefault::True; ++ options.link_self_contained = LinkSelfContainedDefault::False; ++ ++ options.pre_link_objects = options.pre_link_objects_self_contained.clone(); ++ options.post_link_objects = options.post_link_objects_self_contained.clone(); ++ options.external_lib_path = Some("/usr/wasm32-wasi/lib/wasm32-wasi".into()); + + // Right now this is a bit of a workaround but we're currently saying that + // the target by default has a static crt which we're taking as a signal +-- +2.41.0 + diff --git a/SOURCES/macros.rust-toolset b/SOURCES/macros.rust-toolset index 41bb129..31cd56d 100644 --- a/SOURCES/macros.rust-toolset +++ b/SOURCES/macros.rust-toolset @@ -5,17 +5,47 @@ # https://github.com/rust-lang/cargo/issues/6397 # But we can set CARGO_HOME locally, which is a good idea anyway to make sure # it never writes to ~/.cargo during rpmbuild. -%__cargo %{_bindir}/env CARGO_HOME=.cargo %{_bindir}/cargo -%__rustc %{_bindir}/rustc -%__rustdoc %{_bindir}/rustdoc +%__cargo /usr/bin/env CARGO_HOME=.cargo RUSTFLAGS='%{build_rustflags}' /usr/bin/cargo +%__rustc /usr/bin/rustc +%__rustdoc /usr/bin/rustdoc -# Enable optimization, debuginfo, and link hardening. -%__global_rustflags -Copt-level=3 -Cdebuginfo=2 -Clink-arg=-Wl,-z,relro,-z,now +# rustflags_opt_level: default optimization level +# +# It corresponds to the "-Copt-level" rustc command line option. +%rustflags_opt_level 3 -%__global_rustflags_toml [%{lua: - for arg in string.gmatch(rpm.expand("%{__global_rustflags}"), "%S+") do - print('"' .. arg .. '", ') - end}] +# rustflags_debuginfo: default verbosity of debug information +# +# It corresponds to the "-Cdebuginfo" rustc command line option. +# In some cases, it might be required to override this macro with "1" or even +# "0", if memory usage gets too high during builds on some resource-constrained +# architectures (most likely on 32-bit architectures), which will however +# reduce the quality of the produced debug symbols. +%rustflags_debuginfo 2 + +# rustflags_codegen_units: default number of parallel code generation units +# +# The default value of "1" results in generation of better code, but comes at +# the cost of longer build times. +%rustflags_codegen_units 1 + +# build_rustflags: default compiler flags for rustc (RUSTFLAGS) +# +# -Copt-level: set optimization level (default: highest optimization level) +# -Cdebuginfo: set debuginfo verbosity (default: full debug information) +# -Ccodegen-units: set number of parallel code generation units (default: 1) +# +# ref. https://doc.rust-lang.org/rustc/codegen-options/index.html +%build_rustflags %{shrink: + -Copt-level=%rustflags_opt_level + -Cdebuginfo=%rustflags_debuginfo + -Ccodegen-units=%rustflags_codegen_units +} + +# __cargo_common_opts: common command line flags for cargo +# +# _smp_mflags: run builds and tests in parallel +%__cargo_common_opts %{?_smp_mflags} %cargo_prep(V:) (\ %{__mkdir} -p .cargo \ @@ -23,7 +53,11 @@ cat > .cargo/config << EOF \ [build]\ rustc = "%{__rustc}"\ rustdoc = "%{__rustdoc}"\ -rustflags = %{__global_rustflags_toml}\ +\ +[env]\ +CFLAGS = "%{build_cflags}"\ +CXXFLAGS = "%{build_cxxflags}"\ +LDFLAGS = "%{build_ldflags}"\ \ [install]\ root = "%{buildroot}%{_prefix}"\ @@ -44,8 +78,104 @@ EOF\ %endif\ ) -%cargo_build %__cargo build --release %{?_smp_mflags} +# __cargo_parse_opts: function-like macro which parses common flags into the +# equivalent command-line flags for cargo +%__cargo_parse_opts(naf:) %{shrink:\ +%{-f:%{-a:%{error:Can't specify both -f(%{-f*}) and -a}}} \ + %{-n:--no-default-features} \ + %{-a:--all-features} \ + %{-f:--features %{-f*}} \ + %{nil} +} -%cargo_test %__cargo test --release %{?_smp_mflags} --no-fail-fast +# NB: cargo_build/test/install do not use the -n/-a/-f argument parsing like +# Fedora's rust-packaging, because that change would break anyone that's +# already passing arguments directly to cargo after the macro. Instead, one can +# explicitly use --no-default-features, --all-features, or --features XYZ. -%cargo_install %__cargo install --no-track --path . +# cargo_build: builds the crate with cargo +%cargo_build \ +%{shrink:\ + %{__cargo} build \ + %{__cargo_common_opts} \ + --release \ +} + +# cargo_test: runs the test suite with cargo +# +# To pass command-line arguments to the cargo test runners directly (for +# example, to skip certain tests during package builds), the +# "cargo test" argument parsing need to be bypassed, +# i.e. "%%cargo_test -- --skip foo" for skipping all tests with names that +# match "foo". +%cargo_test \ +%{shrink:\ + %{__cargo} test \ + %{__cargo_common_opts} \ + --release \ + --no-fail-fast \ +} + +# cargo_install: install files into the buildroot +# +# For "binary" crates, this macro installs all "bin" build targets to _bindir +# inside the buildroot. The "--no-track" option prevents the creation of the +# "$CARGO_HOME/.crates.toml" file, which is used to keep track of which version +# of a specific binary has been installed, but which conflicts between builds +# of different Rust applications and is not needed when building RPM packages. +%cargo_install \ +%{shrink: \ + %{__cargo} install \ + %{__cargo_common_opts} \ + --no-track \ + --path . \ +} \ + +# cargo_license: print license information for all crate dependencies +# +# The "no-build,no-dev,no-proc-macro" argument results in only crates which are +# linked into the final binary to be considered. +# +# Additionally, deprecated SPDX syntax ("/" instead of "OR") is normalized +# before sorting the results to ensure reproducible output of this macro. +# +# This macro must be called with the same feature flags as other cargo macros, +# in particular, "cargo_build", otherwise its output will be incomplete. +# +# The "cargo tree" command called by this macro will fail if there are missing +# (optional) dependencies. +%cargo_license(naf:)\ +%{shrink:\ + %{__cargo} tree \ + --workspace \ + --offline \ + --edges no-build,no-dev,no-proc-macro \ + --no-dedupe \ + --target all \ + %{__cargo_parse_opts %{-n} %{-a} %{-f:-f%{-f*}}} \ + --prefix none \ + --format "{l}: {p}" \ + | sed -e "s: ($(pwd)[^)]*)::g" -e "s: / :/:g" -e "s:/: OR :g" \ + | sort -u +} + +# cargo_license_summary: print license summary for all crate dependencies +# +# This macro works in the same way as cargo_license, except that it only prints +# a list of licenses, and not the complete license information for every crate +# in the dependency tree. This is useful for determining the correct License +# tag for packages that contain compiled Rust binaries. +%cargo_license_summary(naf:)\ +%{shrink:\ + %{__cargo} tree \ + --workspace \ + --offline \ + --edges no-build,no-dev,no-proc-macro \ + --no-dedupe \ + --target all \ + %{__cargo_parse_opts %{-n} %{-a} %{-f:-f%{-f*}}} \ + --prefix none \ + --format "# {l}" \ + | sed -e "s: / :/:g" -e "s:/: OR :g" \ + | sort -u \ +} diff --git a/SOURCES/rustc-1.71.0-disable-http2.patch b/SOURCES/rustc-1.71.0-disable-http2.patch deleted file mode 100644 index 34fdab3..0000000 --- a/SOURCES/rustc-1.71.0-disable-http2.patch +++ /dev/null @@ -1,92 +0,0 @@ ---- rustc-beta-src/src/tools/cargo/Cargo.lock.orig 2023-07-07 17:30:04.817452621 -0700 -+++ rustc-beta-src/src/tools/cargo/Cargo.lock 2023-07-07 17:30:27.777988139 -0700 -@@ -734,7 +734,6 @@ - dependencies = [ - "cc", - "libc", -- "libnghttp2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", -@@ -1954,16 +1953,6 @@ - checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" - - [[package]] --name = "libnghttp2-sys" --version = "0.1.7+1.45.0" --source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "57ed28aba195b38d5ff02b9170cbff627e336a20925e43b4945390401c5dc93f" --dependencies = [ -- "cc", -- "libc", --] -- --[[package]] - name = "libz-sys" - version = "1.1.8" - source = "registry+https://github.com/rust-lang/crates.io-index" ---- rustc-beta-src/src/tools/cargo/Cargo.toml.orig 2023-07-07 17:30:04.819452581 -0700 -+++ rustc-beta-src/src/tools/cargo/Cargo.toml 2023-07-07 17:30:24.133061874 -0700 -@@ -118,7 +118,7 @@ - cargo-util.workspace = true - clap = { workspace = true, features = ["wrap_help"] } - crates-io.workspace = true --curl = { workspace = true, features = ["http2"] } -+curl = { workspace = true, features = [] } - curl-sys.workspace = true - env_logger.workspace = true - filetime.workspace = true ---- rustc-beta-src/src/tools/cargo/src/cargo/core/package.rs.orig 2023-06-24 10:27:37.000000000 -0700 -+++ rustc-beta-src/src/tools/cargo/src/cargo/core/package.rs 2023-07-07 17:30:04.819452581 -0700 -@@ -407,16 +407,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 ---- rustc-beta-src/src/tools/cargo/src/cargo/sources/registry/http_remote.rs.orig 2023-06-24 10:27:37.000000000 -0700 -+++ rustc-beta-src/src/tools/cargo/src/cargo/sources/registry/http_remote.rs 2023-07-07 17:30:04.819452581 -0700 -@@ -229,16 +229,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; - - if !self.quiet { - self.config ---- rustc-beta-src/src/tools/cargo/src/cargo/util/network/mod.rs.orig 2023-06-24 10:27:37.000000000 -0700 -+++ rustc-beta-src/src/tools/cargo/src/cargo/util/network/mod.rs 2023-07-07 17:30:04.819452581 -0700 -@@ -26,7 +26,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/SOURCES/rustc-1.71.0-disable-libssh2.patch b/SOURCES/rustc-1.71.0-disable-libssh2.patch deleted file mode 100644 index ba61454..0000000 --- a/SOURCES/rustc-1.71.0-disable-libssh2.patch +++ /dev/null @@ -1,42 +0,0 @@ ---- rustc-beta-src/src/tools/cargo/Cargo.lock.orig 2023-06-24 10:27:37.000000000 -0700 -+++ rustc-beta-src/src/tools/cargo/Cargo.lock 2023-07-07 17:12:23.406932870 -0700 -@@ -1942,7 +1942,6 @@ - dependencies = [ - "cc", - "libc", -- "libssh2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", -@@ -1965,20 +1964,6 @@ - ] - - [[package]] --name = "libssh2-sys" --version = "0.3.0" --source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" --dependencies = [ -- "cc", -- "libc", -- "libz-sys", -- "openssl-sys", -- "pkg-config", -- "vcpkg", --] -- --[[package]] - name = "libz-sys" - version = "1.1.8" - source = "registry+https://github.com/rust-lang/crates.io-index" ---- rustc-beta-src/src/tools/cargo/Cargo.toml.orig 2023-06-24 10:27:37.000000000 -0700 -+++ rustc-beta-src/src/tools/cargo/Cargo.toml 2023-07-07 17:12:00.688392750 -0700 -@@ -31,7 +31,7 @@ - filetime = "0.2.9" - flate2 = { version = "1.0.3", default-features = false, features = ["zlib"] } - fwdansi = "1.1.0" --git2 = "0.17.1" -+git2 = { version = "0.17.1", default-features = false, features = ["https"] } - git2-curl = "0.18.0" - gix = { version = "0.44.1", default-features = false, features = ["blocking-http-transport-curl", "progress-tree"] } - gix-features-for-configuration-only = { version = "0.29.0", package = "gix-features", features = [ "parallel" ] } diff --git a/SOURCES/rustc-1.75.0-disable-libssh2.patch b/SOURCES/rustc-1.75.0-disable-libssh2.patch new file mode 100644 index 0000000..2b06046 --- /dev/null +++ b/SOURCES/rustc-1.75.0-disable-libssh2.patch @@ -0,0 +1,42 @@ +--- ./rustc-beta-src/src/tools/cargo/Cargo.lock.orig 2023-11-12 12:24:35.000000000 -0800 ++++ rustc-beta-src/src/tools/cargo/Cargo.lock 2023-11-14 17:01:32.010125953 -0800 +@@ -2027,7 +2027,6 @@ + dependencies = [ + "cc", + "libc", +- "libssh2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", +@@ -2060,20 +2059,6 @@ + ] + + [[package]] +-name = "libssh2-sys" +-version = "0.3.0" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" +-dependencies = [ +- "cc", +- "libc", +- "libz-sys", +- "openssl-sys", +- "pkg-config", +- "vcpkg", +-] +- +-[[package]] + name = "libz-sys" + version = "1.1.9" + source = "registry+https://github.com/rust-lang/crates.io-index" +--- ./rustc-beta-src/src/tools/cargo/Cargo.toml.orig 2023-11-14 17:01:32.010125953 -0800 ++++ rustc-beta-src/src/tools/cargo/Cargo.toml 2023-11-14 17:02:44.645097701 -0800 +@@ -40,7 +40,7 @@ + curl-sys = "0.4.68" + filetime = "0.2.22" + flate2 = { version = "1.0.28", default-features = false, features = ["zlib"] } +-git2 = "0.18.1" ++git2 = { version = "0.18.1", default-features = false, features = ["https"] } + git2-curl = "0.19.0" + gix = { version = "0.55.2", default-features = false, features = ["blocking-http-transport-curl", "progress-tree", "revision"] } + gix-features-for-configuration-only = { version = "0.35.0", package = "gix-features", features = [ "parallel" ] } diff --git a/SPECS/rust.spec b/SPECS/rust.spec index a6c5c42..af52df5 100644 --- a/SPECS/rust.spec +++ b/SPECS/rust.spec @@ -1,16 +1,22 @@ +Name: rust +Version: 1.75.0 +Release: 1%{?dist} +Summary: The Rust Programming Language +License: (Apache-2.0 OR MIT) AND (Artistic-2.0 AND BSD-3-Clause AND ISC AND MIT AND MPL-2.0 AND Unicode-DFS-2016) +# ^ written as: (rust itself) and (bundled libraries) +URL: https://www.rust-lang.org + # Only x86_64, i686, and aarch64 are Tier 1 platforms at this time. # https://doc.rust-lang.org/nightly/rustc/platform-support.html %global rust_arches x86_64 i686 aarch64 ppc64le s390x - -# The channel can be stable, beta, or nightly -%{!?channel: %global channel stable} +ExclusiveArch: %{rust_arches} # To bootstrap from scratch, set the channel and date from src/stage0.json # e.g. 1.59.0 wants rustc: 1.58.0-2022-01-13 # or nightly wants some beta-YYYY-MM-DD -%global bootstrap_version 1.70.0 -%global bootstrap_channel 1.70.0 -%global bootstrap_date 2023-06-01 +%global bootstrap_version 1.74.0 +%global bootstrap_channel 1.74.0 +%global bootstrap_date 2023-11-16 # Only the specified arches will use bootstrap binaries. # NOTE: Those binaries used to be uploaded with every new release, but that was @@ -30,42 +36,51 @@ %if 0%{?fedora} %global mingw_targets i686-pc-windows-gnu x86_64-pc-windows-gnu %endif -%if 0%{?fedora} || 0%{?rhel} >= 8 %global wasm_targets wasm32-unknown-unknown wasm32-wasi +%if 0%{?fedora} || 0%{?rhel} >= 10 +%global extra_targets x86_64-unknown-none x86_64-unknown-uefi %endif %endif +%global all_targets %{?mingw_targets} %{?wasm_targets} %{?extra_targets} +%define target_enabled() %{lua: + print(string.find(rpm.expand(" %{all_targets} "), rpm.expand(" %1 "), 1, true) or 0) +} # 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_ref wasi-sdk-20 +#global wasi_libc_ref wasi-sdk-20 +%global wasi_libc_ref bd950eb128bff337153de217b11270f948d04bb4 %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} +%if 0%{?fedora} +%bcond_with bundled_wasi_libc +%else +%bcond_without bundled_wasi_libc +%endif # Using llvm-static may be helpful as an opt-in, e.g. to aid LLVM rebases. %bcond_with llvm_static # We can also choose to just use Rust's bundled LLVM, in case the system LLVM -# is insufficient. Rust currently requires LLVM 14.0+. -%global min_llvm_version 14.0.0 -%global bundled_llvm_version 16.0.5 +# is insufficient. Rust currently requires LLVM 15.0+. +%global min_llvm_version 15.0.0 +%global bundled_llvm_version 17.0.5 %bcond_with bundled_llvm -# Requires stable libgit2 1.6, and not the next minor soname change. +# Requires stable libgit2 1.7, and not the next minor soname change. # This needs to be consistent with the bindings in vendor/libgit2-sys. -%global min_libgit2_version 1.6.4 -%global next_libgit2_version 1.7.0~ -%global bundled_libgit2_version 1.6.4 -%if 0%{?fedora} >= 38 +%global min_libgit2_version 1.7.1 +%global next_libgit2_version 1.8.0~ +%global bundled_libgit2_version 1.7.1 +%if 0%{?fedora} >= 39 %bcond_with bundled_libgit2 %else %bcond_without bundled_libgit2 %endif -# needs libssh2_userauth_publickey_frommemory -%global min_libssh2_version 1.6.0 %if 0%{?rhel} # Disable cargo->libgit2->libssh2 on RHEL, as it's not approved for FIPS (rhbz1732949) %bcond_without disabled_libssh2 @@ -73,39 +88,26 @@ %bcond_with disabled_libssh2 %endif -%if 0%{?rhel} && 0%{?rhel} < 8 -%bcond_with curl_http2 +%if 0%{?__isa_bits} == 32 +# Disable PGO on 32-bit to reduce build memory +%bcond_with rustc_pgo %else -%bcond_without curl_http2 +%bcond_without rustc_pgo %endif -# LLDB isn't available everywhere... -%if 0%{?rhel} && 0%{?rhel} < 8 -%bcond_with lldb -%else -%bcond_without lldb -%endif - -Name: rust -Version: 1.71.1 -Release: 1%{?dist} -Summary: The Rust Programming Language -License: (ASL 2.0 or MIT) and (BSD and MIT) -# ^ written as: (rust itself) and (bundled libraries) -URL: https://www.rust-lang.org -ExclusiveArch: %{rust_arches} - -%if "%{channel}" == "stable" -%global rustc_package rustc-%{version}-src -%else -%global rustc_package rustc-%{channel}-src -%endif +# Detect non-stable channels from the version, like 1.74.0~beta.1 +%{lua: do + local version = rpm.expand("%{version}") + local version_channel, subs = string.gsub(version, "^.*~(%w+).*$", "%1", 1) + rpm.define("channel " .. (subs ~= 0 and version_channel or "stable")) + rpm.define("rustc_package rustc-" .. version_channel .. "-src") +end} 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 +# By default, rust tries to use "rust-lld" as a linker for some targets. +Patch1: 0001-Use-lld-provided-by-system.patch # Set a substitute-path in rust-gdb for standard library sources. Patch2: rustc-1.70.0-rust-gdb-substitute-path.patch @@ -114,12 +116,14 @@ Patch2: rustc-1.70.0-rust-gdb-substitute-path.patch # TODO: upstream this ability into the actual build configuration Patch3: 0001-Let-environment-variables-override-some-default-CPUs.patch -# Enable the profiler runtime for native hosts -# https://github.com/rust-lang/rust/pull/114069 -Patch4: 0001-Allow-using-external-builds-of-the-compiler-rt-profi.patch +# Override the default self-contained system libraries +# TODO: the first can probably be upstreamed, but the second is hard-coded, +# and we're only applying that if not with bundled_wasi_libc. +Patch4: 0001-bootstrap-allow-disabling-target-self-contained.patch +Patch5: 0002-set-an-external-library-path-for-wasm32-wasi.patch -# https://github.com/rust-lang/rust/pull/114440 -Patch5: 0001-bootstrap-config-fix-version-comparison-bug.patch +# https://github.com/rust-lang/rust/pull/117982 +Patch6: 0001-bootstrap-only-show-PGO-warnings-when-verbose.patch ### RHEL-specific patches below ### @@ -127,11 +131,7 @@ Patch5: 0001-bootstrap-config-fix-version-comparison-bug.patch Source100: macros.rust-toolset # Disable cargo->libgit2->libssh2 on RHEL, as it's not approved for FIPS (rhbz1732949) -Patch100: rustc-1.71.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.71.0-disable-http2.patch +Patch100: rustc-1.75.0-disable-libssh2.patch # Get the Rust triple for any arch. %{lua: function rust_triple(arch) @@ -149,14 +149,12 @@ Patch101: rustc-1.71.0-disable-http2.patch return arch.."-unknown-linux-"..abi end} -# Get the environment form of a Rust triple -%{lua: function rust_triple_env(triple) - local sub = string.gsub(triple, "-", "_") - return string.upper(sub) -end} - %global rust_triple %{lua: print(rust_triple(rpm.expand("%{_target_cpu}")))} -%global rust_triple_env %{lua: print(rust_triple_env(rpm.expand("%{rust_triple}")))} + +# Get the environment form of the Rust triple +%global rust_triple_env %{lua: + print(string.upper(string.gsub(rpm.expand("%{rust_triple}"), "-", "_"))) +} %if %defined bootstrap_arches # For each bootstrap arch, add an additional binary Source. @@ -190,12 +188,7 @@ end} Provides: bundled(%{name}-bootstrap) = %{bootstrap_version} %else BuildRequires: cargo >= %{bootstrap_version} -%if 0%{?rhel} && 0%{?rhel} < 8 -BuildRequires: %{name} >= %{bootstrap_version} -BuildConflicts: %{name} > %{version} -%else BuildRequires: (%{name} >= %{bootstrap_version} with %{name} <= %{version}) -%endif %global local_rust_root %{_prefix} %endif @@ -215,7 +208,7 @@ BuildRequires: (pkgconfig(libgit2) >= %{min_libgit2_version} with pkgconfig(lib %endif %if %{without disabled_libssh2} -BuildRequires: pkgconfig(libssh2) >= %{min_libssh2_version} +BuildRequires: pkgconfig(libssh2) %endif %if 0%{?rhel} == 8 @@ -226,14 +219,11 @@ BuildRequires: python3 BuildRequires: python3-rpm-macros %if %with bundled_llvm -BuildRequires: cmake3 >= 3.13.4 +BuildRequires: cmake >= 3.20.0 BuildRequires: ninja-build Provides: bundled(llvm) = %{bundled_llvm_version} %else -BuildRequires: cmake >= 2.8.11 -%if 0%{?epel} == 7 -%global llvm llvm14 -%endif +BuildRequires: cmake >= 3.5.1 %if %defined llvm %global llvm_root %{_libdir}/%{llvm} %else @@ -268,20 +258,7 @@ Requires: %{name}-std-static%{?_isa} = %{version}-%{release} # https://github.com/rust-lang/rust/issues/11937 Requires: /usr/bin/cc -%if 0%{?epel} == 7 -%global devtoolset_name devtoolset-11 -BuildRequires: %{devtoolset_name}-binutils -BuildRequires: %{devtoolset_name}-gcc -BuildRequires: %{devtoolset_name}-gcc-c++ -%global devtoolset_bindir /opt/rh/%{devtoolset_name}/root/usr/bin -%global __cc %{devtoolset_bindir}/gcc -%global __cxx %{devtoolset_bindir}/g++ -%global __ar %{devtoolset_bindir}/ar -%global __ranlib %{devtoolset_bindir}/ranlib -%global __strip %{devtoolset_bindir}/strip -%else %global __ranlib %{_bindir}/ranlib -%endif # ALL Rust libraries are private, because they don't keep an ABI. %global _privatelibs lib(.*-[[:xdigit:]]{16}*|rustc.*)[.]so.* @@ -293,14 +270,7 @@ BuildRequires: %{devtoolset_name}-gcc-c++ # 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)]. -%if 0%{?rhel} && 0%{?rhel} < 8 -# eu-strip is very eager by default, so we have to limit it to -g, only debugging symbols. -%global _find_debuginfo_opts -g -%undefine _include_minidebuginfo -%else -# Newer find-debuginfo.sh supports --keep-section, which is preferable. rhbz1465997 %global _find_debuginfo_opts --keep-section .rustc -%endif %if %{without bundled_llvm} %if "%{llvm_root}" == "%{_prefix}" || 0%{?scl:1} @@ -325,7 +295,11 @@ BuildRequires: mingw64-winpthreads-static %endif %if %defined wasm_targets +%if %with bundled_wasi_libc BuildRequires: clang +%else +BuildRequires: wasi-libc-static +%endif BuildRequires: lld # brp-strip-static-archive breaks the archive index for wasm %global __os_install_post \ @@ -334,10 +308,8 @@ find '%{buildroot}%{rustlibdir}'/wasm*/lib -type f -regex '.*\\.\\(a\\|rlib\\)' %{nil} %endif -%if 0%{?fedora} || 0%{?rhel} >= 8 # For profiler_builtins BuildRequires: compiler-rt -%endif # This component was removed as of Rust 1.69.0. # https://github.com/rust-lang/rust/pull/101841 @@ -360,66 +332,69 @@ Requires: glibc-devel%{?_isa} >= 2.17 This package includes the standard libraries for building applications written in Rust. -%if %defined mingw_targets -%{lua: do - for triple in string.gmatch(rpm.expand("%{mingw_targets}"), "%S+") do - local subs = { - triple = triple, - name = rpm.expand("%{name}"), - verrel = rpm.expand("%{version}-%{release}"), - mingw = string.sub(triple, 1, 4) == "i686" and "mingw32" or "mingw64", - } - local s = string.gsub([[ +%global target_package() \ +%package std-static-%1 \ +Summary: Standard library for Rust %1 \ +Requires: %{name} = %{version}-%{release} -%package std-static-{{triple}} -Summary: Standard library for Rust {{triple}} +%global target_description() \ +%description std-static-%1 \ +This package includes the standard libraries for building applications \ +written in Rust for the %2 target %1. + +%if %target_enabled i686-pc-windows-gnu +%target_package i686-pc-windows-gnu +Requires: mingw32-crt +Requires: mingw32-gcc +Requires: mingw32-winpthreads-static +Provides: mingw32-rust = %{version}-%{release} +Provides: mingw32-rustc = %{version}-%{release} BuildArch: noarch -Provides: {{mingw}}-rust = {{verrel}} -Provides: {{mingw}}-rustc = {{verrel}} -Requires: {{mingw}}-crt -Requires: {{mingw}}-gcc -Requires: {{mingw}}-winpthreads-static -Requires: {{name}} = {{verrel}} - -%description std-static-{{triple}} -This package includes the standard libraries for building applications -written in Rust for the MinGW target {{triple}}. - -]], "{{(%w+)}}", subs) - print(s) - end -end} +%target_description i686-pc-windows-gnu MinGW %endif -%if %defined wasm_targets -%{lua: do - for triple in string.gmatch(rpm.expand("%{wasm_targets}"), "%S+") do - local subs = { - triple = triple, - name = rpm.expand("%{name}"), - verrel = rpm.expand("%{version}-%{release}"), - wasi = string.find(triple, "-wasi") and 1 or 0, - } - local s = string.gsub([[ +%if %target_enabled x86_64-pc-windows-gnu +%target_package x86_64-pc-windows-gnu +Requires: mingw64-crt +Requires: mingw64-gcc +Requires: mingw64-winpthreads-static +Provides: mingw64-rust = %{version}-%{release} +Provides: mingw64-rustc = %{version}-%{release} +BuildArch: noarch +%target_description x86_64-pc-windows-gnu MinGW +%endif -%package std-static-{{triple}} -Summary: Standard library for Rust {{triple}} +%if %target_enabled wasm32-unknown-unknown +%target_package wasm32-unknown-unknown +Requires: lld >= 8.0 # FIX: we can't be noarch while excluding s390x for lack of lld # BuildArch: noarch -Requires: {{name}} = {{verrel}} -Requires: lld >= 8.0 -%if {{wasi}} -Provides: bundled(wasi-libc) +%target_description wasm32-unknown-unknown WebAssembly %endif -%description std-static-{{triple}} -This package includes the standard libraries for building applications -written in Rust for the WebAssembly target {{triple}}. +%if %target_enabled wasm32-wasi +%target_package wasm32-wasi +Requires: lld >= 8.0 +%if %with bundled_wasi_libc +Provides: bundled(wasi-libc) +%else +Requires: wasi-libc-static +%endif +# FIX: we can't be noarch while excluding s390x for lack of lld +# BuildArch: noarch +%target_description wasm32-wasi WebAssembly +%endif -]], "{{(%w+)}}", subs) - print(s) - end -end} +%if %target_enabled x86_64-unknown-none +%target_package x86_64-unknown-none +Requires: lld +%target_description x86_64-unknown-none embedded +%endif + +%if %target_enabled x86_64-unknown-uefi +%target_package x86_64-unknown-uefi +Requires: lld +%target_description x86_64-unknown-uefi embedded %endif @@ -442,8 +417,6 @@ This package includes the rust-gdb script, which allows easier debugging of Rust programs. -%if %with lldb - %package lldb Summary: LLDB pretty printers for Rust BuildArch: noarch @@ -455,8 +428,6 @@ Requires: %{name}-debugger-common = %{version}-%{release} This package includes the rust-lldb script, which allows easier debugging of Rust programs. -%endif - %package doc Summary: Documentation for Rust @@ -500,6 +471,9 @@ and ensure that you'll always get a repeatable build. Summary: Tool to find and fix Rust formatting issues Requires: cargo +# /usr/bin/rustfmt is dynamically linked against internal rustc libs +Requires: %{name}%{?_isa} = %{version}-%{release} + # The component/package was rustfmt-preview until Rust 1.31. Obsoletes: rustfmt-preview < 1.0.0 Provides: rustfmt-preview = %{version}-%{release} @@ -512,11 +486,7 @@ A tool for formatting Rust code according to style guidelines. Summary: Rust implementation of the Language Server Protocol # The standard library sources are needed for most functionality. -%if 0%{?rhel} && 0%{?rhel} < 8 -Requires: %{name}-src -%else Recommends: %{name}-src -%endif # 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. @@ -547,11 +517,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 -%if 0%{?rhel} && 0%{?rhel} < 8 -Requires: %{name}-std-static = %{version}-%{release} -%else Recommends: %{name}-std-static = %{version}-%{release} -%endif %description src This package includes source files for the Rust standard library. It may be @@ -587,8 +553,9 @@ test -f '%{local_rust_root}/bin/cargo' test -f '%{local_rust_root}/bin/rustc' %endif -%if %defined wasm_targets +%if %{defined wasm_targets} && %{with bundled_wasi_libc} %setup -q -n %{wasi_libc_name} -T -b 1 +rm -rf %{wasi_libc_dir}/dlmalloc/ %endif %setup -q -n %{rustc_package} @@ -597,17 +564,15 @@ test -f '%{local_rust_root}/bin/rustc' %patch -P2 -p1 %patch -P3 -p1 %patch -P4 -p1 +%if %without bundled_wasi_libc %patch -P5 -p1 +%endif +%patch -P6 -p1 %if %with disabled_libssh2 %patch -P100 -p1 %endif -%if %without curl_http2 -%patch -P101 -p1 -rm -rf vendor/libnghttp2-sys*/ -%endif - # Use our explicit python3 first sed -i.try-python -e '/^try python3 /i try "%{__python3}" "$@"' ./configure @@ -619,18 +584,21 @@ rm -rf src/llvm-project/ mkdir -p src/llvm-project/libunwind/ %endif -# Remove other unused vendored libraries -rm -rf vendor/curl-sys*/curl/ -rm -rf vendor/*jemalloc-sys*/jemalloc/ -rm -rf vendor/libffi-sys*/libffi/ -rm -rf vendor/libmimalloc-sys*/c_src/mimalloc/ -rm -rf vendor/libssh2-sys*/libssh2/ -rm -rf vendor/libz-sys*/src/zlib{,-ng}/ -rm -rf vendor/lzma-sys*/xz-*/ -rm -rf vendor/openssl-src*/openssl/ + +# Remove other unused vendored libraries. This leaves the directory in place, +# because some build scripts watch them, e.g. "cargo:rerun-if-changed=curl". +%define clear_dir() find ./%1 -mindepth 1 -delete +%clear_dir vendor/curl-sys*/curl/ +%clear_dir vendor/*jemalloc-sys*/jemalloc/ +%clear_dir vendor/libffi-sys*/libffi/ +%clear_dir vendor/libmimalloc-sys*/c_src/mimalloc/ +%clear_dir vendor/libssh2-sys*/libssh2/ +%clear_dir vendor/libz-sys*/src/zlib{,-ng}/ +%clear_dir vendor/lzma-sys*/xz-*/ +%clear_dir vendor/openssl-src*/openssl/ %if %without bundled_libgit2 -rm -rf vendor/libgit2-sys*/libgit2/ +%clear_dir vendor/libgit2-sys*/libgit2/ %endif %if %with disabled_libssh2 @@ -638,13 +606,7 @@ rm -rf vendor/libssh2-sys*/ %endif # This only affects the transient rust-installer, but let it use our dynamic xz-libs -sed -i.lzma -e '/LZMA_API_STATIC/d' src/bootstrap/tool.rs - -%if %{with bundled_llvm} && 0%{?epel} == 7 -mkdir -p cmake-bin -ln -s /usr/bin/cmake3 cmake-bin/cmake -%global cmake_path $PWD/cmake-bin -%endif +sed -i.lzma -e '/LZMA_API_STATIC/d' src/bootstrap/src/core/build_steps/tool.rs %if %{without bundled_llvm} && %{with llvm_static} # Static linking to distro LLVM needs to add -lffi @@ -670,7 +632,7 @@ find -name '*.rs' -type f -perm /111 -exec chmod -v -x '{}' '+' %endif # These are similar to __cflags_arch_* in /usr/lib/rpm/redhat/macros -%{lua: function rustc_target_cpus() +%global rustc_target_cpus %{lua: do local fedora = tonumber(rpm.expand("0%{?fedora}")) local rhel = tonumber(rpm.expand("0%{?rhel}")) local env = @@ -679,14 +641,11 @@ find -name '*.rs' -type f -perm /111 -exec chmod -v -x '{}' '+' .. " RUSTC_TARGET_CPU_S390X=" .. ((rhel >= 9) and "z14" or (rhel == 8 or fedora >= 38) and "z13" or (fedora >= 26) and "zEC12" or (rhel == 7) and "z196" or "z10") - return env + print(env) end} # Set up shared environment variables for build/install/check -%global rust_env %{?rustflags:RUSTFLAGS="%{rustflags}"} %{lua: print(rustc_target_cpus())} -%if %defined cmake_path -%global rust_env %{?rust_env} PATH="%{cmake_path}:$PATH" -%endif +%global rust_env %{?rustflags:RUSTFLAGS="%{rustflags}"} %{rustc_target_cpus} %if %without disabled_libssh2 # convince libssh2-sys to use the distro libssh2 %global rust_env %{?rust_env} LIBSSH2_SYS_USE_PKG_CONFIG=1 @@ -697,17 +656,13 @@ end} %{export_rust_env} %ifarch %{arm} %{ix86} -# full debuginfo is exhausting memory; just do libstd for now +# full debuginfo and compiler opts are exhausting memory; just do libstd for now # https://github.com/rust-lang/rust/issues/45854 -%if 0%{?rhel} && 0%{?rhel} < 8 -# Older rpmbuild didn't work with partial debuginfo coverage. -%global debug_package %{nil} -%define enable_debuginfo --debuginfo-level=0 -%else %define enable_debuginfo --debuginfo-level=0 --debuginfo-level-std=2 -%endif +%define enable_rust_opts --set rust.codegen-units-std=1 %else %define enable_debuginfo --debuginfo-level=2 +%define enable_rust_opts --set rust.codegen-units=1 --set rust.lto=thin %endif # Some builders have relatively little memory for their CPU count. @@ -719,45 +674,40 @@ if [ "$max_cpus" -ge 1 -a "$max_cpus" -lt "$ncpus" ]; then fi %if %defined mingw_targets -%{lua: do - local cfg = "" - for triple in string.gmatch(rpm.expand("%{mingw_targets}"), "%S+") do - local subs = { - triple = triple, - mingw = string.sub(triple, 1, 4) == "i686" and "mingw32" or "mingw64", - } - 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) - cfg = cfg .. " " .. s - end - cfg = string.gsub(cfg, "%s+", " ") - rpm.define("mingw_target_config " .. cfg) -end} +%define mingw_target_config %{shrink: + --set target.i686-pc-windows-gnu.linker=%{mingw32_cc} + --set target.i686-pc-windows-gnu.cc=%{mingw32_cc} + --set target.i686-pc-windows-gnu.ar=%{mingw32_ar} + --set target.i686-pc-windows-gnu.ranlib=%{mingw32_ranlib} + --set target.i686-pc-windows-gnu.self-contained=false + --set target.x86_64-pc-windows-gnu.linker=%{mingw64_cc} + --set target.x86_64-pc-windows-gnu.cc=%{mingw64_cc} + --set target.x86_64-pc-windows-gnu.ar=%{mingw64_ar} + --set target.x86_64-pc-windows-gnu.ranlib=%{mingw64_ranlib} + --set target.x86_64-pc-windows-gnu.self-contained=false +} %endif %if %defined wasm_targets -%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 = "" - for triple in string.gmatch(rpm.expand("%{wasm_targets}"), "%S+") do - if string.find(triple, "-wasi") then - cfg = cfg .. " --set target." .. triple .. ".wasi-root=" .. wasi_root - end - end - rpm.define("wasm_target_config "..cfg) -end} +%if %with bundled_wasi_libc +%make_build --quiet -C %{wasi_libc_dir} MALLOC_IMPL=emmalloc CC=clang AR=llvm-ar NM=llvm-nm +%define wasm_target_config --set target.wasm32-wasi.wasi-root=%{wasi_libc_dir}/sysroot +%else +%define wasm_target_config %{shrink: + --set target.wasm32-wasi.wasi-root=%{_prefix}/wasm32-wasi + --set target.wasm32-wasi.self-contained=false +} +%endif %endif -%if 0%{?fedora} || 0%{?rhel} >= 8 -# The exact profiler path is version dependent, and uses LLVM-specific -# arch names in the filename, but this find is good enough for now... -PROFILER=$(find %{_libdir}/clang -type f -name 'libclang_rt.profile-*.a') +# Find the compiler-rt library for the Rust profiler_builtins crate. +%if 0%{?clang_major_version} >= 17 +%define profiler %{clang_resource_dir}/lib/%{_arch}-redhat-linux-gnu/libclang_rt.profile.a +%else +# The exact profiler path is version dependent.. +%define profiler %(echo %{_libdir}/clang/??/lib/libclang_rt.profile-*.a) %endif +test -r "%{profiler}" %configure --disable-option-checking \ --libdir=%{common_libdir} \ @@ -767,7 +717,7 @@ PROFILER=$(find %{_libdir}/clang -type f -name 'libclang_rt.profile-*.a') --set target.%{rust_triple}.cxx=%{__cxx} \ --set target.%{rust_triple}.ar=%{__ar} \ --set target.%{rust_triple}.ranlib=%{__ranlib} \ - ${PROFILER:+--set target.%{rust_triple}.profiler="$PROFILER"} \ + --set target.%{rust_triple}.profiler="%{profiler}" \ %{?mingw_target_config} \ %{?wasm_target_config} \ --python=%{__python3} \ @@ -779,7 +729,7 @@ PROFILER=$(find %{_libdir}/clang -type f -name 'libclang_rt.profile-*.a') --disable-llvm-static-stdcpp \ --disable-rpath \ %{enable_debuginfo} \ - --set rust.codegen-units-std=1 \ + %{enable_rust_opts} \ --set build.build-stage=2 \ --set build.doc-stage=2 \ --set build.install-stage=2 \ @@ -792,11 +742,32 @@ PROFILER=$(find %{_libdir}/clang -type f -name 'libclang_rt.profile-*.a') --release-channel=%{channel} \ --release-description="%{?fedora:Fedora }%{?rhel:Red Hat }%{version}-%{release}" -%{__python3} ./x.py build -j "$ncpus" -%{__python3} ./x.py doc +%global __x %{__python3} ./x.py +%global __xk %{__x} --keep-stage=0 --keep-stage=1 -for triple in %{?mingw_targets} %{?wasm_targets}; do - %{__python3} ./x.py build --target=$triple std +%if %with rustc_pgo +# Build the compiler with profile instrumentation +PROFRAW="$PWD/build/profiles" +PROFDATA="$PWD/build/rustc.profdata" +mkdir -p "$PROFRAW" +%{__x} build -j "$ncpus" sysroot --rust-profile-generate="$PROFRAW" +# Build cargo as a workload to generate compiler profiles +env LLVM_PROFILE_FILE="$PROFRAW/default_%%m_%%p.profraw" %{__xk} build cargo +llvm-profdata merge -o "$PROFDATA" "$PROFRAW" +rm -r "$PROFRAW" build/%{rust_triple}/stage2*/ +# Rebuild the compiler using the profile data +%{__x} build -j "$ncpus" sysroot --rust-profile-use="$PROFDATA" +%else +# Build the compiler without PGO +%{__x} build -j "$ncpus" sysroot +%endif + +# Build everything else normally +%{__xk} build +%{__xk} doc + +for triple in %{?all_targets} ; do + %{__xk} build --target=$triple std done %install @@ -805,10 +776,10 @@ done %endif %{export_rust_env} -DESTDIR=%{buildroot} %{__python3} ./x.py install +DESTDIR=%{buildroot} %{__xk} install -for triple in %{?mingw_targets} %{?wasm_targets}; do - DESTDIR=%{buildroot} %{__python3} ./x.py install --target=$triple std +for triple in %{?all_targets} ; do + DESTDIR=%{buildroot} %{__xk} install --target=$triple std done # The rls stub doesn't have an install target, but we can just copy it. @@ -878,11 +849,6 @@ mkdir -p %{buildroot}%{_datadir}/cargo/registry mkdir -p %{buildroot}%{_docdir}/cargo ln -sT ../rust/html/cargo/ %{buildroot}%{_docdir}/cargo/html -%if %without lldb -rm -f %{buildroot}%{_bindir}/rust-lldb -rm -f %{buildroot}%{rustlibdir}/etc/lldb_* -%endif - # We don't want Rust copies of LLVM tools (rust-lld, rust-llvm-dwp) rm -f %{buildroot}%{rustlibdir}/%{rust_triple}/bin/rust-ll* @@ -899,34 +865,41 @@ rm -f %{buildroot}%{rustlibdir}/%{rust_triple}/bin/rust-ll* %{export_rust_env} # Sanity-check the installed binaries, debuginfo-stripped and all. -%{buildroot}%{_bindir}/cargo new build/hello-world -env RUSTC=%{buildroot}%{_bindir}/rustc \ - LD_LIBRARY_PATH="%{buildroot}%{_libdir}:$LD_LIBRARY_PATH" \ - %{buildroot}%{_bindir}/cargo run --manifest-path build/hello-world/Cargo.toml +TMP_HELLO=$(mktemp -d) +( + cd "$TMP_HELLO" + export RUSTC=%{buildroot}%{_bindir}/rustc \ + LD_LIBRARY_PATH="%{buildroot}%{_libdir}:$LD_LIBRARY_PATH" + %{buildroot}%{_bindir}/cargo init --name hello-world + %{buildroot}%{_bindir}/cargo run --verbose -# 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 + # Sanity-check that code-coverage builds and runs + env RUSTFLAGS="-Cinstrument-coverage" %{buildroot}%{_bindir}/cargo run --verbose + test -r default_*.profraw + + # Try a build sanity-check for other std-enabled targets + for triple in %{?mingw_targets} %{?wasm_targets}; do + %{buildroot}%{_bindir}/cargo build --verbose --target=$triple + done +) +rm -rf "$TMP_HELLO" # 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. # Bootstrap is excluded because it's not something we ship, and a lot of its # tests are geared toward the upstream CI environment. -timeout -v 90m %{__python3} ./x.py test --no-fail-fast --exclude src/bootstrap || : +timeout -v 90m %{__xk} test --no-fail-fast --skip src/bootstrap || : rm -rf "./build/%{rust_triple}/test/" -timeout -v 30m %{__python3} ./x.py test --no-fail-fast cargo || : +timeout -v 30m %{__xk} test --no-fail-fast cargo || : rm -rf "./build/%{rust_triple}/stage2-tools/%{rust_triple}/cit/" -timeout -v 30m %{__python3} ./x.py test --no-fail-fast clippy || : +timeout -v 30m %{__xk} test --no-fail-fast clippy || : -timeout -v 30m %{__python3} ./x.py test --no-fail-fast rust-analyzer || : +timeout -v 30m %{__xk} test --no-fail-fast rust-analyzer || : -timeout -v 30m %{__python3} ./x.py test --no-fail-fast rustfmt || : +timeout -v 30m %{__xk} test --no-fail-fast rustfmt || : %ldconfig_scriptlets @@ -953,58 +926,46 @@ timeout -v 30m %{__python3} ./x.py test --no-fail-fast rustfmt || : %dir %{rustlibdir}/%{rust_triple}/lib %{rustlibdir}/%{rust_triple}/lib/*.rlib +%global target_files() \ +%files std-static-%1 \ +%dir %{rustlibdir} \ +%dir %{rustlibdir}/%1 \ +%dir %{rustlibdir}/%1/lib \ +%{rustlibdir}/%1/lib/*.rlib -%if %defined mingw_targets -%{lua: do - for triple in string.gmatch(rpm.expand("%{mingw_targets}"), "%S+") do - local subs = { - triple = triple, - rustlibdir = rpm.expand("%{rustlibdir}"), - } - local s = string.gsub([[ - -%files std-static-{{triple}} -%dir {{rustlibdir}} -%dir {{rustlibdir}}/{{triple}} -%dir {{rustlibdir}}/{{triple}}/lib -{{rustlibdir}}/{{triple}}/lib/*.rlib -{{rustlibdir}}/{{triple}}/lib/rs*.o -%exclude {{rustlibdir}}/{{triple}}/lib/*.dll -%exclude {{rustlibdir}}/{{triple}}/lib/*.dll.a -%exclude {{rustlibdir}}/{{triple}}/lib/self-contained - -]], "{{(%w+)}}", subs) - print(s) - end -end} +%if %target_enabled i686-pc-windows-gnu +%target_files i686-pc-windows-gnu +%{rustlibdir}/i686-pc-windows-gnu/lib/rs*.o +%exclude %{rustlibdir}/i686-pc-windows-gnu/lib/*.dll +%exclude %{rustlibdir}/i686-pc-windows-gnu/lib/*.dll.a %endif - -%if %defined wasm_targets -%{lua: do - for triple in string.gmatch(rpm.expand("%{wasm_targets}"), "%S+") do - local subs = { - triple = triple, - rustlibdir = rpm.expand("%{rustlibdir}"), - wasi = string.find(triple, "-wasi") and 1 or 0, - } - local s = string.gsub([[ - -%files std-static-{{triple}} -%dir {{rustlibdir}} -%dir {{rustlibdir}}/{{triple}} -%dir {{rustlibdir}}/{{triple}}/lib -{{rustlibdir}}/{{triple}}/lib/*.rlib -%if {{wasi}} -%dir {{rustlibdir}}/{{triple}}/lib/self-contained -{{rustlibdir}}/{{triple}}/lib/self-contained/crt*.o -{{rustlibdir}}/{{triple}}/lib/self-contained/libc.a +%if %target_enabled x86_64-pc-windows-gnu +%target_files x86_64-pc-windows-gnu +%{rustlibdir}/x86_64-pc-windows-gnu/lib/rs*.o +%exclude %{rustlibdir}/x86_64-pc-windows-gnu/lib/*.dll +%exclude %{rustlibdir}/x86_64-pc-windows-gnu/lib/*.dll.a %endif -]], "{{(%w+)}}", subs) - print(s) - end -end} +%if %target_enabled wasm32-unknown-unknown +%target_files wasm32-unknown-unknown +%endif + +%if %target_enabled wasm32-wasi +%target_files wasm32-wasi +%if %with bundled_wasi_libc +%dir %{rustlibdir}/wasm32-wasi/lib/self-contained +%{rustlibdir}/wasm32-wasi/lib/self-contained/crt*.o +%{rustlibdir}/wasm32-wasi/lib/self-contained/libc.a +%endif +%endif + +%if %target_enabled x86_64-unknown-none +%target_files x86_64-unknown-none +%endif + +%if %target_enabled x86_64-unknown-uefi +%target_files x86_64-unknown-uefi %endif @@ -1020,11 +981,9 @@ end} %exclude %{_bindir}/rust-gdbgui -%if %with lldb %files lldb %{_bindir}/rust-lldb %{rustlibdir}/etc/lldb_* -%endif %files doc @@ -1041,7 +1000,6 @@ end} %license src/tools/cargo/LICENSE-{APACHE,MIT,THIRD-PARTY} %doc src/tools/cargo/README.md %{_bindir}/cargo -%{_libexecdir}/cargo* %{_mandir}/man1/cargo*.1* %{_sysconfdir}/bash_completion.d/cargo %{_datadir}/zsh/site-functions/_cargo @@ -1082,6 +1040,20 @@ end} %changelog +* Fri Jan 05 2024 Josh Stone - 1.75.0-1 +- Update to 1.75.0. + +* Wed Jan 03 2024 Josh Stone - 1.74.1-1 +- Update to 1.74.1. + +* Tue Oct 17 2023 Josh Stone - 1.73.0-1 +- Update to 1.73.0. +- Use emmalloc instead of CC0 dlmalloc when bundling wasi-libc + +* Thu Oct 12 2023 Josh Stone - 1.72.1-1 +- Update to 1.72.1. +- Migrated to SPDX license + * Tue Aug 08 2023 Josh Stone - 1.71.1-1 - Update to 1.71.1. - Security fix for CVE-2023-38497