Implement printing to file in print_crate_info
This commit is contained in:
parent
f2e3d3fc63
commit
5a60660ff8
@ -49,6 +49,7 @@
|
||||
use std::collections::BTreeMap;
|
||||
use std::env;
|
||||
use std::ffi::OsString;
|
||||
use std::fmt::Write as _;
|
||||
use std::fs;
|
||||
use std::io::{self, IsTerminal, Read, Write};
|
||||
use std::panic::{self, catch_unwind};
|
||||
@ -65,6 +66,11 @@
|
||||
)
|
||||
}
|
||||
|
||||
#[allow(unused_macros)]
|
||||
macro do_not_use_safe_print($($t:tt)*) {
|
||||
std::compile_error!("Don't use `safe_print` or `safe_println` here, use `println_info` instead")
|
||||
}
|
||||
|
||||
// This import blocks the use of panicking `print` and `println` in all the code
|
||||
// below. Please use `safe_print` and `safe_println` to avoid ICE when
|
||||
// encountering an I/O error during print.
|
||||
@ -713,6 +719,13 @@ fn print_crate_info(
|
||||
parse_attrs: bool,
|
||||
) -> Compilation {
|
||||
use rustc_session::config::PrintKind::*;
|
||||
|
||||
// This import prevents the following code from using the printing macros
|
||||
// used by the rest of the module. Within this function, we only write to
|
||||
// the output specified by `sess.io.output_file`.
|
||||
#[allow(unused_imports)]
|
||||
use {do_not_use_safe_print as safe_print, do_not_use_safe_print as safe_println};
|
||||
|
||||
// NativeStaticLibs and LinkArgs are special - printed during linking
|
||||
// (empty iterator returns true)
|
||||
if sess.opts.prints.iter().all(|p| p.kind == NativeStaticLibs || p.kind == LinkArgs) {
|
||||
@ -731,17 +744,23 @@ fn print_crate_info(
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
for req in &sess.opts.prints {
|
||||
let mut crate_info = String::new();
|
||||
macro println_info($($arg:tt)*) {
|
||||
crate_info.write_fmt(format_args!("{}\n", format_args!($($arg)*))).unwrap()
|
||||
}
|
||||
|
||||
match req.kind {
|
||||
TargetList => {
|
||||
let mut targets = rustc_target::spec::TARGETS.to_vec();
|
||||
targets.sort_unstable();
|
||||
safe_println!("{}", targets.join("\n"));
|
||||
println_info!("{}", targets.join("\n"));
|
||||
}
|
||||
Sysroot => safe_println!("{}", sess.sysroot.display()),
|
||||
TargetLibdir => safe_println!("{}", sess.target_tlib_path.dir.display()),
|
||||
Sysroot => println_info!("{}", sess.sysroot.display()),
|
||||
TargetLibdir => println_info!("{}", sess.target_tlib_path.dir.display()),
|
||||
TargetSpec => {
|
||||
safe_println!("{}", serde_json::to_string_pretty(&sess.target.to_json()).unwrap());
|
||||
println_info!("{}", serde_json::to_string_pretty(&sess.target.to_json()).unwrap());
|
||||
}
|
||||
AllTargetSpecs => {
|
||||
let mut targets = BTreeMap::new();
|
||||
@ -750,7 +769,7 @@ fn print_crate_info(
|
||||
let target = Target::expect_builtin(&triple);
|
||||
targets.insert(name, target.to_json());
|
||||
}
|
||||
safe_println!("{}", serde_json::to_string_pretty(&targets).unwrap());
|
||||
println_info!("{}", serde_json::to_string_pretty(&targets).unwrap());
|
||||
}
|
||||
FileNames | CrateName => {
|
||||
let Some(attrs) = attrs.as_ref() else {
|
||||
@ -760,14 +779,14 @@ fn print_crate_info(
|
||||
let t_outputs = rustc_interface::util::build_output_filenames(attrs, sess);
|
||||
let id = rustc_session::output::find_crate_name(sess, attrs);
|
||||
if req.kind == CrateName {
|
||||
safe_println!("{id}");
|
||||
continue;
|
||||
}
|
||||
let crate_types = collect_crate_types(sess, attrs);
|
||||
for &style in &crate_types {
|
||||
let fname =
|
||||
rustc_session::output::filename_for_input(sess, style, id, &t_outputs);
|
||||
safe_println!("{}", fname.as_path().file_name().unwrap().to_string_lossy());
|
||||
println_info!("{id}");
|
||||
} else {
|
||||
let crate_types = collect_crate_types(sess, attrs);
|
||||
for &style in &crate_types {
|
||||
let fname =
|
||||
rustc_session::output::filename_for_input(sess, style, id, &t_outputs);
|
||||
println_info!("{}", fname.as_path().file_name().unwrap().to_string_lossy());
|
||||
}
|
||||
}
|
||||
}
|
||||
Cfg => {
|
||||
@ -801,13 +820,13 @@ fn print_crate_info(
|
||||
|
||||
cfgs.sort();
|
||||
for cfg in cfgs {
|
||||
safe_println!("{cfg}");
|
||||
println_info!("{cfg}");
|
||||
}
|
||||
}
|
||||
CallingConventions => {
|
||||
let mut calling_conventions = rustc_target::spec::abi::all_names();
|
||||
calling_conventions.sort_unstable();
|
||||
safe_println!("{}", calling_conventions.join("\n"));
|
||||
println_info!("{}", calling_conventions.join("\n"));
|
||||
}
|
||||
RelocationModels
|
||||
| CodeModels
|
||||
@ -825,7 +844,7 @@ fn print_crate_info(
|
||||
|
||||
for split in &[Off, Packed, Unpacked] {
|
||||
if sess.target.options.supported_split_debuginfo.contains(split) {
|
||||
safe_println!("{split}");
|
||||
println_info!("{split}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -833,7 +852,7 @@ fn print_crate_info(
|
||||
use rustc_target::spec::current_apple_deployment_target;
|
||||
|
||||
if sess.target.is_like_osx {
|
||||
safe_println!(
|
||||
println_info!(
|
||||
"deployment_target={}",
|
||||
current_apple_deployment_target(&sess.target)
|
||||
.expect("unknown Apple target OS")
|
||||
@ -844,6 +863,8 @@ fn print_crate_info(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
req.out.overwrite(&crate_info, sess);
|
||||
}
|
||||
Compilation::Stop
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user