mirror of https://github.com/rust-lang/rust.git
Always compile rustdoc with debug logging enabled when `download-rustc` is set
Previously, logging at DEBUG or below would always be silenced, because rustc compiles tracing with the `static_max_level_info` feature. That makes sense for release artifacts, but not for developing rustdoc. Instead, this compiles two different versions of tracing: one in the release artifacts, distributed in the sysroot, and a new version compiled by rustdoc. Since `rustc_driver` is always linked to the version of sysroot, this copy/pastes `init_env_logging` into rustdoc. The builds the second version of tracing unconditionally; see the code for details on why.
This commit is contained in:
parent
fe1bf8e05c
commit
65f0b2549c
|
@ -4452,6 +4452,9 @@ dependencies = [
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"smallvec 1.6.1",
|
"smallvec 1.6.1",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
|
"tracing",
|
||||||
|
"tracing-subscriber",
|
||||||
|
"tracing-tree",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -19,6 +19,13 @@ tempfile = "3"
|
||||||
itertools = "0.9"
|
itertools = "0.9"
|
||||||
regex = "1"
|
regex = "1"
|
||||||
rustdoc-json-types = { path = "../rustdoc-json-types" }
|
rustdoc-json-types = { path = "../rustdoc-json-types" }
|
||||||
|
tracing = "0.1"
|
||||||
|
tracing-tree = "0.1.6"
|
||||||
|
|
||||||
|
[dependencies.tracing-subscriber]
|
||||||
|
version = "0.2.13"
|
||||||
|
default-features = false
|
||||||
|
features = ["fmt", "env-filter", "smallvec", "parking_lot", "ansi"]
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
expect-test = "1.0"
|
expect-test = "1.0"
|
||||||
|
|
|
@ -95,7 +95,19 @@ mod visit_lib;
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
rustc_driver::set_sigpipe_handler();
|
rustc_driver::set_sigpipe_handler();
|
||||||
rustc_driver::install_ice_hook();
|
rustc_driver::install_ice_hook();
|
||||||
|
|
||||||
|
// When using CI artifacts (with `download_stage1 = true`), tracing is unconditionally built
|
||||||
|
// with `--features=static_max_level_info`, which disables almost all rustdoc logging. To avoid
|
||||||
|
// this, compile our own version of `tracing` that logs all levels.
|
||||||
|
// NOTE: this compiles both versions of tracing unconditionally, because
|
||||||
|
// - The compile time hit is not that bad, especially compared to rustdoc's incremental times, and
|
||||||
|
// - Otherwise, there's no warning that logging is being ignored when `download_stage1 = true`.
|
||||||
|
// NOTE: The reason this doesn't show double logging when `download_stage1 = false` and
|
||||||
|
// `debug_logging = true` is because all rustc logging goes to its version of tracing (the one
|
||||||
|
// in the sysroot), and all of rustdoc's logging goes to its version (the one in Cargo.toml).
|
||||||
|
init_logging();
|
||||||
rustc_driver::init_env_logger("RUSTDOC_LOG");
|
rustc_driver::init_env_logger("RUSTDOC_LOG");
|
||||||
|
|
||||||
let exit_code = rustc_driver::catch_with_exit_code(|| match get_args() {
|
let exit_code = rustc_driver::catch_with_exit_code(|| match get_args() {
|
||||||
Some(args) => main_args(&args),
|
Some(args) => main_args(&args),
|
||||||
_ => Err(ErrorReported),
|
_ => Err(ErrorReported),
|
||||||
|
@ -103,6 +115,68 @@ pub fn main() {
|
||||||
process::exit(exit_code);
|
process::exit(exit_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn init_logging() {
|
||||||
|
use std::io;
|
||||||
|
|
||||||
|
// FIXME remove these and use winapi 0.3 instead
|
||||||
|
// Duplicates: bootstrap/compile.rs, librustc_errors/emitter.rs, rustc_driver/lib.rs
|
||||||
|
#[cfg(unix)]
|
||||||
|
fn stdout_isatty() -> bool {
|
||||||
|
extern crate libc;
|
||||||
|
unsafe { libc::isatty(libc::STDOUT_FILENO) != 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(windows)]
|
||||||
|
fn stdout_isatty() -> bool {
|
||||||
|
extern crate winapi;
|
||||||
|
use winapi::um::consoleapi::GetConsoleMode;
|
||||||
|
use winapi::um::processenv::GetStdHandle;
|
||||||
|
use winapi::um::winbase::STD_OUTPUT_HANDLE;
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
let handle = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
let mut out = 0;
|
||||||
|
GetConsoleMode(handle, &mut out) != 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let color_logs = match std::env::var("RUSTDOC_LOG_COLOR") {
|
||||||
|
Ok(value) => match value.as_ref() {
|
||||||
|
"always" => true,
|
||||||
|
"never" => false,
|
||||||
|
"auto" => stdout_isatty(),
|
||||||
|
_ => early_error(
|
||||||
|
ErrorOutputType::default(),
|
||||||
|
&format!(
|
||||||
|
"invalid log color value '{}': expected one of always, never, or auto",
|
||||||
|
value
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
Err(std::env::VarError::NotPresent) => stdout_isatty(),
|
||||||
|
Err(std::env::VarError::NotUnicode(_value)) => early_error(
|
||||||
|
ErrorOutputType::default(),
|
||||||
|
"non-Unicode log color value: expected one of always, never, or auto",
|
||||||
|
),
|
||||||
|
};
|
||||||
|
let filter = tracing_subscriber::EnvFilter::from_env("RUSTDOC_LOG");
|
||||||
|
let layer = tracing_tree::HierarchicalLayer::default()
|
||||||
|
.with_writer(io::stderr)
|
||||||
|
.with_indent_lines(true)
|
||||||
|
.with_ansi(color_logs)
|
||||||
|
.with_targets(true)
|
||||||
|
.with_wraparound(10)
|
||||||
|
.with_verbose_exit(true)
|
||||||
|
.with_verbose_entry(true)
|
||||||
|
.with_indent_amount(2);
|
||||||
|
#[cfg(parallel_compiler)]
|
||||||
|
let layer = layer.with_thread_ids(true).with_thread_names(true);
|
||||||
|
|
||||||
|
use tracing_subscriber::layer::SubscriberExt;
|
||||||
|
let subscriber = tracing_subscriber::Registry::default().with(filter).with(layer);
|
||||||
|
tracing::subscriber::set_global_default(subscriber).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
fn get_args() -> Option<Vec<String>> {
|
fn get_args() -> Option<Vec<String>> {
|
||||||
env::args_os()
|
env::args_os()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
|
|
Loading…
Reference in New Issue