Skip to content

Commit

Permalink
Auto merge of #56397 - petrhosek:file-search, r=cramertj
Browse files Browse the repository at this point in the history
Search other library paths when loking for link objects

Support the case when link objects are not located in Rust sysroot
but in other locations which could be specify through library paths.
  • Loading branch information
bors committed Dec 19, 2018
2 parents d99a320 + 6d9640b commit e7b4bc3
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 5 deletions.
24 changes: 19 additions & 5 deletions src/librustc_codegen_llvm/back/link.rs
Expand Up @@ -457,6 +457,21 @@ fn print_native_static_libs(sess: &Session, all_native_libs: &[NativeLibrary]) {
}
}

fn get_file_path(sess: &Session, name: &str) -> PathBuf {
let fs = sess.target_filesearch(PathKind::Native);
let file_path = fs.get_lib_path().join(name);
if file_path.exists() {
return file_path
}
for search_path in fs.search_paths() {
let file_path = search_path.dir.join(name);
if file_path.exists() {
return file_path
}
}
PathBuf::from(name)
}

// Create a dynamic library or executable
//
// This will invoke the system linker/cc to create the resulting file. This
Expand All @@ -472,7 +487,6 @@ fn link_natively(sess: &Session,
// The invocations of cc share some flags across platforms
let (pname, mut cmd) = get_linker(sess, &linker, flavor);

let root = sess.target_filesearch(PathKind::Native).get_lib_path();
if let Some(args) = sess.target.target.options.pre_link_args.get(&flavor) {
cmd.args(args);
}
Expand Down Expand Up @@ -500,12 +514,12 @@ fn link_natively(sess: &Session,
&sess.target.target.options.pre_link_objects_dll
};
for obj in pre_link_objects {
cmd.arg(root.join(obj));
cmd.arg(get_file_path(sess, obj));
}

if crate_type == config::CrateType::Executable && sess.crt_static() {
for obj in &sess.target.target.options.pre_link_objects_exe_crt {
cmd.arg(root.join(obj));
cmd.arg(get_file_path(sess, obj));
}
}

Expand All @@ -529,11 +543,11 @@ fn link_natively(sess: &Session,
cmd.args(args);
}
for obj in &sess.target.target.options.post_link_objects {
cmd.arg(root.join(obj));
cmd.arg(get_file_path(sess, obj));
}
if sess.crt_static() {
for obj in &sess.target.target.options.post_link_objects_crt {
cmd.arg(root.join(obj));
cmd.arg(get_file_path(sess, obj));
}
}
if let Some(args) = sess.target.target.options.post_link_args.get(&flavor) {
Expand Down
16 changes: 16 additions & 0 deletions src/test/run-make-fulldeps/libs-search-path/Makefile
@@ -0,0 +1,16 @@
-include ../tools.mk

ifeq ($(if $(IS_WINDOWS),$(IS_MSVC),no),)

all: empty.rs
cp -r $(shell cygpath -u $(shell $(RUSTC) --print sysroot)) $(TMPDIR)/sysroot
$(RUSTC) --target $(TARGET) --sysroot $(TMPDIR)/sysroot -L$(TMPDIR)/obj -Z print-link-args empty.rs | $(CGREP) 'lib\\crt2.o'
mkdir -p $(TMPDIR)/obj
mv $(TMPDIR)/sysroot/lib/rustlib/$(TARGET)/lib/crt2.o $(TMPDIR)/obj/crt2.o
$(RUSTC) --target $(TARGET) --sysroot $(TMPDIR)/sysroot -L$(TMPDIR)/obj -Z print-link-args empty.rs | $(CGREP) 'obj\\crt2.o'

else

all:

endif
11 changes: 11 additions & 0 deletions src/test/run-make-fulldeps/libs-search-path/empty.rs
@@ -0,0 +1,11 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

fn main() {}

0 comments on commit e7b4bc3

Please sign in to comment.