| // Since #19941, rustc can accept specifications on its library search paths. |
| // This test runs Rust programs with varied library dependencies, expecting them |
| // to succeed or fail depending on the situation. |
| // The second part of the tests also checks that libraries with an incorrect hash |
| // fail to be used by the compiler. |
| // See https://github.com/rust-lang/rust/pull/19941 |
| |
| //@ ignore-wasm32 |
| //@ ignore-wasm64 |
| // Reason: a C compiler is required for build_native_static_lib |
| |
| use run_make_support::{build_native_static_lib, rfs, rustc, static_lib_name}; |
| |
| fn main() { |
| build_native_static_lib("native"); |
| let lib_native = static_lib_name("native"); |
| rfs::create_dir_all("crate"); |
| rfs::create_dir_all("native"); |
| rfs::rename(&lib_native, format!("native/{}", &lib_native)); |
| rustc().input("a.rs").run(); |
| rfs::rename("liba.rlib", "crate/liba.rlib"); |
| rustc().input("b.rs").specific_library_search_path("native", "crate").run_fail(); |
| rustc().input("b.rs").specific_library_search_path("dependency", "crate").run_fail(); |
| rustc().input("b.rs").specific_library_search_path("crate", "crate").run(); |
| rustc().input("b.rs").specific_library_search_path("all", "crate").run(); |
| |
| rustc().input("c.rs").specific_library_search_path("native", "crate").run_fail(); |
| rustc().input("c.rs").specific_library_search_path("crate", "crate").run_fail(); |
| rustc().input("c.rs").specific_library_search_path("dependency", "crate").run(); |
| rustc().input("c.rs").specific_library_search_path("all", "crate").run(); |
| |
| rustc().input("d.rs").specific_library_search_path("dependency", "native").run_fail(); |
| rustc().input("d.rs").specific_library_search_path("crate", "native").run_fail(); |
| rustc().input("d.rs").specific_library_search_path("native", "native").run(); |
| rustc().input("d.rs").specific_library_search_path("all", "native").run(); |
| |
| // Deduplication tests. |
| rfs::create_dir_all("e1"); |
| rfs::create_dir_all("e2"); |
| |
| rustc().input("e.rs").output("e1/libe.rlib").run(); |
| rustc().input("e.rs").output("e2/libe.rlib").run(); |
| // If the library hash is correct, compilation should succeed. |
| rustc().input("f.rs").library_search_path("e1").library_search_path("e2").run(); |
| rustc() |
| .input("f.rs") |
| .specific_library_search_path("crate", "e1") |
| .library_search_path("e2") |
| .run(); |
| rustc() |
| .input("f.rs") |
| .specific_library_search_path("crate", "e1") |
| .specific_library_search_path("crate", "e2") |
| .run(); |
| // If the library has a different hash, errors should occur. |
| rustc().input("e2.rs").output("e2/libe.rlib").run(); |
| rustc().input("f.rs").library_search_path("e1").library_search_path("e2").run_fail(); |
| rustc() |
| .input("f.rs") |
| .specific_library_search_path("crate", "e1") |
| .library_search_path("e2") |
| .run_fail(); |
| rustc() |
| .input("f.rs") |
| .specific_library_search_path("crate", "e1") |
| .specific_library_search_path("crate", "e2") |
| .run_fail(); |
| // Native and dependency paths do not cause errors. |
| rustc() |
| .input("f.rs") |
| .specific_library_search_path("native", "e1") |
| .library_search_path("e2") |
| .run(); |
| rustc() |
| .input("f.rs") |
| .specific_library_search_path("dependency", "e1") |
| .library_search_path("e2") |
| .run(); |
| rustc() |
| .input("f.rs") |
| .specific_library_search_path("dependency", "e1") |
| .specific_library_search_path("crate", "e2") |
| .run(); |
| } |