Skip to content

Do not deny warnings in "fast" try builds #140786

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
May 8, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2567,7 +2567,6 @@ dependencies = [
"humansize",
"humantime",
"log",
"serde",
"serde_json",
"sysinfo",
"tabled",
Expand Down
16 changes: 10 additions & 6 deletions src/doc/rustc-dev-guide/src/tests/ci.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,12 +135,16 @@ There are several use-cases for try builds:
- Run a specific CI job (e.g. Windows tests) on a PR, to quickly test if it
passes the test suite executed by that job.

You can select which CI jobs will
be executed in the try build by adding lines containing `try-job:
<job pattern>` to the PR description. All such specified jobs will be executed
in the try build once the `@bors try` command is used on the PR. If no try
jobs are specified in this way, the jobs defined in the `try` section of
[`jobs.yml`] will be executed by default.
By default, if you send a comment with `@bors try`, the jobs defined in the `try` section of
[`jobs.yml`] will be executed. We call this mode a "fast try build". Such a try build
will not execute any tests, and it will allow compilation warnings. It is useful when you want to
get an optimized toolchain as fast as possible, for a crater run or performance benchmarks,
even if it might not be working fully correctly.

If you want to run a custom CI job in a try build and make sure that it passes all tests and does
not produce any compilation warnings, you can select CI jobs to be executed by adding lines
containing `try-job: <job pattern>` to the PR description. All such specified jobs will be executed
in the try build once the `@bors try` command is used on the PR.

Each pattern can either be an exact name of a job or a glob pattern that matches multiple jobs,
for example `*msvc*` or `*-alt`. You can start at most 20 jobs in a single try build. When using
Expand Down
3 changes: 1 addition & 2 deletions src/tools/opt-dist/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "opt-dist"
version = "0.1.0"
edition = "2021"
edition = "2024"

[dependencies]
build_helper = { path = "../../build_helper" }
Expand All @@ -15,7 +15,6 @@ fs_extra = "1"
camino = "1"
tar = "0.4"
xz = { version = "0.1", package = "xz2" }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
glob = "0.3"
tempfile = "3.5"
Expand Down
5 changes: 5 additions & 0 deletions src/tools/opt-dist/src/environment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ pub struct Environment {
use_bolt: bool,
shared_llvm: bool,
run_tests: bool,
fast_try_build: bool,
}

impl Environment {
Expand Down Expand Up @@ -106,6 +107,10 @@ impl Environment {
pub fn run_tests(&self) -> bool {
self.run_tests
}

pub fn is_fast_try_build(&self) -> bool {
self.fast_try_build
}
}

/// What is the extension of binary executables on this platform?
Expand Down
11 changes: 9 additions & 2 deletions src/tools/opt-dist/src/exec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,13 +113,16 @@ impl Bootstrap {
"library/std",
])
.env("RUST_BACKTRACE", "full");
let cmd = add_shared_x_flags(env, cmd);

Self { cmd, metrics_path }
}

pub fn dist(env: &Environment, dist_args: &[String]) -> Self {
let metrics_path = env.build_root().join("build").join("metrics.json");
let cmd = cmd(&dist_args.iter().map(|arg| arg.as_str()).collect::<Vec<_>>())
.env("RUST_BACKTRACE", "full");
let args = dist_args.iter().map(|arg| arg.as_str()).collect::<Vec<_>>();
let cmd = cmd(&args).env("RUST_BACKTRACE", "full");
let cmd = add_shared_x_flags(env, cmd);
Self { cmd, metrics_path }
}

Expand Down Expand Up @@ -184,3 +187,7 @@ impl Bootstrap {
Ok(())
}
}

fn add_shared_x_flags(env: &Environment, cmd: CmdBuilder) -> CmdBuilder {
if env.is_fast_try_build() { cmd.arg("--set").arg("rust.deny-warnings=false") } else { cmd }
}
26 changes: 17 additions & 9 deletions src/tools/opt-dist/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ enum EnvironmentCmd {
#[arg(long)]
benchmark_cargo_config: Vec<String>,

/// Perform tests after final build if it's not a try build
/// Perform tests after final build if it's not a fast try build
#[arg(long)]
run_tests: bool,
},
Expand All @@ -111,11 +111,14 @@ enum EnvironmentCmd {
},
}

fn is_try_build() -> bool {
/// For a fast try build, we want to only build the bare minimum of components to get a
/// working toolchain, and not run any tests.
fn is_fast_try_build() -> bool {
std::env::var("DIST_TRY_BUILD").unwrap_or_else(|_| "0".to_string()) != "0"
}

fn create_environment(args: Args) -> anyhow::Result<(Environment, Vec<String>)> {
let is_fast_try_build = is_fast_try_build();
let (env, args) = match args.env {
EnvironmentCmd::Local {
target_triple,
Expand Down Expand Up @@ -144,6 +147,7 @@ fn create_environment(args: Args) -> anyhow::Result<(Environment, Vec<String>)>
.skipped_tests(skipped_tests)
.benchmark_cargo_config(benchmark_cargo_config)
.run_tests(run_tests)
.fast_try_build(is_fast_try_build)
.build()?;

(env, shared.build_args)
Expand All @@ -167,6 +171,7 @@ fn create_environment(args: Args) -> anyhow::Result<(Environment, Vec<String>)>
.use_bolt(!is_aarch64)
.skipped_tests(vec![])
.run_tests(true)
.fast_try_build(is_fast_try_build)
.build()?;

(env, shared.build_args)
Expand All @@ -187,6 +192,7 @@ fn create_environment(args: Args) -> anyhow::Result<(Environment, Vec<String>)>
.use_bolt(false)
.skipped_tests(vec![])
.run_tests(true)
.fast_try_build(is_fast_try_build)
.build()?;

(env, shared.build_args)
Expand Down Expand Up @@ -350,9 +356,8 @@ fn execute_pipeline(

// After dist has finished, run a subset of the test suite on the optimized artifacts to discover
// possible regressions.
// The tests are not executed for try builds, which can be in various broken states, so we don't
// want to gatekeep them with tests.
if !is_try_build() && env.run_tests() {
// The tests are not executed for fast try builds, which can be broken and might not pass them.
if !is_fast_try_build() && env.run_tests() {
timer.section("Run tests", |_| run_tests(env))?;
}

Expand All @@ -361,7 +366,10 @@ fn execute_pipeline(

fn main() -> anyhow::Result<()> {
// Make sure that we get backtraces for easier debugging in CI
std::env::set_var("RUST_BACKTRACE", "1");
unsafe {
// SAFETY: we are the only thread running at this point
std::env::set_var("RUST_BACKTRACE", "1");
}

env_logger::builder()
.filter_level(LevelFilter::Info)
Expand Down Expand Up @@ -393,9 +401,9 @@ fn main() -> anyhow::Result<()> {

let (env, mut build_args) = create_environment(args).context("Cannot create environment")?;

// Skip components that are not needed for try builds to speed them up
if is_try_build() {
log::info!("Skipping building of unimportant components for a try build");
// Skip components that are not needed for fast try builds to speed them up
if is_fast_try_build() {
log::info!("Skipping building of unimportant components for a fast try build");
for target in [
"rust-docs",
"rustc-docs",
Expand Down
Loading