Auto merge of #43067 - pornel:libdeps, r=nrc
Compact display of static lib dependencies Fixes #33173 Instead of displaying one dependency per line, I've changed the format to display them all in one line. As a bonus they're in format of linker flags (`-lfoo`), so the output can be copy&pasted if one is actually going to link as suggested.
This commit is contained in:
commit
22d65983b9
3 changed files with 52 additions and 7 deletions
|
@ -340,6 +340,7 @@ pub enum PrintRequest {
|
|||
RelocationModels,
|
||||
CodeModels,
|
||||
TargetSpec,
|
||||
NativeStaticLibs,
|
||||
}
|
||||
|
||||
pub enum Input {
|
||||
|
@ -1296,7 +1297,7 @@ pub fn rustc_short_optgroups() -> Vec<RustcOptGroup> {
|
|||
print on stdout",
|
||||
"[crate-name|file-names|sysroot|cfg|target-list|\
|
||||
target-cpus|target-features|relocation-models|\
|
||||
code-models|target-spec-json]"),
|
||||
code-models|target-spec-json|native-static-deps]"),
|
||||
opt::flagmulti_s("g", "", "Equivalent to -C debuginfo=2"),
|
||||
opt::flagmulti_s("O", "", "Equivalent to -C opt-level=2"),
|
||||
opt::opt_s("o", "", "Write output to <filename>", "FILENAME"),
|
||||
|
@ -1642,6 +1643,7 @@ pub fn build_session_options_and_crate_config(matches: &getopts::Matches)
|
|||
"target-features" => PrintRequest::TargetFeatures,
|
||||
"relocation-models" => PrintRequest::RelocationModels,
|
||||
"code-models" => PrintRequest::CodeModels,
|
||||
"native-static-libs" => PrintRequest::NativeStaticLibs,
|
||||
"target-spec-json" => {
|
||||
if nightly_options::is_unstable_enabled(matches) {
|
||||
PrintRequest::TargetSpec
|
||||
|
|
|
@ -741,7 +741,9 @@ impl RustcDefaultCalls {
|
|||
odir: &Option<PathBuf>,
|
||||
ofile: &Option<PathBuf>)
|
||||
-> Compilation {
|
||||
if sess.opts.prints.is_empty() {
|
||||
// PrintRequest::NativeStaticLibs is special - printed during linking
|
||||
// (empty iterator returns true)
|
||||
if sess.opts.prints.iter().all(|&p| p==PrintRequest::NativeStaticLibs) {
|
||||
return Compilation::Continue;
|
||||
}
|
||||
|
||||
|
@ -851,6 +853,9 @@ impl RustcDefaultCalls {
|
|||
PrintRequest::TargetCPUs | PrintRequest::TargetFeatures => {
|
||||
rustc_trans::print(*req, sess);
|
||||
}
|
||||
PrintRequest::NativeStaticLibs => {
|
||||
println!("Native static libs can be printed only during linking");
|
||||
}
|
||||
}
|
||||
}
|
||||
return Compilation::Stop;
|
||||
|
|
|
@ -15,7 +15,7 @@ use super::linker::Linker;
|
|||
use super::rpath::RPathConfig;
|
||||
use super::rpath;
|
||||
use metadata::METADATA_FILENAME;
|
||||
use rustc::session::config::{self, NoDebugInfo, OutputFilenames, OutputType};
|
||||
use rustc::session::config::{self, NoDebugInfo, OutputFilenames, OutputType, PrintRequest};
|
||||
use rustc::session::filesearch;
|
||||
use rustc::session::search_paths::PathKind;
|
||||
use rustc::session::Session;
|
||||
|
@ -647,11 +647,20 @@ fn link_staticlib(sess: &Session,
|
|||
ab.build();
|
||||
|
||||
if !all_native_libs.is_empty() {
|
||||
if sess.opts.prints.contains(&PrintRequest::NativeStaticLibs) {
|
||||
print_native_static_libs(sess, &all_native_libs);
|
||||
} else {
|
||||
// Fallback for backwards compatibility only
|
||||
print_native_static_libs_legacy(sess, &all_native_libs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn print_native_static_libs_legacy(sess: &Session, all_native_libs: &[NativeLibrary]) {
|
||||
sess.note_without_error("link against the following native artifacts when linking against \
|
||||
this static library");
|
||||
sess.note_without_error("the order and any duplication can be significant on some \
|
||||
platforms, and so may need to be preserved");
|
||||
}
|
||||
sess.note_without_error("This list will not be printed by default. \
|
||||
Please add --print=native-static-libs if you need this information");
|
||||
|
||||
for lib in all_native_libs.iter().filter(|l| relevant_lib(sess, l)) {
|
||||
let name = match lib.kind {
|
||||
|
@ -665,6 +674,35 @@ fn link_staticlib(sess: &Session,
|
|||
}
|
||||
}
|
||||
|
||||
fn print_native_static_libs(sess: &Session, all_native_libs: &[NativeLibrary]) {
|
||||
let lib_args: Vec<_> = all_native_libs.iter()
|
||||
.filter(|l| relevant_lib(sess, l))
|
||||
.filter_map(|lib| match lib.kind {
|
||||
NativeLibraryKind::NativeStaticNobundle |
|
||||
NativeLibraryKind::NativeUnknown => {
|
||||
if sess.target.target.options.is_like_msvc {
|
||||
Some(format!("{}.lib", lib.name))
|
||||
} else {
|
||||
Some(format!("-l{}", lib.name))
|
||||
}
|
||||
},
|
||||
NativeLibraryKind::NativeFramework => {
|
||||
// ld-only syntax, since there are no frameworks in MSVC
|
||||
Some(format!("-framework {}", lib.name))
|
||||
},
|
||||
// These are included, no need to print them
|
||||
NativeLibraryKind::NativeStatic => None,
|
||||
})
|
||||
.collect();
|
||||
if !lib_args.is_empty() {
|
||||
sess.note_without_error("Link against the following native artifacts when linking \
|
||||
against this static library. The order and any duplication \
|
||||
can be significant on some platforms.");
|
||||
// Prefix for greppability
|
||||
sess.note_without_error(&format!("native-static-libs: {}", &lib_args.join(" ")));
|
||||
}
|
||||
}
|
||||
|
||||
// Create a dynamic library or executable
|
||||
//
|
||||
// This will invoke the system linker/cc to create the resulting file. This
|
||||
|
|
Loading…
Reference in a new issue