Auto merge of #56397 - petrhosek:file-search, r=cramertj
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.
This commit is contained in:
commit
e7b4bc35e9
@ -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
|
||||
@ -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);
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
16
src/test/run-make-fulldeps/libs-search-path/Makefile
Normal file
16
src/test/run-make-fulldeps/libs-search-path/Makefile
Normal file
@ -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
src/test/run-make-fulldeps/libs-search-path/empty.rs
Normal file
11
src/test/run-make-fulldeps/libs-search-path/empty.rs
Normal file
@ -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() {}
|
Loading…
x
Reference in New Issue
Block a user