about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKornel <kornel@geekhood.net>2017-08-22 21:20:42 +0100
committerKornel <kornel@geekhood.net>2017-08-22 21:20:42 +0100
commit2920658da6738de7c693dd178a9939a91df8b865 (patch)
tree525f42b20f6d496b16f4a268c41f118ae05e3fdf
parent0314e10c3fa6918f48e797cd716f0ec934829803 (diff)
downloadrust-2920658da6738de7c693dd178a9939a91df8b865.tar.gz
rust-2920658da6738de7c693dd178a9939a91df8b865.zip
--print=native-static-libs
-rw-r--r--src/librustc/session/config.rs4
-rw-r--r--src/librustc_driver/lib.rs7
-rw-r--r--src/librustc_trans/back/link.rs38
3 files changed, 46 insertions, 3 deletions
diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs
index 5985dcb97c7..801497cae2a 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<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"),
@@ -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 64f61b65323..a82c5e40d70 100644
--- a/src/librustc_driver/lib.rs
+++ b/src/librustc_driver/lib.rs
@@ -742,7 +742,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;
         }
 
@@ -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 a998afc2d20..3c4defb07bb 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,13 +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("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 {
@@ -667,6 +674,35 @@ fn print_native_static_libs_legacy(sess: &Session, all_native_libs: &[NativeLibr
     }
 }
 
+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