From 0314e10c3fa6918f48e797cd716f0ec934829803 Mon Sep 17 00:00:00 2001 From: Kornel Date: Sun, 20 Aug 2017 21:18:49 +0100 Subject: [PATCH 1/3] Split print function --- src/librustc_trans/back/link.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs index 338f3bb08aa..a998afc2d20 100644 --- a/src/librustc_trans/back/link.rs +++ b/src/librustc_trans/back/link.rs @@ -647,11 +647,13 @@ 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"); + 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"); for lib in all_native_libs.iter().filter(|l| relevant_lib(sess, l)) { let name = match lib.kind { From 2920658da6738de7c693dd178a9939a91df8b865 Mon Sep 17 00:00:00 2001 From: Kornel Date: Tue, 22 Aug 2017 21:20:42 +0100 Subject: [PATCH 2/3] --print=native-static-libs --- src/librustc/session/config.rs | 4 +++- src/librustc_driver/lib.rs | 7 +++++- src/librustc_trans/back/link.rs | 38 ++++++++++++++++++++++++++++++++- 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 { 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 64f61b65323..a82c5e40d70 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 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 From 2354089ece7d03f997caf8a9f6ad99d235c8dacb Mon Sep 17 00:00:00 2001 From: Kornel Date: Sat, 2 Sep 2017 12:14:30 +0100 Subject: [PATCH 3/3] Minor compilation fix --- src/librustc_trans/back/link.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs index 3c4defb07bb..45f71d4a8b6 100644 --- a/src/librustc_trans/back/link.rs +++ b/src/librustc_trans/back/link.rs @@ -699,7 +699,7 @@ fn print_native_static_libs(sess: &Session, all_native_libs: &[NativeLibrary]) { 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(" "))); + sess.note_without_error(&format!("native-static-libs: {}", &lib_args.join(" "))); } }