diff options
| author | bors <bors@rust-lang.org> | 2017-09-04 23:06:59 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-09-04 23:06:59 +0000 |
| commit | 22d65983b9b9ef4300bc84926c0ae8e1ec1897dd (patch) | |
| tree | 932c256075ce9b398cbe130ec4a5b83cc6c11ec8 | |
| parent | 088216fb997c9cb12ce049bbe7975d1f657551ca (diff) | |
| parent | 2354089ece7d03f997caf8a9f6ad99d235c8dacb (diff) | |
| download | rust-22d65983b9b9ef4300bc84926c0ae8e1ec1897dd.tar.gz rust-22d65983b9b9ef4300bc84926c0ae8e1ec1897dd.zip | |
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.
| -rw-r--r-- | src/librustc/session/config.rs | 4 | ||||
| -rw-r--r-- | src/librustc_driver/lib.rs | 7 | ||||
| -rw-r--r-- | src/librustc_trans/back/link.rs | 48 |
3 files changed, 52 insertions, 7 deletions
diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 99fe8e60ae5..b538c6a6eca 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -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 diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index 1915a1c8648..5011b537990 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -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; diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs index 4e211d83cff..4b56376ad9b 100644 --- a/src/librustc_trans/back/link.rs +++ b/src/librustc_trans/back/link.rs @@ -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() { - 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"); + 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("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 |
