about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/librustc/metadata/creader.rs3
-rw-r--r--src/librustc/metadata/loader.rs4
-rw-r--r--src/test/run-make/symlinked-extern/Makefile16
-rw-r--r--src/test/run-make/symlinked-extern/bar.rs16
-rw-r--r--src/test/run-make/symlinked-extern/baz.rs16
-rw-r--r--src/test/run-make/symlinked-extern/foo.rs15
6 files changed, 67 insertions, 3 deletions
diff --git a/src/librustc/metadata/creader.rs b/src/librustc/metadata/creader.rs
index 0445b4d4e9e..321eee3d5fc 100644
--- a/src/librustc/metadata/creader.rs
+++ b/src/librustc/metadata/creader.rs
@@ -33,6 +33,7 @@ use syntax::diagnostic::SpanHandler;
 use syntax::parse::token::InternedString;
 use syntax::parse::token;
 use syntax::visit;
+use util::fs;
 
 struct Env<'a> {
     sess: &'a Session,
@@ -301,7 +302,7 @@ fn existing_match(e: &Env, name: &str,
         match e.sess.opts.externs.find_equiv(&name) {
             Some(locs) => {
                 let found = locs.iter().any(|l| {
-                    let l = Some(Path::new(l.as_slice()));
+                    let l = fs::realpath(&Path::new(l.as_slice())).ok();
                     l == source.dylib || l == source.rlib
                 });
                 if found {
diff --git a/src/librustc/metadata/loader.rs b/src/librustc/metadata/loader.rs
index d2e1fca0da7..58e9e2e61d4 100644
--- a/src/librustc/metadata/loader.rs
+++ b/src/librustc/metadata/loader.rs
@@ -666,9 +666,9 @@ impl<'a> Context<'a> {
         let mut dylibs = HashSet::new();
         for loc in locs {
             if loc.filename_str().unwrap().ends_with(".rlib") {
-                rlibs.insert(loc.clone());
+                rlibs.insert(fs::realpath(&loc).unwrap());
             } else {
-                dylibs.insert(loc.clone());
+                dylibs.insert(fs::realpath(&loc).unwrap());
             }
         }
 
diff --git a/src/test/run-make/symlinked-extern/Makefile b/src/test/run-make/symlinked-extern/Makefile
new file mode 100644
index 00000000000..88dbad51e48
--- /dev/null
+++ b/src/test/run-make/symlinked-extern/Makefile
@@ -0,0 +1,16 @@
+-include ../tools.mk
+
+# ignore windows: `ln` is actually `cp` on msys.
+ifndef IS_WINDOWS
+
+all:
+	$(RUSTC) foo.rs
+	mkdir -p $(TMPDIR)/other
+	ln -nsf $(TMPDIR)/libfoo.rlib $(TMPDIR)/other
+	$(RUSTC) bar.rs -L $(TMPDIR)
+	$(RUSTC) baz.rs --extern foo=$(TMPDIR)/other/libfoo.rlib  -L $(TMPDIR)
+
+else
+all:
+
+endif
diff --git a/src/test/run-make/symlinked-extern/bar.rs b/src/test/run-make/symlinked-extern/bar.rs
new file mode 100644
index 00000000000..79103f24017
--- /dev/null
+++ b/src/test/run-make/symlinked-extern/bar.rs
@@ -0,0 +1,16 @@
+// Copyright 2012-2014 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.
+
+#![crate_type = "rlib"]
+
+extern crate foo;
+
+pub fn bar(_s: foo::S) {
+}
diff --git a/src/test/run-make/symlinked-extern/baz.rs b/src/test/run-make/symlinked-extern/baz.rs
new file mode 100644
index 00000000000..0f6ba254368
--- /dev/null
+++ b/src/test/run-make/symlinked-extern/baz.rs
@@ -0,0 +1,16 @@
+// Copyright 2012-2014 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.
+
+extern crate bar;
+extern crate foo;
+
+fn main() {
+    bar::bar(foo::foo());
+}
diff --git a/src/test/run-make/symlinked-extern/foo.rs b/src/test/run-make/symlinked-extern/foo.rs
new file mode 100644
index 00000000000..0b8bb64d375
--- /dev/null
+++ b/src/test/run-make/symlinked-extern/foo.rs
@@ -0,0 +1,15 @@
+// Copyright 2012-2014 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.
+
+#![crate_type = "rlib"]
+
+pub struct S;
+
+pub fn foo() -> S { S }