Auto merge of #135430 - jhpratt:rollup-39cecwd, r=jhpratt
Rollup of 3 pull requests Successful merges: - #135355 (ci: added test log format for ci) - #135386 (clean up code related to the rustdoc-js test suite) - #135391 (bootstrap: Implement conditional `tracing` infra) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
b4045a404e
15 changed files with 403 additions and 22 deletions
|
@ -58,6 +58,9 @@ dependencies = [
|
|||
"tar",
|
||||
"termcolor",
|
||||
"toml",
|
||||
"tracing",
|
||||
"tracing-subscriber",
|
||||
"tracing-tree",
|
||||
"walkdir",
|
||||
"windows 0.52.0",
|
||||
"xz2",
|
||||
|
@ -70,7 +73,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"regex-automata",
|
||||
"regex-automata 0.4.9",
|
||||
"serde",
|
||||
]
|
||||
|
||||
|
@ -271,8 +274,8 @@ dependencies = [
|
|||
"aho-corasick",
|
||||
"bstr",
|
||||
"log",
|
||||
"regex-automata",
|
||||
"regex-syntax",
|
||||
"regex-automata 0.4.9",
|
||||
"regex-syntax 0.8.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -300,7 +303,7 @@ dependencies = [
|
|||
"globset",
|
||||
"log",
|
||||
"memchr",
|
||||
"regex-automata",
|
||||
"regex-automata 0.4.9",
|
||||
"same-file",
|
||||
"walkdir",
|
||||
"winapi-util",
|
||||
|
@ -322,6 +325,12 @@ dependencies = [
|
|||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.167"
|
||||
|
@ -362,6 +371,15 @@ dependencies = [
|
|||
"pkg-config",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "matchers"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
|
||||
dependencies = [
|
||||
"regex-automata 0.1.10",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.7.4"
|
||||
|
@ -377,6 +395,25 @@ dependencies = [
|
|||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-ansi-term"
|
||||
version = "0.46.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
|
||||
dependencies = [
|
||||
"overload",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-ansi-term"
|
||||
version = "0.50.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399"
|
||||
dependencies = [
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "object"
|
||||
version = "0.36.5"
|
||||
|
@ -386,6 +423,12 @@ dependencies = [
|
|||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.20.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
|
||||
|
||||
[[package]]
|
||||
name = "opener"
|
||||
version = "0.5.2"
|
||||
|
@ -396,6 +439,18 @@ dependencies = [
|
|||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "overload"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
|
||||
|
||||
[[package]]
|
||||
name = "pin-project-lite"
|
||||
version = "0.2.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
|
||||
|
||||
[[package]]
|
||||
name = "pkg-config"
|
||||
version = "0.3.31"
|
||||
|
@ -439,6 +494,27 @@ dependencies = [
|
|||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-automata 0.4.9",
|
||||
"regex-syntax 0.8.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
|
||||
dependencies = [
|
||||
"regex-syntax 0.6.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.9"
|
||||
|
@ -447,9 +523,15 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
|
|||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-syntax",
|
||||
"regex-syntax 0.8.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.6.29"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.8.5"
|
||||
|
@ -539,12 +621,27 @@ dependencies = [
|
|||
"digest",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sharded-slab"
|
||||
version = "0.1.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
|
||||
dependencies = [
|
||||
"lazy_static",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.13.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.87"
|
||||
|
@ -589,6 +686,16 @@ dependencies = [
|
|||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thread_local"
|
||||
version = "1.1.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.5.11"
|
||||
|
@ -598,6 +705,79 @@ dependencies = [
|
|||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tracing"
|
||||
version = "0.1.41"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
|
||||
dependencies = [
|
||||
"pin-project-lite",
|
||||
"tracing-attributes",
|
||||
"tracing-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tracing-attributes"
|
||||
version = "0.1.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tracing-core"
|
||||
version = "0.1.33"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
|
||||
dependencies = [
|
||||
"once_cell",
|
||||
"valuable",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tracing-log"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
|
||||
dependencies = [
|
||||
"log",
|
||||
"once_cell",
|
||||
"tracing-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tracing-subscriber"
|
||||
version = "0.3.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
|
||||
dependencies = [
|
||||
"matchers",
|
||||
"nu-ansi-term 0.46.0",
|
||||
"once_cell",
|
||||
"regex",
|
||||
"sharded-slab",
|
||||
"smallvec",
|
||||
"thread_local",
|
||||
"tracing",
|
||||
"tracing-core",
|
||||
"tracing-log",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tracing-tree"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f459ca79f1b0d5f71c54ddfde6debfc59c8b6eeb46808ae492077f739dc7b49c"
|
||||
dependencies = [
|
||||
"nu-ansi-term 0.50.1",
|
||||
"tracing-core",
|
||||
"tracing-log",
|
||||
"tracing-subscriber",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
version = "1.17.0"
|
||||
|
@ -610,6 +790,12 @@ version = "1.0.13"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
|
||||
|
||||
[[package]]
|
||||
name = "valuable"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
|
||||
|
||||
[[package]]
|
||||
name = "version_check"
|
||||
version = "0.9.5"
|
||||
|
|
|
@ -7,6 +7,7 @@ default-run = "bootstrap"
|
|||
|
||||
[features]
|
||||
build-metrics = ["sysinfo"]
|
||||
tracing = ["dep:tracing", "dep:tracing-subscriber", "dep:tracing-tree"]
|
||||
|
||||
[lib]
|
||||
path = "src/lib.rs"
|
||||
|
@ -64,6 +65,11 @@ xz2 = "0.1"
|
|||
# Dependencies needed by the build-metrics feature
|
||||
sysinfo = { version = "0.33.0", default-features = false, optional = true, features = ["system"] }
|
||||
|
||||
# Dependencies needed by the `logging` feature
|
||||
tracing = { version = "0.1", optional = true, features = ["attributes"] }
|
||||
tracing-subscriber = { version = "0.3", optional = true, features = ["env-filter", "fmt", "registry", "std"] }
|
||||
tracing-tree = { version = "0.4.0", optional = true }
|
||||
|
||||
[target.'cfg(windows)'.dependencies.junction]
|
||||
version = "1.0.0"
|
||||
|
||||
|
|
|
@ -1129,6 +1129,10 @@ class RustBuild(object):
|
|||
"-Zroot-dir=" + self.rust_root,
|
||||
]
|
||||
args.extend("--verbose" for _ in range(self.verbose))
|
||||
|
||||
if "BOOTSTRAP_TRACING" in env:
|
||||
args.append("--features=tracing")
|
||||
|
||||
if self.use_locked_deps:
|
||||
args.append("--locked")
|
||||
if self.use_vendored_sources:
|
||||
|
|
|
@ -15,8 +15,18 @@ use bootstrap::{
|
|||
human_readable_changes, t,
|
||||
};
|
||||
use build_helper::ci::CiEnv;
|
||||
#[cfg(feature = "tracing")]
|
||||
use tracing::*;
|
||||
#[cfg(feature = "tracing")]
|
||||
use tracing_subscriber::EnvFilter;
|
||||
#[cfg(feature = "tracing")]
|
||||
use tracing_subscriber::prelude::*;
|
||||
|
||||
#[cfg_attr(feature = "tracing", instrument(level = "trace", name = "main"))]
|
||||
fn main() {
|
||||
#[cfg(feature = "tracing")]
|
||||
setup_tracing();
|
||||
|
||||
let args = env::args().skip(1).collect::<Vec<_>>();
|
||||
|
||||
if Flags::try_parse_verbose_help(&args) {
|
||||
|
@ -187,3 +197,28 @@ fn check_version(config: &Config) -> Option<String> {
|
|||
|
||||
Some(msg)
|
||||
}
|
||||
|
||||
// # Note on `tracing` usage in bootstrap
|
||||
//
|
||||
// Due to the conditional compilation via the `tracing` cargo feature, this means that `tracing`
|
||||
// usages in bootstrap need to be also gated behind the `tracing` feature:
|
||||
//
|
||||
// - `tracing` macros (like `trace!`) and anything from `tracing`, `tracing_subscriber` and
|
||||
// `tracing-tree` will need to be gated by `#[cfg(feature = "tracing")]`.
|
||||
// - `tracing`'s `#[instrument(..)]` macro will need to be gated like `#![cfg_attr(feature =
|
||||
// "tracing", instrument(..))]`.
|
||||
#[cfg(feature = "tracing")]
|
||||
fn setup_tracing() {
|
||||
let filter = EnvFilter::from_env("BOOTSTRAP_TRACING");
|
||||
let layer = tracing_tree::HierarchicalLayer::default()
|
||||
.with_writer(std::io::stderr)
|
||||
.with_ansi(true)
|
||||
.with_targets(true)
|
||||
.with_bracketed_fields(true)
|
||||
.with_indent_amount(2)
|
||||
.with_indent_lines(true);
|
||||
let subscriber = tracing_subscriber::registry().with(filter).with(layer);
|
||||
|
||||
tracing::subscriber::set_global_default(subscriber).unwrap();
|
||||
trace!("tracing subscriber setup");
|
||||
}
|
||||
|
|
|
@ -915,7 +915,7 @@ impl Step for RustdocJSNotStd {
|
|||
builder.ensure(Compiletest {
|
||||
compiler: self.compiler,
|
||||
target: self.target,
|
||||
mode: "js-doc-test",
|
||||
mode: "rustdoc-js",
|
||||
suite: "rustdoc-js",
|
||||
path: "tests/rustdoc-js",
|
||||
compare_mode: None,
|
||||
|
@ -1730,7 +1730,7 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the
|
|||
cmd.arg("--minicore-path")
|
||||
.arg(builder.src.join("tests").join("auxiliary").join("minicore.rs"));
|
||||
|
||||
let is_rustdoc = suite.ends_with("rustdoc-ui") || suite.ends_with("rustdoc-js");
|
||||
let is_rustdoc = suite == "rustdoc-ui" || suite == "rustdoc-js";
|
||||
|
||||
if mode == "run-make" {
|
||||
let cargo_path = if builder.top_stage == 0 {
|
||||
|
@ -1758,7 +1758,7 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the
|
|||
if mode == "rustdoc"
|
||||
|| mode == "run-make"
|
||||
|| (mode == "ui" && is_rustdoc)
|
||||
|| mode == "js-doc-test"
|
||||
|| mode == "rustdoc-js"
|
||||
|| mode == "rustdoc-json"
|
||||
|| suite == "coverage-run-rustdoc"
|
||||
{
|
||||
|
@ -1830,8 +1830,8 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the
|
|||
|
||||
if let Some(ref nodejs) = builder.config.nodejs {
|
||||
cmd.arg("--nodejs").arg(nodejs);
|
||||
} else if mode == "js-doc-test" {
|
||||
panic!("need nodejs to run js-doc-test suite");
|
||||
} else if mode == "rustdoc-js" {
|
||||
panic!("need nodejs to run rustdoc-js suite");
|
||||
}
|
||||
if let Some(ref npm) = builder.config.npm {
|
||||
cmd.arg("--npm").arg(npm);
|
||||
|
|
|
@ -10,6 +10,7 @@ use std::io::{BufRead, BufReader, Read, Write};
|
|||
use std::process::{ChildStdout, Stdio};
|
||||
use std::time::Duration;
|
||||
|
||||
use build_helper::ci::CiEnv;
|
||||
use termcolor::{Color, ColorSpec, WriteColor};
|
||||
|
||||
use crate::core::builder::Builder;
|
||||
|
@ -91,7 +92,9 @@ struct Renderer<'a> {
|
|||
/// Number of tests that were skipped due to already being up-to-date
|
||||
/// (i.e. no relevant changes occurred since they last ran).
|
||||
up_to_date_tests: usize,
|
||||
ignored_tests: usize,
|
||||
terse_tests_in_line: usize,
|
||||
ci_latest_logged_percentage: f64,
|
||||
}
|
||||
|
||||
impl<'a> Renderer<'a> {
|
||||
|
@ -104,7 +107,9 @@ impl<'a> Renderer<'a> {
|
|||
tests_count: None,
|
||||
executed_tests: 0,
|
||||
up_to_date_tests: 0,
|
||||
ignored_tests: 0,
|
||||
terse_tests_in_line: 0,
|
||||
ci_latest_logged_percentage: 0.0,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -159,9 +164,12 @@ impl<'a> Renderer<'a> {
|
|||
fn render_test_outcome(&mut self, outcome: Outcome<'_>, test: &TestOutcome) {
|
||||
self.executed_tests += 1;
|
||||
|
||||
// Keep this in sync with the "up-to-date" ignore message inserted by compiletest.
|
||||
if let Outcome::Ignored { reason: Some("up-to-date") } = outcome {
|
||||
self.up_to_date_tests += 1;
|
||||
if let Outcome::Ignored { reason } = outcome {
|
||||
self.ignored_tests += 1;
|
||||
// Keep this in sync with the "up-to-date" ignore message inserted by compiletest.
|
||||
if reason == Some("up-to-date") {
|
||||
self.up_to_date_tests += 1;
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "build-metrics")]
|
||||
|
@ -179,6 +187,8 @@ impl<'a> Renderer<'a> {
|
|||
|
||||
if self.builder.config.verbose_tests {
|
||||
self.render_test_outcome_verbose(outcome, test);
|
||||
} else if CiEnv::is_ci() {
|
||||
self.render_test_outcome_ci(outcome, test);
|
||||
} else {
|
||||
self.render_test_outcome_terse(outcome, test);
|
||||
}
|
||||
|
@ -209,6 +219,31 @@ impl<'a> Renderer<'a> {
|
|||
let _ = std::io::stdout().flush();
|
||||
}
|
||||
|
||||
fn render_test_outcome_ci(&mut self, outcome: Outcome<'_>, test: &TestOutcome) {
|
||||
if let Some(total) = self.tests_count {
|
||||
let percent = self.executed_tests as f64 / total as f64;
|
||||
|
||||
if self.ci_latest_logged_percentage + 0.10 < percent {
|
||||
let total = total.to_string();
|
||||
let executed = format!("{:>width$}", self.executed_tests, width = total.len());
|
||||
let pretty_percent = format!("{:.0}%", percent * 100.0);
|
||||
let passed_tests = self.executed_tests - (self.failures.len() + self.ignored_tests);
|
||||
println!(
|
||||
"{:<4} -- {executed}/{total}, {:>total_indent$} passed, {} failed, {} ignored",
|
||||
pretty_percent,
|
||||
passed_tests,
|
||||
self.failures.len(),
|
||||
self.ignored_tests,
|
||||
total_indent = total.len()
|
||||
);
|
||||
self.ci_latest_logged_percentage += 0.10;
|
||||
}
|
||||
}
|
||||
|
||||
self.builder.colored_stdout(|stdout| outcome.write_ci(stdout, &test.name)).unwrap();
|
||||
let _ = std::io::stdout().flush();
|
||||
}
|
||||
|
||||
fn render_suite_outcome(&self, outcome: Outcome<'_>, suite: &SuiteOutcome) {
|
||||
// The terse output doesn't end with a newline, so we need to add it ourselves.
|
||||
if !self.builder.config.verbose_tests {
|
||||
|
@ -378,6 +413,17 @@ impl Outcome<'_> {
|
|||
}
|
||||
writer.reset()
|
||||
}
|
||||
|
||||
fn write_ci(&self, writer: &mut dyn WriteColor, name: &str) -> Result<(), std::io::Error> {
|
||||
match self {
|
||||
Outcome::Ok | Outcome::BenchOk | Outcome::Ignored { .. } => {}
|
||||
Outcome::Failed => {
|
||||
writer.set_color(ColorSpec::new().set_fg(Some(Color::Red)))?;
|
||||
writeln!(writer, " {name} ... FAILED")?;
|
||||
}
|
||||
}
|
||||
writer.reset()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(serde_derive::Deserialize)]
|
||||
|
|
|
@ -75,6 +75,7 @@
|
|||
- [Prologue](./building/bootstrapping/intro.md)
|
||||
- [What Bootstrapping does](./building/bootstrapping/what-bootstrapping-does.md)
|
||||
- [How Bootstrap does it](./building/bootstrapping/how-bootstrap-does-it.md)
|
||||
- [Debugging bootstrap](./building/bootstrapping/debugging-bootstrap.md)
|
||||
|
||||
# High-level Compiler Architecture
|
||||
|
||||
|
|
|
@ -0,0 +1,100 @@
|
|||
# Debugging bootstrap
|
||||
|
||||
> FIXME: this page could be expanded
|
||||
|
||||
## `tracing` in bootstrap
|
||||
|
||||
Bootstrap has conditional [`tracing`][tracing] setup to provide structured logging.
|
||||
|
||||
[tracing]: https://docs.rs/tracing/0.1.41/tracing/index.html
|
||||
|
||||
### Enabling `tracing` output
|
||||
|
||||
Bootstrap will conditionally enable `tracing` output if the `BOOTSTRAP_TRACING` env var is set.
|
||||
|
||||
Example usage:
|
||||
|
||||
```bash
|
||||
$ BOOTSTRAP_TRACING=TRACE ./x build library --stage 1
|
||||
```
|
||||
|
||||
Example output[^experimental]:
|
||||
|
||||

|
||||
|
||||
[^experimental]: This shows what's *possible* with the infra in an experimental implementation.
|
||||
|
||||
The env var `BOOTSTRAP_TRACING` accepts a [`tracing` env-filter][tracing-env-filter]. The `TRACE` filter will enable *all* `trace` level or less verbose level tracing output.
|
||||
|
||||
[tracing-env-filter]: https://docs.rs/tracing-subscriber/0.3.19/tracing_subscriber/filter/struct.EnvFilter.html
|
||||
|
||||
### Using `tracing` in bootstrap
|
||||
|
||||
Both `tracing::*` macros and the `tracing::instrument` proc-macro attribute need to be gated behind `tracing` feature. Examples:
|
||||
|
||||
```rs
|
||||
#[cfg(feature = "tracing")]
|
||||
use tracing::{instrument, trace};
|
||||
|
||||
struct Foo;
|
||||
|
||||
impl Step for Foo {
|
||||
type Output = ();
|
||||
|
||||
#[cfg_attr(feature = "tracing", instrument(level = "trace", name = "Foo::should_run", skip_all))]
|
||||
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
|
||||
#[cfg(feature = "tracing")]
|
||||
trace!(?run, "entered Foo::should_run");
|
||||
|
||||
todo!()
|
||||
}
|
||||
|
||||
#[cfg_attr(
|
||||
feature = "tracing",
|
||||
instrument(
|
||||
level = "trace",
|
||||
name = "Foo::run",
|
||||
skip_all,
|
||||
fields(compiler = ?builder.compiler),
|
||||
),
|
||||
)]
|
||||
fn run(self, builder: &Builder<'_>) -> Self::Output {
|
||||
#[cfg(feature = "tracing")]
|
||||
trace!(?run, "entered Foo::run");
|
||||
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
For `#[instrument]`, it's recommended to:
|
||||
|
||||
- Gate it behind `trace` level for fine-granularity, possibly `debug` level for core functions.
|
||||
- Explicitly pick an instrumentation name via `name = ".."` to distinguish between e.g. `run` of different steps.
|
||||
- Take care to not cause diverging behavior via tracing, e.g. building extra things only when tracing infra is enabled.
|
||||
|
||||
### Enabling `tracing` bootstrap feature in rust-analyzer
|
||||
|
||||
You can adjust your `settings.json`'s `rust-analyzer.check.overrideCommand` and `rust-analyzer.cargo.buildScripts.overrideCommand` if you want to also enable `logging` cargo feature by default in your editor. This is mostly useful if you want proper r-a completions and such when working on bootstrap itself.
|
||||
|
||||
```json
|
||||
"rust-analyzer.check.overrideCommand": [
|
||||
"BOOTSTRAP_TRACING=1", // <- BOOTSTRAP_TRACING=1 won't enable tracing filter, but it will activate bootstrap's `tracing` feature
|
||||
"python3",
|
||||
"x.py",
|
||||
"check",
|
||||
"--json-output",
|
||||
"--build-dir=build-rust-analyzer"
|
||||
],
|
||||
```
|
||||
|
||||
```json
|
||||
"rust-analyzer.cargo.buildScripts.overrideCommand": [
|
||||
"BOOTSTRAP_TRACING=1", // <- note this
|
||||
"python3",
|
||||
"x.py",
|
||||
"check",
|
||||
"--json-output",
|
||||
"--build-dir=build-rust-analyzer"
|
||||
],
|
||||
```
|
Binary file not shown.
After Width: | Height: | Size: 137 KiB |
|
@ -17,5 +17,8 @@ In this section, we give a high-level overview of
|
|||
[what Bootstrap does](./what-bootstrapping-does.md), followed by a high-level
|
||||
introduction to [how Bootstrap does it](./how-bootstrap-does-it.md).
|
||||
|
||||
Additionally, see [debugging bootstrap](./debugging-bootstrap.md) to learn
|
||||
about debugging methods.
|
||||
|
||||
[boot]: https://en.wikipedia.org/wiki/Bootstrapping_(compilers)
|
||||
[ocaml-compiler]: https://github.com/rust-lang/rust/tree/ef75860a0a72f79f97216f8aaa5b388d98da6480/src/boot
|
||||
|
|
|
@ -67,7 +67,7 @@ string_enum! {
|
|||
Incremental => "incremental",
|
||||
RunMake => "run-make",
|
||||
Ui => "ui",
|
||||
JsDocTest => "js-doc-test",
|
||||
RustdocJs => "rustdoc-js",
|
||||
MirOpt => "mir-opt",
|
||||
Assembly => "assembly",
|
||||
CoverageMap => "coverage-map",
|
||||
|
|
|
@ -591,7 +591,7 @@ fn test_forbidden_revisions_allowed_in_non_filecheck_dir() {
|
|||
"codegen-units",
|
||||
"incremental",
|
||||
"ui",
|
||||
"js-doc-test",
|
||||
"rustdoc-js",
|
||||
"coverage-map",
|
||||
"coverage-run",
|
||||
"crashes",
|
||||
|
|
|
@ -71,7 +71,7 @@ pub fn parse_config(args: Vec<String>) -> Config {
|
|||
"which sort of compile tests to run",
|
||||
"pretty | debug-info | codegen | rustdoc \
|
||||
| rustdoc-json | codegen-units | incremental | run-make | ui \
|
||||
| js-doc-test | mir-opt | assembly | crashes",
|
||||
| rustdoc-js | mir-opt | assembly | crashes",
|
||||
)
|
||||
.reqopt(
|
||||
"",
|
||||
|
|
|
@ -17,8 +17,8 @@ use tracing::*;
|
|||
|
||||
use crate::common::{
|
||||
Assembly, Codegen, CodegenUnits, CompareMode, Config, CoverageMap, CoverageRun, Crashes,
|
||||
DebugInfo, Debugger, FailMode, Incremental, JsDocTest, MirOpt, PassMode, Pretty, RunMake,
|
||||
Rustdoc, RustdocJson, TestPaths, UI_EXTENSIONS, UI_FIXED, UI_RUN_STDERR, UI_RUN_STDOUT,
|
||||
DebugInfo, Debugger, FailMode, Incremental, MirOpt, PassMode, Pretty, RunMake, Rustdoc,
|
||||
RustdocJs, RustdocJson, TestPaths, UI_EXTENSIONS, UI_FIXED, UI_RUN_STDERR, UI_RUN_STDOUT,
|
||||
UI_STDERR, UI_STDOUT, UI_SVG, UI_WINDOWS_SVG, Ui, expected_output_path, incremental_dir,
|
||||
output_base_dir, output_base_name, output_testname_unique,
|
||||
};
|
||||
|
@ -269,7 +269,7 @@ impl<'test> TestCx<'test> {
|
|||
Ui => self.run_ui_test(),
|
||||
MirOpt => self.run_mir_opt_test(),
|
||||
Assembly => self.run_assembly_test(),
|
||||
JsDocTest => self.run_js_doc_test(),
|
||||
RustdocJs => self.run_rustdoc_js_test(),
|
||||
CoverageMap => self.run_coverage_map_test(), // see self::coverage
|
||||
CoverageRun => self.run_coverage_run_test(), // see self::coverage
|
||||
Crashes => self.run_crash_test(),
|
||||
|
@ -303,7 +303,7 @@ impl<'test> TestCx<'test> {
|
|||
|
||||
fn should_compile_successfully(&self, pm: Option<PassMode>) -> bool {
|
||||
match self.config.mode {
|
||||
JsDocTest => true,
|
||||
RustdocJs => true,
|
||||
Ui => pm.is_some() || self.props.fail_mode > Some(FailMode::Build),
|
||||
Crashes => false,
|
||||
Incremental => {
|
||||
|
@ -1627,7 +1627,7 @@ impl<'test> TestCx<'test> {
|
|||
Crashes => {
|
||||
set_mir_dump_dir(&mut rustc);
|
||||
}
|
||||
Pretty | DebugInfo | Rustdoc | RustdocJson | RunMake | CodegenUnits | JsDocTest => {
|
||||
Pretty | DebugInfo | Rustdoc | RustdocJson | RunMake | CodegenUnits | RustdocJs => {
|
||||
// do not use JSON output
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@ use std::process::Command;
|
|||
use super::TestCx;
|
||||
|
||||
impl TestCx<'_> {
|
||||
pub(super) fn run_js_doc_test(&self) {
|
||||
pub(super) fn run_rustdoc_js_test(&self) {
|
||||
if let Some(nodejs) = &self.config.nodejs {
|
||||
let out_dir = self.output_base_dir();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue