From 6d9640b6f6275a4b59e2a59705e18807329b9300 Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Fri, 30 Nov 2018 19:19:47 -0800 Subject: [PATCH] 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. --- src/librustc_codegen_llvm/back/link.rs | 24 +++++++++++++++---- .../libs-search-path/Makefile | 16 +++++++++++++ .../libs-search-path/empty.rs | 11 +++++++++ 3 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 src/test/run-make-fulldeps/libs-search-path/Makefile create mode 100644 src/test/run-make-fulldeps/libs-search-path/empty.rs diff --git a/src/librustc_codegen_llvm/back/link.rs b/src/librustc_codegen_llvm/back/link.rs index f1c0464f5f2..55ab0724e94 100644 --- a/src/librustc_codegen_llvm/back/link.rs +++ b/src/librustc_codegen_llvm/back/link.rs @@ -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) { diff --git a/src/test/run-make-fulldeps/libs-search-path/Makefile b/src/test/run-make-fulldeps/libs-search-path/Makefile new file mode 100644 index 00000000000..db0a069c3f5 --- /dev/null +++ b/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 diff --git a/src/test/run-make-fulldeps/libs-search-path/empty.rs b/src/test/run-make-fulldeps/libs-search-path/empty.rs new file mode 100644 index 00000000000..3f07b46791d --- /dev/null +++ b/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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() {}