Skip to content

Commit

Permalink
--print=native-static-libs
Browse files Browse the repository at this point in the history
  • Loading branch information
kornelski committed Aug 22, 2017
1 parent 0314e10 commit 2920658
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 3 deletions.
4 changes: 3 additions & 1 deletion src/librustc/session/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,7 @@ pub enum PrintRequest {
RelocationModels,
CodeModels,
TargetSpec,
NativeStaticLibs,
}

pub enum Input {
Expand Down Expand Up @@ -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"),
Expand Down Expand Up @@ -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
Expand Down
7 changes: 6 additions & 1 deletion src/librustc_driver/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down
38 changes: 37 additions & 1 deletion src/librustc_trans/back/link.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 {
Expand All @@ -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
Expand Down

0 comments on commit 2920658

Please sign in to comment.