diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 5985dcb97c739..801497cae2acb 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 { @@ -1292,7 +1293,7 @@ pub fn rustc_short_optgroups() -> Vec { 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"), @@ -1638,6 +1639,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 64f61b65323c0..a82c5e40d7040 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -742,7 +742,9 @@ impl RustcDefaultCalls { odir: &Option, ofile: &Option) -> 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; } @@ -852,6 +854,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 338f3bb08aa97..45f71d4a8b6a1 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