about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/run-make/libs-through-symlinks/Makefile22
-rw-r--r--tests/run-make/libs-through-symlinks/rmake.rs48
2 files changed, 48 insertions, 22 deletions
diff --git a/tests/run-make/libs-through-symlinks/Makefile b/tests/run-make/libs-through-symlinks/Makefile
deleted file mode 100644
index c6ff566a0e8..00000000000
--- a/tests/run-make/libs-through-symlinks/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-# ignore-cross-compile
-include ../tools.mk
-
-# ignore-windows
-
-# The option -n for the AIX ln command has a different purpose than it does
-# on Linux. On Linux, the -n option is used to treat the destination path as
-# normal file if it is a symbolic link to a directory, which is the default
-# behavior of the AIX ln command.
-ifeq ($(UNAME),AIX)
-LN_FLAGS := -sf
-else
-LN_FLAGS := -nsf
-endif
-
-NAME := $(shell $(RUSTC) --print file-names foo.rs)
-
-all:
-	mkdir -p $(TMPDIR)/outdir
-	$(RUSTC) foo.rs -o $(TMPDIR)/outdir/$(NAME)
-	ln $(LN_FLAGS) outdir/$(NAME) $(TMPDIR)
-	RUSTC_LOG=rustc_metadata::loader $(RUSTC) bar.rs
diff --git a/tests/run-make/libs-through-symlinks/rmake.rs b/tests/run-make/libs-through-symlinks/rmake.rs
new file mode 100644
index 00000000000..4bb3d05abb7
--- /dev/null
+++ b/tests/run-make/libs-through-symlinks/rmake.rs
@@ -0,0 +1,48 @@
+//! Regression test for [rustc doesn't handle relative symlinks to libraries
+//! #13890](https://github.com/rust-lang/rust/issues/13890).
+//!
+//! This smoke test checks that for a given library search path `P`:
+//!
+//! - `rustc` is able to locate a library available via a symlink, where:
+//!     - the symlink is under the directory subtree of `P`,
+//!     - but the actual library is not (it's in a different directory subtree).
+//!
+//! For example:
+//!
+//! ```text
+//! actual_dir/
+//!     libfoo.rlib
+//! symlink_dir/  # $CWD set; rustc -L . bar.rs that depends on foo
+//!     libfoo.rlib --> ../actual_dir/libfoo.rlib
+//! ```
+//!
+//! Previously, if `rustc` was invoked with CWD set to `symlink_dir/`, it would fail to traverse the
+//! symlink to locate `actual_dir/libfoo.rlib`. This was originally fixed in
+//! <https://github.com/rust-lang/rust/pull/13903>.
+
+//@ ignore-cross-compile
+
+use run_make_support::{bare_rustc, cwd, path, rfs, rust_lib_name};
+
+fn main() {
+    let actual_lib_dir = path("actual_lib_dir");
+    let symlink_lib_dir = path("symlink_lib_dir");
+    rfs::create_dir_all(&actual_lib_dir);
+    rfs::create_dir_all(&symlink_lib_dir);
+
+    // NOTE: `bare_rustc` is used because it does not introduce an implicit `-L .` library search
+    // flag.
+    bare_rustc().input("foo.rs").output(actual_lib_dir.join(rust_lib_name("foo"))).run();
+
+    rfs::symlink_file(
+        actual_lib_dir.join(rust_lib_name("foo")),
+        symlink_lib_dir.join(rust_lib_name("foo")),
+    );
+
+    // Make rustc's $CWD be in the directory containing the symlink-to-lib.
+    bare_rustc()
+        .current_dir(&symlink_lib_dir)
+        .library_search_path(".")
+        .input(cwd().join("bar.rs"))
+        .run();
+}