Move -Cembed-bitcode

This commit is contained in:
Adam Gemmell 2025-09-26 15:01:01 +01:00
parent fffc4fcf96
commit 10b6c5f5a7
6 changed files with 50 additions and 21 deletions

View file

@ -54,6 +54,24 @@ rustflags = ["-Cpanic=abort"]
[profile.release.package.panic_abort]
rustflags = ["-Cpanic=abort"]
# The "dist" profile is used by bootstrap for prebuilt libstd artifacts
# These settings ensure that the prebuilt artifacts support a variety of features
# in the user's profile.
[profile.dist]
inherits = "release"
rustflags = [
# Unconditionally embedding bitcode is necessary for when users enable LTO.
# Until Cargo can rebuild the standard library with the user profile's `lto`
# setting, Cargo will force this to be `no`
"-Cembed-bitcode=yes",
]
[profile.dist.package.panic_abort]
rustflags = [
"-Cpanic=abort",
"-Cembed-bitcode=yes",
]
[patch.crates-io]
# See comments in `library/rustc-std-workspace-core/README.md` for what's going on here
rustc-std-workspace-core = { path = 'rustc-std-workspace-core' }

View file

@ -680,13 +680,6 @@ pub fn std_cargo(
}
}
// By default, rustc uses `-Cembed-bitcode=yes`, and Cargo overrides that
// with `-Cembed-bitcode=no` for non-LTO builds. However, libstd must be
// built with bitcode so that the produced rlibs can be used for both LTO
// builds (which use bitcode) and non-LTO builds (which use object code).
// So we override the override here!
cargo.rustflag("-Cembed-bitcode=yes");
if builder.config.rust_lto == RustcLto::Off {
cargo.rustflag("-Clto=off");
}

View file

@ -1008,7 +1008,7 @@ impl Step for Analysis {
let src = builder
.stage_out(compiler, Mode::Std)
.join(target)
.join(builder.cargo_dir())
.join(builder.cargo_dir(Mode::Std))
.join("deps")
.join("save-analysis");

View file

@ -927,8 +927,9 @@ impl Step for Clippy {
cargo.env("RUSTC_TEST_SUITE", builder.rustc(build_compiler));
cargo.env("RUSTC_LIB_PATH", builder.rustc_libdir(build_compiler));
let host_libs =
builder.stage_out(build_compiler, Mode::ToolRustcPrivate).join(builder.cargo_dir());
let host_libs = builder
.stage_out(build_compiler, Mode::ToolRustcPrivate)
.join(builder.cargo_dir(Mode::ToolRustcPrivate));
cargo.env("HOST_LIBS", host_libs);
// Build the standard library that the tests can use.

View file

@ -106,9 +106,9 @@ pub struct Cargo {
rustdocflags: Rustflags,
hostflags: HostFlags,
allow_features: String,
release_build: bool,
build_compiler_stage: u32,
extra_rustflags: Vec<String>,
profile: Option<&'static str>,
}
impl Cargo {
@ -137,7 +137,11 @@ impl Cargo {
}
pub fn release_build(&mut self, release_build: bool) {
self.release_build = release_build;
self.profile = if release_build { Some("release") } else { None };
}
pub fn profile(&mut self, profile: &'static str) {
self.profile = Some(profile);
}
pub fn compiler(&self) -> Compiler {
@ -407,8 +411,8 @@ impl Cargo {
impl From<Cargo> for BootstrapCommand {
fn from(mut cargo: Cargo) -> BootstrapCommand {
if cargo.release_build {
cargo.args.insert(0, "--release".into());
if let Some(profile) = cargo.profile {
cargo.args.insert(0, format!("--profile={profile}").into());
}
for arg in &cargo.extra_rustflags {
@ -1434,9 +1438,18 @@ impl Builder<'_> {
.unwrap_or(&self.config.rust_rustflags)
.clone();
let release_build = self.config.rust_optimize.is_release() &&
// cargo bench/install do not accept `--release` and miri doesn't want it
!matches!(cmd_kind, Kind::Bench | Kind::Install | Kind::Miri | Kind::MiriSetup | Kind::MiriTest);
let profile =
if matches!(cmd_kind, Kind::Bench | Kind::Miri | Kind::MiriSetup | Kind::MiriTest) {
// Use the default profile for bench/miri
None
} else {
match (mode, self.config.rust_optimize.is_release()) {
// Some std configuration exists in its own profile
(Mode::Std, true) => Some("dist"),
(_, true) => Some("release"),
(_, false) => Some("dev"),
}
};
Cargo {
command: cargo,
@ -1448,9 +1461,9 @@ impl Builder<'_> {
rustdocflags,
hostflags,
allow_features,
release_build,
build_compiler_stage,
extra_rustflags,
profile,
}
}
}

View file

@ -898,8 +898,12 @@ impl Build {
/// Component directory that Cargo will produce output into (e.g.
/// release/debug)
fn cargo_dir(&self) -> &'static str {
if self.config.rust_optimize.is_release() { "release" } else { "debug" }
fn cargo_dir(&self, mode: Mode) -> &'static str {
match (mode, self.config.rust_optimize.is_release()) {
(Mode::Std, true) => "dist",
(_, true) => "release",
(_, false) => "debug",
}
}
fn tools_dir(&self, build_compiler: Compiler) -> PathBuf {
@ -956,7 +960,7 @@ impl Build {
/// running a particular compiler, whether or not we're building the
/// standard library, and targeting the specified architecture.
fn cargo_out(&self, build_compiler: Compiler, mode: Mode, target: TargetSelection) -> PathBuf {
self.stage_out(build_compiler, mode).join(target).join(self.cargo_dir())
self.stage_out(build_compiler, mode).join(target).join(self.cargo_dir(mode))
}
/// Root output directory of LLVM for `target`