import CS rust-1.75.0-1.el9

This commit is contained in:
eabdullin 2024-03-28 11:46:06 +00:00
parent c914ee843c
commit 5ec1832b91
15 changed files with 762 additions and 680 deletions

4
.gitignore vendored
View File

@ -1,2 +1,2 @@
SOURCES/rustc-1.71.1-src.tar.xz SOURCES/rustc-1.75.0-src.tar.xz
SOURCES/wasi-libc-wasi-sdk-20.tar.gz SOURCES/wasi-libc-bd950eb128bff337153de217b11270f948d04bb4.tar.gz

View File

@ -1,2 +1,2 @@
ffa03139b447604322d689eefe4e157a49c39f51 SOURCES/rustc-1.71.1-src.tar.xz 9ad7bb54dc9572c103b855cdcc823addbb34d15d SOURCES/rustc-1.75.0-src.tar.xz
8678e3510c88ef1de4d8c2940fa8ddad8f4eb084 SOURCES/wasi-libc-wasi-sdk-20.tar.gz 55eaa32c99cc8ec970f2db2d340a605724589f9b SOURCES/wasi-libc-bd950eb128bff337153de217b11270f948d04bb4.tar.gz

View File

@ -1,142 +0,0 @@
From f2fd2d01f96b50b039402c9ab4278230687f7922 Mon Sep 17 00:00:00 2001
From: Josh Stone <jistone@redhat.com>
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<PathBuf>,
pub ndk: Option<PathBuf>,
pub sanitizers: Option<bool>,
- pub profiler: Option<bool>,
+ pub profiler: Option<StringOrBool>,
pub rpath: Option<bool>,
pub crt_static: Option<bool>,
pub musl_root: Option<PathBuf>,
@@ -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<String> = "llvm-libunwind",
android_ndk: Option<String> = "android-ndk",
sanitizers: Option<bool> = "sanitizers",
- profiler: Option<bool> = "profiler",
+ profiler: Option<StringOrBool> = "profiler",
rpath: Option<bool> = "rpath",
crt_static: Option<bool> = "crt-static",
musl_root: Option<String> = "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

View File

@ -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 <jistone@redhat.com> From: Josh Stone <jistone@redhat.com>
Date: Fri, 9 Jun 2023 15:23:08 -0700 Date: Fri, 9 Jun 2023 15:23:08 -0700
Subject: [PATCH] Let environment variables override some default CPUs Subject: [PATCH] Let environment variables override some default CPUs
--- ---
compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs | 2 +- .../src/spec/targets/powerpc64le_unknown_linux_gnu.rs | 2 +-
compiler/rustc_target/src/spec/s390x_unknown_linux_gnu.rs | 2 +- .../rustc_target/src/spec/targets/s390x_unknown_linux_gnu.rs | 2 +-
compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs | 2 +- .../rustc_target/src/spec/targets/x86_64_unknown_linux_gnu.rs | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-) 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 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 fd896e086b54..08d0c43d20b4 100644 index 194c3170e683..9806ca78297c 100644
--- a/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs --- a/compiler/rustc_target/src/spec/targets/powerpc64le_unknown_linux_gnu.rs
+++ b/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs +++ b/compiler/rustc_target/src/spec/targets/powerpc64le_unknown_linux_gnu.rs
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
pub fn target() -> Target { 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 = "ppc64le".into();
+ base.cpu = option_env!("RUSTC_TARGET_CPU_PPC64LE").unwrap_or("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.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]);
base.max_atomic_width = Some(64); base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline; 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 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 f2c722b9a89d..17a14d10b27e 100644 index 6fc410eb2235..c8f84edb9715 100644
--- a/compiler/rustc_target/src/spec/s390x_unknown_linux_gnu.rs --- a/compiler/rustc_target/src/spec/targets/s390x_unknown_linux_gnu.rs
+++ b/compiler/rustc_target/src/spec/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 { @@ -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; base.endian = Endian::Big;
// z10 is the oldest CPU supported by LLVM // z10 is the oldest CPU supported by LLVM
- base.cpu = "z10".into(); - 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 // 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 // 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. // 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 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 9af1049b8702..68f876dd18c3 100644 index 80e267c163fa..8436a00e66d5 100644
--- a/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs --- a/compiler/rustc_target/src/spec/targets/x86_64_unknown_linux_gnu.rs
+++ b/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs +++ b/compiler/rustc_target/src/spec/targets/x86_64_unknown_linux_gnu.rs
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
pub fn target() -> Target { 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 = "x86-64".into();
+ base.cpu = option_env!("RUSTC_TARGET_CPU_X86_64").unwrap_or("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.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]); base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]);
base.stack_probes = StackProbeType::X86;
-- --
2.40.1 2.41.0

View File

@ -1,26 +0,0 @@
From 37cb177eb53145103ae72b67562884782dde01c3 Mon Sep 17 00:00:00 2001
From: Ivan Mironov <mironov.ivan@gmail.com>
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

View File

@ -0,0 +1,53 @@
From 61b5cc96337da2121221dd1bcdb63fd36551d065 Mon Sep 17 00:00:00 2001
From: Josh Stone <jistone@redhat.com>
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

View File

@ -0,0 +1,102 @@
From df0d6f1d8b46db82d7599ca8eff6e8f844cf52f2 Mon Sep 17 00:00:00 2001
From: Josh Stone <jistone@redhat.com>
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 = <platform-specific> (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 = <platform-specific> (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<PathBuf>,
pub qemu_rootfs: Option<PathBuf>,
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<String> = "wasi-root",
qemu_rootfs: Option<String> = "qemu-rootfs",
no_std: Option<bool> = "no-std",
+ self_contained: Option<bool> = "self-contained",
}
}
@@ -1600,6 +1605,9 @@ fn get_table(option: &str) -> Result<TomlConfig, toml::de::Error> {
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<bool> {
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<bool> {
+ 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

View File

@ -1,36 +0,0 @@
From a627c8f54cab6880dc7d36c55092a94c6f750a6e Mon Sep 17 00:00:00 2001
From: Ariadne Conill <ariadne@dereferenced.org>
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 <ariadne@dereferenced.org>
(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

View File

@ -0,0 +1,33 @@
From 776146e9ebb6bbe17a37bfad955f3dac95317275 Mon Sep 17 00:00:00 2001
From: Josh Stone <jistone@redhat.com>
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

View File

@ -0,0 +1,78 @@
From 79bb610c8fc5d9df7dd4720ae847b8f17e7b1ad4 Mon Sep 17 00:00:00 2001
From: Josh Stone <jistone@redhat.com>
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<StaticCow<str>>,
/// 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

View File

@ -5,17 +5,55 @@
# https://github.com/rust-lang/cargo/issues/6397 # https://github.com/rust-lang/cargo/issues/6397
# But we can set CARGO_HOME locally, which is a good idea anyway to make sure # But we can set CARGO_HOME locally, which is a good idea anyway to make sure
# it never writes to ~/.cargo during rpmbuild. # it never writes to ~/.cargo during rpmbuild.
%__cargo %{_bindir}/env CARGO_HOME=.cargo %{_bindir}/cargo %__cargo /usr/bin/env CARGO_HOME=.cargo RUSTFLAGS='%{build_rustflags}' /usr/bin/cargo
%__rustc %{_bindir}/rustc %__rustc /usr/bin/rustc
%__rustdoc %{_bindir}/rustdoc %__rustdoc /usr/bin/rustdoc
# Enable optimization, debuginfo, and link hardening. # rustflags_opt_level: default optimization level
%__global_rustflags -Copt-level=3 -Cdebuginfo=2 -Clink-arg=-Wl,-z,relro,-z,now #
# It corresponds to the "-Copt-level" rustc command line option.
%rustflags_opt_level 3
%__global_rustflags_toml [%{lua: # rustflags_debuginfo: default verbosity of debug information
for arg in string.gmatch(rpm.expand("%{__global_rustflags}"), "%S+") do #
print('"' .. arg .. '", ') # It corresponds to the "-Cdebuginfo" rustc command line option.
end}] # 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)
# -Cforce-frame-pointers: force inclusion of frame pointers (default: enabled
# on x86_64 and aarch64 on Fedora 37+)
#
# Additionally, some linker flags are set which correspond to the default
# Fedora compiler flags for hardening and for embedding package versions into
# compiled binaries.
#
# 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
%{expr:0%{?_include_frame_pointers} && ("%{_arch}" != "ppc64le" && "%{_arch}" != "s390x" && "%{_arch}" != "i386") ? "-Cforce-frame-pointers=yes" : ""}
%[0%{?_package_note_status} ? "-Clink-arg=%_package_note_flags" : ""]
}
# __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:) (\ %cargo_prep(V:) (\
%{__mkdir} -p .cargo \ %{__mkdir} -p .cargo \
@ -23,7 +61,11 @@ cat > .cargo/config << EOF \
[build]\ [build]\
rustc = "%{__rustc}"\ rustc = "%{__rustc}"\
rustdoc = "%{__rustdoc}"\ rustdoc = "%{__rustdoc}"\
rustflags = %{__global_rustflags_toml}\ \
[env]\
CFLAGS = "%{build_cflags}"\
CXXFLAGS = "%{build_cxxflags}"\
LDFLAGS = "%{build_ldflags}"\
\ \
[install]\ [install]\
root = "%{buildroot}%{_prefix}"\ root = "%{buildroot}%{_prefix}"\
@ -44,8 +86,104 @@ EOF\
%endif\ %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 \
}

View File

@ -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<PackageSet<'cfg>> {
- // 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);
}

View File

@ -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" ] }

View File

@ -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" ] }

View File

@ -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. # Only x86_64, i686, and aarch64 are Tier 1 platforms at this time.
# https://doc.rust-lang.org/nightly/rustc/platform-support.html # https://doc.rust-lang.org/nightly/rustc/platform-support.html
%global rust_arches x86_64 i686 aarch64 ppc64le s390x %global rust_arches x86_64 i686 aarch64 ppc64le s390x
ExclusiveArch: %{rust_arches}
# The channel can be stable, beta, or nightly
%{!?channel: %global channel stable}
# To bootstrap from scratch, set the channel and date from src/stage0.json # 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 # e.g. 1.59.0 wants rustc: 1.58.0-2022-01-13
# or nightly wants some beta-YYYY-MM-DD # or nightly wants some beta-YYYY-MM-DD
%global bootstrap_version 1.70.0 %global bootstrap_version 1.74.0
%global bootstrap_channel 1.70.0 %global bootstrap_channel 1.74.0
%global bootstrap_date 2023-06-01 %global bootstrap_date 2023-11-16
# Only the specified arches will use bootstrap binaries. # Only the specified arches will use bootstrap binaries.
# NOTE: Those binaries used to be uploaded with every new release, but that was # NOTE: Those binaries used to be uploaded with every new release, but that was
@ -26,42 +32,51 @@
%if 0%{?fedora} %if 0%{?fedora}
%global mingw_targets i686-pc-windows-gnu x86_64-pc-windows-gnu %global mingw_targets i686-pc-windows-gnu x86_64-pc-windows-gnu
%endif %endif
%if 0%{?fedora} || 0%{?rhel} >= 8
%global wasm_targets wasm32-unknown-unknown wasm32-wasi %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
%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 # 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 # src/ci/docker/host-x86_64/dist-various-2/build-wasi-toolchain.sh
# (updated per https://github.com/rust-lang/rust/pull/96907) # (updated per https://github.com/rust-lang/rust/pull/96907)
%global wasi_libc_url https://github.com/WebAssembly/wasi-libc %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_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_source %{wasi_libc_url}/archive/%{wasi_libc_ref}/%{wasi_libc_name}.tar.gz
%global wasi_libc_dir %{_builddir}/%{wasi_libc_name} %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. # Using llvm-static may be helpful as an opt-in, e.g. to aid LLVM rebases.
%bcond_with llvm_static %bcond_with llvm_static
# We can also choose to just use Rust's bundled LLVM, in case the system LLVM # We can also choose to just use Rust's bundled LLVM, in case the system LLVM
# is insufficient. Rust currently requires LLVM 14.0+. # is insufficient. Rust currently requires LLVM 15.0+.
%global min_llvm_version 14.0.0 %global min_llvm_version 15.0.0
%global bundled_llvm_version 16.0.5 %global bundled_llvm_version 17.0.5
%bcond_with bundled_llvm %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. # This needs to be consistent with the bindings in vendor/libgit2-sys.
%global min_libgit2_version 1.6.4 %global min_libgit2_version 1.7.1
%global next_libgit2_version 1.7.0~ %global next_libgit2_version 1.8.0~
%global bundled_libgit2_version 1.6.4 %global bundled_libgit2_version 1.7.1
%if 0%{?fedora} >= 38 %if 0%{?fedora} >= 39
%bcond_with bundled_libgit2 %bcond_with bundled_libgit2
%else %else
%bcond_without bundled_libgit2 %bcond_without bundled_libgit2
%endif %endif
# needs libssh2_userauth_publickey_frommemory
%global min_libssh2_version 1.6.0
%if 0%{?rhel} %if 0%{?rhel}
# Disable cargo->libgit2->libssh2 on RHEL, as it's not approved for FIPS (rhbz1732949) # Disable cargo->libgit2->libssh2 on RHEL, as it's not approved for FIPS (rhbz1732949)
%bcond_without disabled_libssh2 %bcond_without disabled_libssh2
@ -69,39 +84,26 @@
%bcond_with disabled_libssh2 %bcond_with disabled_libssh2
%endif %endif
%if 0%{?rhel} && 0%{?rhel} < 8 %if 0%{?__isa_bits} == 32
%bcond_with curl_http2 # Disable PGO on 32-bit to reduce build memory
%bcond_with rustc_pgo
%else %else
%bcond_without curl_http2 %bcond_without rustc_pgo
%endif %endif
# LLDB isn't available everywhere... # Detect non-stable channels from the version, like 1.74.0~beta.1
%if 0%{?rhel} && 0%{?rhel} < 8 %{lua: do
%bcond_with lldb local version = rpm.expand("%{version}")
%else local version_channel, subs = string.gsub(version, "^.*~(%w+).*$", "%1", 1)
%bcond_without lldb rpm.define("channel " .. (subs ~= 0 and version_channel or "stable"))
%endif rpm.define("rustc_package rustc-" .. version_channel .. "-src")
end}
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
Source0: https://static.rust-lang.org/dist/%{rustc_package}.tar.xz Source0: https://static.rust-lang.org/dist/%{rustc_package}.tar.xz
Source1: %{wasi_libc_source} Source1: %{wasi_libc_source}
# Sources for bootstrap_arches are inserted by lua below # Sources for bootstrap_arches are inserted by lua below
# By default, rust tries to use "rust-lld" as a linker for WebAssembly. # By default, rust tries to use "rust-lld" as a linker for some targets.
Patch1: 0001-Use-lld-provided-by-system-for-wasm.patch Patch1: 0001-Use-lld-provided-by-system.patch
# Set a substitute-path in rust-gdb for standard library sources. # Set a substitute-path in rust-gdb for standard library sources.
Patch2: rustc-1.70.0-rust-gdb-substitute-path.patch Patch2: rustc-1.70.0-rust-gdb-substitute-path.patch
@ -110,12 +112,14 @@ Patch2: rustc-1.70.0-rust-gdb-substitute-path.patch
# TODO: upstream this ability into the actual build configuration # TODO: upstream this ability into the actual build configuration
Patch3: 0001-Let-environment-variables-override-some-default-CPUs.patch Patch3: 0001-Let-environment-variables-override-some-default-CPUs.patch
# Enable the profiler runtime for native hosts # Override the default self-contained system libraries
# https://github.com/rust-lang/rust/pull/114069 # TODO: the first can probably be upstreamed, but the second is hard-coded,
Patch4: 0001-Allow-using-external-builds-of-the-compiler-rt-profi.patch # 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 # https://github.com/rust-lang/rust/pull/117982
Patch5: 0001-bootstrap-config-fix-version-comparison-bug.patch Patch6: 0001-bootstrap-only-show-PGO-warnings-when-verbose.patch
### RHEL-specific patches below ### ### RHEL-specific patches below ###
@ -123,11 +127,7 @@ Patch5: 0001-bootstrap-config-fix-version-comparison-bug.patch
Source100: macros.rust-toolset Source100: macros.rust-toolset
# Disable cargo->libgit2->libssh2 on RHEL, as it's not approved for FIPS (rhbz1732949) # Disable cargo->libgit2->libssh2 on RHEL, as it's not approved for FIPS (rhbz1732949)
Patch100: rustc-1.71.0-disable-libssh2.patch Patch100: rustc-1.75.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
# Get the Rust triple for any arch. # Get the Rust triple for any arch.
%{lua: function rust_triple(arch) %{lua: function rust_triple(arch)
@ -145,14 +145,12 @@ Patch101: rustc-1.71.0-disable-http2.patch
return arch.."-unknown-linux-"..abi return arch.."-unknown-linux-"..abi
end} 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 %{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 %if %defined bootstrap_arches
# For each bootstrap arch, add an additional binary Source. # For each bootstrap arch, add an additional binary Source.
@ -186,12 +184,7 @@ end}
Provides: bundled(%{name}-bootstrap) = %{bootstrap_version} Provides: bundled(%{name}-bootstrap) = %{bootstrap_version}
%else %else
BuildRequires: cargo >= %{bootstrap_version} 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}) BuildRequires: (%{name} >= %{bootstrap_version} with %{name} <= %{version})
%endif
%global local_rust_root %{_prefix} %global local_rust_root %{_prefix}
%endif %endif
@ -211,7 +204,7 @@ BuildRequires: (pkgconfig(libgit2) >= %{min_libgit2_version} with pkgconfig(lib
%endif %endif
%if %{without disabled_libssh2} %if %{without disabled_libssh2}
BuildRequires: pkgconfig(libssh2) >= %{min_libssh2_version} BuildRequires: pkgconfig(libssh2)
%endif %endif
%if 0%{?rhel} == 8 %if 0%{?rhel} == 8
@ -222,14 +215,11 @@ BuildRequires: python3
BuildRequires: python3-rpm-macros BuildRequires: python3-rpm-macros
%if %with bundled_llvm %if %with bundled_llvm
BuildRequires: cmake3 >= 3.13.4 BuildRequires: cmake >= 3.20.0
BuildRequires: ninja-build BuildRequires: ninja-build
Provides: bundled(llvm) = %{bundled_llvm_version} Provides: bundled(llvm) = %{bundled_llvm_version}
%else %else
BuildRequires: cmake >= 2.8.11 BuildRequires: cmake >= 3.5.1
%if 0%{?epel} == 7
%global llvm llvm14
%endif
%if %defined llvm %if %defined llvm
%global llvm_root %{_libdir}/%{llvm} %global llvm_root %{_libdir}/%{llvm}
%else %else
@ -264,20 +254,7 @@ Requires: %{name}-std-static%{?_isa} = %{version}-%{release}
# https://github.com/rust-lang/rust/issues/11937 # https://github.com/rust-lang/rust/issues/11937
Requires: /usr/bin/cc 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 %global __ranlib %{_bindir}/ranlib
%endif
# ALL Rust libraries are private, because they don't keep an ABI. # ALL Rust libraries are private, because they don't keep an ABI.
%global _privatelibs lib(.*-[[:xdigit:]]{16}*|rustc.*)[.]so.* %global _privatelibs lib(.*-[[:xdigit:]]{16}*|rustc.*)[.]so.*
@ -289,14 +266,7 @@ BuildRequires: %{devtoolset_name}-gcc-c++
# While we don't want to encourage dynamic linking to Rust shared libraries, as # 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 # there's no stable ABI, we still need the unallocated metadata (.rustc) to
# support custom-derive plugins like #[proc_macro_derive(Foo)]. # 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 %global _find_debuginfo_opts --keep-section .rustc
%endif
%if %{without bundled_llvm} %if %{without bundled_llvm}
%if "%{llvm_root}" == "%{_prefix}" || 0%{?scl:1} %if "%{llvm_root}" == "%{_prefix}" || 0%{?scl:1}
@ -321,7 +291,11 @@ BuildRequires: mingw64-winpthreads-static
%endif %endif
%if %defined wasm_targets %if %defined wasm_targets
%if %with bundled_wasi_libc
BuildRequires: clang BuildRequires: clang
%else
BuildRequires: wasi-libc-static
%endif
BuildRequires: lld BuildRequires: lld
# brp-strip-static-archive breaks the archive index for wasm # brp-strip-static-archive breaks the archive index for wasm
%global __os_install_post \ %global __os_install_post \
@ -330,10 +304,8 @@ find '%{buildroot}%{rustlibdir}'/wasm*/lib -type f -regex '.*\\.\\(a\\|rlib\\)'
%{nil} %{nil}
%endif %endif
%if 0%{?fedora} || 0%{?rhel} >= 8
# For profiler_builtins # For profiler_builtins
BuildRequires: compiler-rt BuildRequires: compiler-rt
%endif
# This component was removed as of Rust 1.69.0. # This component was removed as of Rust 1.69.0.
# https://github.com/rust-lang/rust/pull/101841 # https://github.com/rust-lang/rust/pull/101841
@ -356,65 +328,67 @@ Requires: glibc-devel%{?_isa} >= 2.17
This package includes the standard libraries for building applications This package includes the standard libraries for building applications
written in Rust. written in Rust.
%if %defined mingw_targets %global target_package() \
%{lua: do %package std-static-%1 \
for triple in string.gmatch(rpm.expand("%{mingw_targets}"), "%S+") do Summary: Standard library for Rust %1 \
local subs = { Requires: %{name} = %{version}-%{release}
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([[
%package std-static-{{triple}} %global target_description() \
Summary: Standard library for Rust {{triple}} %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 BuildArch: noarch
Provides: {{mingw}}-rust = {{verrel}} %target_description i686-pc-windows-gnu MinGW
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}
%endif %endif
%if %defined wasm_targets %if %target_enabled x86_64-pc-windows-gnu
%{lua: do %target_package x86_64-pc-windows-gnu
for triple in string.gmatch(rpm.expand("%{wasm_targets}"), "%S+") do Requires: mingw64-crt
local subs = { Requires: mingw64-gcc
triple = triple, Requires: mingw64-winpthreads-static
name = rpm.expand("%{name}"), Provides: mingw64-rust = %{version}-%{release}
verrel = rpm.expand("%{version}-%{release}"), Provides: mingw64-rustc = %{version}-%{release}
wasi = string.find(triple, "-wasi") and 1 or 0,
}
local s = string.gsub([[
%package std-static-{{triple}}
Summary: Standard library for Rust {{triple}}
BuildArch: noarch BuildArch: noarch
Requires: {{name}} = {{verrel}} %target_description x86_64-pc-windows-gnu MinGW
%endif
%if %target_enabled wasm32-unknown-unknown
%target_package wasm32-unknown-unknown
Requires: lld >= 8.0 Requires: lld >= 8.0
%if {{wasi}} BuildArch: noarch
Provides: bundled(wasi-libc) %target_description wasm32-unknown-unknown WebAssembly
%endif %endif
%description std-static-{{triple}} %if %target_enabled wasm32-wasi
This package includes the standard libraries for building applications %target_package wasm32-wasi
written in Rust for the WebAssembly target {{triple}}. Requires: lld >= 8.0
%if %with bundled_wasi_libc
Provides: bundled(wasi-libc)
%else
Requires: wasi-libc-static
%endif
BuildArch: noarch
%target_description wasm32-wasi WebAssembly
%endif
]], "{{(%w+)}}", subs) %if %target_enabled x86_64-unknown-none
print(s) %target_package x86_64-unknown-none
end Requires: lld
end} %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 %endif
@ -437,8 +411,6 @@ This package includes the rust-gdb script, which allows easier debugging of Rust
programs. programs.
%if %with lldb
%package lldb %package lldb
Summary: LLDB pretty printers for Rust Summary: LLDB pretty printers for Rust
BuildArch: noarch BuildArch: noarch
@ -450,8 +422,6 @@ Requires: %{name}-debugger-common = %{version}-%{release}
This package includes the rust-lldb script, which allows easier debugging of Rust This package includes the rust-lldb script, which allows easier debugging of Rust
programs. programs.
%endif
%package doc %package doc
Summary: Documentation for Rust Summary: Documentation for Rust
@ -495,6 +465,9 @@ and ensure that you'll always get a repeatable build.
Summary: Tool to find and fix Rust formatting issues Summary: Tool to find and fix Rust formatting issues
Requires: cargo 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. # The component/package was rustfmt-preview until Rust 1.31.
Obsoletes: rustfmt-preview < 1.0.0 Obsoletes: rustfmt-preview < 1.0.0
Provides: rustfmt-preview = %{version}-%{release} Provides: rustfmt-preview = %{version}-%{release}
@ -507,11 +480,7 @@ A tool for formatting Rust code according to style guidelines.
Summary: Rust implementation of the Language Server Protocol Summary: Rust implementation of the Language Server Protocol
# The standard library sources are needed for most functionality. # The standard library sources are needed for most functionality.
%if 0%{?rhel} && 0%{?rhel} < 8
Requires: %{name}-src
%else
Recommends: %{name}-src Recommends: %{name}-src
%endif
# RLS is no longer available as of Rust 1.65, but we're including the stub # 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. # binary that implements LSP just enough to recommend rust-analyzer.
@ -542,11 +511,7 @@ A collection of lints to catch common mistakes and improve your Rust code.
%package src %package src
Summary: Sources for the Rust standard library Summary: Sources for the Rust standard library
BuildArch: noarch BuildArch: noarch
%if 0%{?rhel} && 0%{?rhel} < 8
Requires: %{name}-std-static = %{version}-%{release}
%else
Recommends: %{name}-std-static = %{version}-%{release} Recommends: %{name}-std-static = %{version}-%{release}
%endif
%description src %description src
This package includes source files for the Rust standard library. It may be This package includes source files for the Rust standard library. It may be
@ -582,8 +547,9 @@ test -f '%{local_rust_root}/bin/cargo'
test -f '%{local_rust_root}/bin/rustc' test -f '%{local_rust_root}/bin/rustc'
%endif %endif
%if %defined wasm_targets %if %{defined wasm_targets} && %{with bundled_wasi_libc}
%setup -q -n %{wasi_libc_name} -T -b 1 %setup -q -n %{wasi_libc_name} -T -b 1
rm -rf %{wasi_libc_dir}/dlmalloc/
%endif %endif
%setup -q -n %{rustc_package} %setup -q -n %{rustc_package}
@ -592,17 +558,15 @@ test -f '%{local_rust_root}/bin/rustc'
%patch -P2 -p1 %patch -P2 -p1
%patch -P3 -p1 %patch -P3 -p1
%patch -P4 -p1 %patch -P4 -p1
%if %without bundled_wasi_libc
%patch -P5 -p1 %patch -P5 -p1
%endif
%patch -P6 -p1
%if %with disabled_libssh2 %if %with disabled_libssh2
%patch -P100 -p1 %patch -P100 -p1
%endif %endif
%if %without curl_http2
%patch -P101 -p1
rm -rf vendor/libnghttp2-sys*/
%endif
# Use our explicit python3 first # Use our explicit python3 first
sed -i.try-python -e '/^try python3 /i try "%{__python3}" "$@"' ./configure sed -i.try-python -e '/^try python3 /i try "%{__python3}" "$@"' ./configure
@ -614,18 +578,21 @@ rm -rf src/llvm-project/
mkdir -p src/llvm-project/libunwind/ mkdir -p src/llvm-project/libunwind/
%endif %endif
# Remove other unused vendored libraries
rm -rf vendor/curl-sys*/curl/ # Remove other unused vendored libraries. This leaves the directory in place,
rm -rf vendor/*jemalloc-sys*/jemalloc/ # because some build scripts watch them, e.g. "cargo:rerun-if-changed=curl".
rm -rf vendor/libffi-sys*/libffi/ %define clear_dir() find ./%1 -mindepth 1 -delete
rm -rf vendor/libmimalloc-sys*/c_src/mimalloc/ %clear_dir vendor/curl-sys*/curl/
rm -rf vendor/libssh2-sys*/libssh2/ %clear_dir vendor/*jemalloc-sys*/jemalloc/
rm -rf vendor/libz-sys*/src/zlib{,-ng}/ %clear_dir vendor/libffi-sys*/libffi/
rm -rf vendor/lzma-sys*/xz-*/ %clear_dir vendor/libmimalloc-sys*/c_src/mimalloc/
rm -rf vendor/openssl-src*/openssl/ %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 %if %without bundled_libgit2
rm -rf vendor/libgit2-sys*/libgit2/ %clear_dir vendor/libgit2-sys*/libgit2/
%endif %endif
%if %with disabled_libssh2 %if %with disabled_libssh2
@ -633,13 +600,7 @@ rm -rf vendor/libssh2-sys*/
%endif %endif
# This only affects the transient rust-installer, but let it use our dynamic xz-libs # 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 sed -i.lzma -e '/LZMA_API_STATIC/d' src/bootstrap/src/core/build_steps/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
%if %{without bundled_llvm} && %{with llvm_static} %if %{without bundled_llvm} && %{with llvm_static}
# Static linking to distro LLVM needs to add -lffi # Static linking to distro LLVM needs to add -lffi
@ -665,7 +626,7 @@ find -name '*.rs' -type f -perm /111 -exec chmod -v -x '{}' '+'
%endif %endif
# These are similar to __cflags_arch_* in /usr/lib/rpm/redhat/macros # 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 fedora = tonumber(rpm.expand("0%{?fedora}"))
local rhel = tonumber(rpm.expand("0%{?rhel}")) local rhel = tonumber(rpm.expand("0%{?rhel}"))
local env = local env =
@ -674,14 +635,11 @@ find -name '*.rs' -type f -perm /111 -exec chmod -v -x '{}' '+'
.. " RUSTC_TARGET_CPU_S390X=" .. .. " RUSTC_TARGET_CPU_S390X=" ..
((rhel >= 9) and "z14" or (rhel == 8 or fedora >= 38) and "z13" or ((rhel >= 9) and "z14" or (rhel == 8 or fedora >= 38) and "z13" or
(fedora >= 26) and "zEC12" or (rhel == 7) and "z196" or "z10") (fedora >= 26) and "zEC12" or (rhel == 7) and "z196" or "z10")
return env print(env)
end} end}
# Set up shared environment variables for build/install/check # Set up shared environment variables for build/install/check
%global rust_env %{?rustflags:RUSTFLAGS="%{rustflags}"} %{lua: print(rustc_target_cpus())} %global rust_env %{?rustflags:RUSTFLAGS="%{rustflags}"} %{rustc_target_cpus}
%if %defined cmake_path
%global rust_env %{?rust_env} PATH="%{cmake_path}:$PATH"
%endif
%if %without disabled_libssh2 %if %without disabled_libssh2
# convince libssh2-sys to use the distro libssh2 # convince libssh2-sys to use the distro libssh2
%global rust_env %{?rust_env} LIBSSH2_SYS_USE_PKG_CONFIG=1 %global rust_env %{?rust_env} LIBSSH2_SYS_USE_PKG_CONFIG=1
@ -692,17 +650,13 @@ end}
%{export_rust_env} %{export_rust_env}
%ifarch %{arm} %{ix86} %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 # 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 %define enable_debuginfo --debuginfo-level=0 --debuginfo-level-std=2
%endif %define enable_rust_opts --set rust.codegen-units-std=1
%else %else
%define enable_debuginfo --debuginfo-level=2 %define enable_debuginfo --debuginfo-level=2
%define enable_rust_opts --set rust.codegen-units=1 --set rust.lto=thin
%endif %endif
# Some builders have relatively little memory for their CPU count. # Some builders have relatively little memory for their CPU count.
@ -714,45 +668,40 @@ if [ "$max_cpus" -ge 1 -a "$max_cpus" -lt "$ncpus" ]; then
fi fi
%if %defined mingw_targets %if %defined mingw_targets
%{lua: do %define mingw_target_config %{shrink:
local cfg = "" --set target.i686-pc-windows-gnu.linker=%{mingw32_cc}
for triple in string.gmatch(rpm.expand("%{mingw_targets}"), "%S+") do --set target.i686-pc-windows-gnu.cc=%{mingw32_cc}
local subs = { --set target.i686-pc-windows-gnu.ar=%{mingw32_ar}
triple = triple, --set target.i686-pc-windows-gnu.ranlib=%{mingw32_ranlib}
mingw = string.sub(triple, 1, 4) == "i686" and "mingw32" or "mingw64", --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
} }
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}
%endif %endif
%if %defined wasm_targets %if %defined wasm_targets
%make_build --quiet -C %{wasi_libc_dir} CC=clang AR=llvm-ar NM=llvm-nm %if %with bundled_wasi_libc
%{lua: do %make_build --quiet -C %{wasi_libc_dir} MALLOC_IMPL=emmalloc CC=clang AR=llvm-ar NM=llvm-nm
local wasi_root = rpm.expand("%{wasi_libc_dir}") .. "/sysroot" %define wasm_target_config --set target.wasm32-wasi.wasi-root=%{wasi_libc_dir}/sysroot
local cfg = "" %else
for triple in string.gmatch(rpm.expand("%{wasm_targets}"), "%S+") do %define wasm_target_config %{shrink:
if string.find(triple, "-wasi") then --set target.wasm32-wasi.wasi-root=%{_prefix}/wasm32-wasi
cfg = cfg .. " --set target." .. triple .. ".wasi-root=" .. wasi_root --set target.wasm32-wasi.self-contained=false
end }
end %endif
rpm.define("wasm_target_config "..cfg)
end}
%endif %endif
%if 0%{?fedora} || 0%{?rhel} >= 8 # Find the compiler-rt library for the Rust profiler_builtins crate.
# The exact profiler path is version dependent, and uses LLVM-specific %if 0%{?clang_major_version} >= 17
# arch names in the filename, but this find is good enough for now... %define profiler %{clang_resource_dir}/lib/%{_arch}-redhat-linux-gnu/libclang_rt.profile.a
PROFILER=$(find %{_libdir}/clang -type f -name 'libclang_rt.profile-*.a') %else
# The exact profiler path is version dependent..
%define profiler %(echo %{_libdir}/clang/??/lib/libclang_rt.profile-*.a)
%endif %endif
test -r "%{profiler}"
%configure --disable-option-checking \ %configure --disable-option-checking \
--libdir=%{common_libdir} \ --libdir=%{common_libdir} \
@ -762,7 +711,7 @@ PROFILER=$(find %{_libdir}/clang -type f -name 'libclang_rt.profile-*.a')
--set target.%{rust_triple}.cxx=%{__cxx} \ --set target.%{rust_triple}.cxx=%{__cxx} \
--set target.%{rust_triple}.ar=%{__ar} \ --set target.%{rust_triple}.ar=%{__ar} \
--set target.%{rust_triple}.ranlib=%{__ranlib} \ --set target.%{rust_triple}.ranlib=%{__ranlib} \
${PROFILER:+--set target.%{rust_triple}.profiler="$PROFILER"} \ --set target.%{rust_triple}.profiler="%{profiler}" \
%{?mingw_target_config} \ %{?mingw_target_config} \
%{?wasm_target_config} \ %{?wasm_target_config} \
--python=%{__python3} \ --python=%{__python3} \
@ -774,7 +723,7 @@ PROFILER=$(find %{_libdir}/clang -type f -name 'libclang_rt.profile-*.a')
--disable-llvm-static-stdcpp \ --disable-llvm-static-stdcpp \
--disable-rpath \ --disable-rpath \
%{enable_debuginfo} \ %{enable_debuginfo} \
--set rust.codegen-units-std=1 \ %{enable_rust_opts} \
--set build.build-stage=2 \ --set build.build-stage=2 \
--set build.doc-stage=2 \ --set build.doc-stage=2 \
--set build.install-stage=2 \ --set build.install-stage=2 \
@ -787,11 +736,32 @@ PROFILER=$(find %{_libdir}/clang -type f -name 'libclang_rt.profile-*.a')
--release-channel=%{channel} \ --release-channel=%{channel} \
--release-description="%{?fedora:Fedora }%{?rhel:Red Hat }%{version}-%{release}" --release-description="%{?fedora:Fedora }%{?rhel:Red Hat }%{version}-%{release}"
%{__python3} ./x.py build -j "$ncpus" %global __x %{__python3} ./x.py
%{__python3} ./x.py doc %global __xk %{__x} --keep-stage=0 --keep-stage=1
for triple in %{?mingw_targets} %{?wasm_targets}; do %if %with rustc_pgo
%{__python3} ./x.py build --target=$triple std # 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 done
%install %install
@ -800,10 +770,10 @@ done
%endif %endif
%{export_rust_env} %{export_rust_env}
DESTDIR=%{buildroot} %{__python3} ./x.py install DESTDIR=%{buildroot} %{__xk} install
for triple in %{?mingw_targets} %{?wasm_targets}; do for triple in %{?all_targets} ; do
DESTDIR=%{buildroot} %{__python3} ./x.py install --target=$triple std DESTDIR=%{buildroot} %{__xk} install --target=$triple std
done done
# The rls stub doesn't have an install target, but we can just copy it. # The rls stub doesn't have an install target, but we can just copy it.
@ -873,11 +843,6 @@ mkdir -p %{buildroot}%{_datadir}/cargo/registry
mkdir -p %{buildroot}%{_docdir}/cargo mkdir -p %{buildroot}%{_docdir}/cargo
ln -sT ../rust/html/cargo/ %{buildroot}%{_docdir}/cargo/html 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) # We don't want Rust copies of LLVM tools (rust-lld, rust-llvm-dwp)
rm -f %{buildroot}%{rustlibdir}/%{rust_triple}/bin/rust-ll* rm -f %{buildroot}%{rustlibdir}/%{rust_triple}/bin/rust-ll*
@ -894,34 +859,41 @@ rm -f %{buildroot}%{rustlibdir}/%{rust_triple}/bin/rust-ll*
%{export_rust_env} %{export_rust_env}
# Sanity-check the installed binaries, debuginfo-stripped and all. # Sanity-check the installed binaries, debuginfo-stripped and all.
%{buildroot}%{_bindir}/cargo new build/hello-world TMP_HELLO=$(mktemp -d)
env RUSTC=%{buildroot}%{_bindir}/rustc \ (
LD_LIBRARY_PATH="%{buildroot}%{_libdir}:$LD_LIBRARY_PATH" \ cd "$TMP_HELLO"
%{buildroot}%{_bindir}/cargo run --manifest-path build/hello-world/Cargo.toml 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 # 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 for triple in %{?mingw_targets} %{?wasm_targets}; do
env RUSTC=%{buildroot}%{_bindir}/rustc \ %{buildroot}%{_bindir}/cargo build --verbose --target=$triple
LD_LIBRARY_PATH="%{buildroot}%{_libdir}:$LD_LIBRARY_PATH" \
%{buildroot}%{_bindir}/cargo build --manifest-path build/hello-world/Cargo.toml --target=$triple
done done
)
rm -rf "$TMP_HELLO"
# The results are not stable on koji, so mask errors and just log it. # 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. # 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 # Bootstrap is excluded because it's not something we ship, and a lot of its
# tests are geared toward the upstream CI environment. # tests are geared toward the upstream CI environment.
%{__python3} ./x.py test --no-fail-fast --exclude src/bootstrap || : %{__xk} test --no-fail-fast --skip src/bootstrap || :
rm -rf "./build/%{rust_triple}/test/" rm -rf "./build/%{rust_triple}/test/"
%{__python3} ./x.py test --no-fail-fast cargo || : %{__xk} test --no-fail-fast cargo || :
rm -rf "./build/%{rust_triple}/stage2-tools/%{rust_triple}/cit/" rm -rf "./build/%{rust_triple}/stage2-tools/%{rust_triple}/cit/"
%{__python3} ./x.py test --no-fail-fast clippy || : %{__xk} test --no-fail-fast clippy || :
%{__python3} ./x.py test --no-fail-fast rust-analyzer || : %{__xk} test --no-fail-fast rust-analyzer || :
%{__python3} ./x.py test --no-fail-fast rustfmt || : %{__xk} test --no-fail-fast rustfmt || :
%ldconfig_scriptlets %ldconfig_scriptlets
@ -948,58 +920,46 @@ rm -rf "./build/%{rust_triple}/stage2-tools/%{rust_triple}/cit/"
%dir %{rustlibdir}/%{rust_triple}/lib %dir %{rustlibdir}/%{rust_triple}/lib
%{rustlibdir}/%{rust_triple}/lib/*.rlib %{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 %if %target_enabled i686-pc-windows-gnu
%{lua: do %target_files i686-pc-windows-gnu
for triple in string.gmatch(rpm.expand("%{mingw_targets}"), "%S+") do %{rustlibdir}/i686-pc-windows-gnu/lib/rs*.o
local subs = { %exclude %{rustlibdir}/i686-pc-windows-gnu/lib/*.dll
triple = triple, %exclude %{rustlibdir}/i686-pc-windows-gnu/lib/*.dll.a
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}
%endif %endif
%if %target_enabled x86_64-pc-windows-gnu
%if %defined wasm_targets %target_files x86_64-pc-windows-gnu
%{lua: do %{rustlibdir}/x86_64-pc-windows-gnu/lib/rs*.o
for triple in string.gmatch(rpm.expand("%{wasm_targets}"), "%S+") do %exclude %{rustlibdir}/x86_64-pc-windows-gnu/lib/*.dll
local subs = { %exclude %{rustlibdir}/x86_64-pc-windows-gnu/lib/*.dll.a
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
%endif %endif
]], "{{(%w+)}}", subs) %if %target_enabled wasm32-unknown-unknown
print(s) %target_files wasm32-unknown-unknown
end %endif
end}
%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 %endif
@ -1015,11 +975,9 @@ end}
%exclude %{_bindir}/rust-gdbgui %exclude %{_bindir}/rust-gdbgui
%if %with lldb
%files lldb %files lldb
%{_bindir}/rust-lldb %{_bindir}/rust-lldb
%{rustlibdir}/etc/lldb_* %{rustlibdir}/etc/lldb_*
%endif
%files doc %files doc
@ -1036,7 +994,6 @@ end}
%license src/tools/cargo/LICENSE-{APACHE,MIT,THIRD-PARTY} %license src/tools/cargo/LICENSE-{APACHE,MIT,THIRD-PARTY}
%doc src/tools/cargo/README.md %doc src/tools/cargo/README.md
%{_bindir}/cargo %{_bindir}/cargo
%{_libexecdir}/cargo*
%{_mandir}/man1/cargo*.1* %{_mandir}/man1/cargo*.1*
%{_sysconfdir}/bash_completion.d/cargo %{_sysconfdir}/bash_completion.d/cargo
%{_datadir}/zsh/site-functions/_cargo %{_datadir}/zsh/site-functions/_cargo
@ -1077,6 +1034,23 @@ end}
%changelog %changelog
* Fri Jan 05 2024 Josh Stone <jistone@redhat.com> - 1.75.0-1
- Update to 1.75.0.
* Fri Jan 05 2024 Josh Stone <jistone@redhat.com> - 1.74.1-2
- Rebuild in a new side-tag.
* Wed Jan 03 2024 Josh Stone <jistone@redhat.com> - 1.74.1-1
- Update to 1.74.1.
* Tue Oct 17 2023 Josh Stone <jistone@redhat.com> - 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 <jistone@redhat.com> - 1.72.1-1
- Update to 1.72.1.
- Migrated to SPDX license
* Tue Aug 08 2023 Josh Stone <jistone@redhat.com> - 1.71.1-1 * Tue Aug 08 2023 Josh Stone <jistone@redhat.com> - 1.71.1-1
- Update to 1.71.1. - Update to 1.71.1.
- Security fix for CVE-2023-38497 - Security fix for CVE-2023-38497