|  | 
|  | 1 | +//! Regression test for [rustc doesn't handle relative symlinks to libraries | 
|  | 2 | +//! #13890](https://github.com/rust-lang/rust/issues/13890). | 
|  | 3 | +//! | 
|  | 4 | +//! This smoke test checks that for a given library search path `P`: | 
|  | 5 | +//! | 
|  | 6 | +//! - `rustc` is able to locate a library available via a symlink, where: | 
|  | 7 | +//!     - the symlink is under the directory subtree of `P`, | 
|  | 8 | +//!     - but the actual library is not (it's in a different directory subtree). | 
|  | 9 | +//! | 
|  | 10 | +//! For example: | 
|  | 11 | +//! | 
|  | 12 | +//! ```text | 
|  | 13 | +//! actual_dir/ | 
|  | 14 | +//!     libfoo.rlib | 
|  | 15 | +//! symlink_dir/  # $CWD set; rustc -L . bar.rs that depends on foo | 
|  | 16 | +//!     libfoo.rlib --> ../actual_dir/libfoo.rlib | 
|  | 17 | +//! ``` | 
|  | 18 | +//! | 
|  | 19 | +//! Previously, if `rustc` was invoked with CWD set to `symlink_dir/`, it would fail to traverse the | 
|  | 20 | +//! symlink to locate `actual_dir/libfoo.rlib`. This was originally fixed in | 
|  | 21 | +//! <https://github.com/rust-lang/rust/pull/13903>. | 
|  | 22 | +
 | 
|  | 23 | +//@ ignore-cross-compile | 
|  | 24 | + | 
|  | 25 | +use run_make_support::{bare_rustc, cwd, path, rfs, rust_lib_name}; | 
|  | 26 | + | 
|  | 27 | +fn main() { | 
|  | 28 | +    let actual_lib_dir = path("actual_lib_dir"); | 
|  | 29 | +    let symlink_lib_dir = path("symlink_lib_dir"); | 
|  | 30 | +    rfs::create_dir_all(&actual_lib_dir); | 
|  | 31 | +    rfs::create_dir_all(&symlink_lib_dir); | 
|  | 32 | + | 
|  | 33 | +    // NOTE: `bare_rustc` is used because it does not introduce an implicit `-L .` library search | 
|  | 34 | +    // flag. | 
|  | 35 | +    bare_rustc().input("foo.rs").output(actual_lib_dir.join(rust_lib_name("foo"))).run(); | 
|  | 36 | + | 
|  | 37 | +    rfs::symlink_file( | 
|  | 38 | +        actual_lib_dir.join(rust_lib_name("foo")), | 
|  | 39 | +        symlink_lib_dir.join(rust_lib_name("foo")), | 
|  | 40 | +    ); | 
|  | 41 | + | 
|  | 42 | +    // Make rustc's $CWD be in the directory containing the symlink-to-lib. | 
|  | 43 | +    bare_rustc() | 
|  | 44 | +        .current_dir(&symlink_lib_dir) | 
|  | 45 | +        .library_search_path(".") | 
|  | 46 | +        .input(cwd().join("bar.rs")) | 
|  | 47 | +        .run(); | 
|  | 48 | +} | 
0 commit comments