| // If a dylib is being produced, the compiler will first check to see if it can |
| // be created entirely statically before falling back to dynamic dependencies. This |
| // behavior can be overridden with `-C prefer-dynamic`. |
| // In this test, bar depends on foo and is compiled fully statically despite the available |
| // `foo` dynamic library. This allows the main binary to be executed in the final step. |
| // See https://github.com/rust-lang/rust/commit/3036b001276a6e43409b08b7f2334ce72aeeb036 |
| |
| //@ ignore-cross-compile |
| // Reason: the compiled binary is executed |
| |
| use run_make_support::{ |
| cc, cwd, dynamic_lib_name, extra_c_flags, has_extension, is_msvc, rfs, run, rustc, |
| shallow_find_files, |
| }; |
| |
| fn main() { |
| rustc().input("foo.rs").run(); |
| rustc().input("bar.rs").run(); |
| // On msvc, dynamic libraries are compiled by rustc to: |
| // bar.dll // dylib |
| // bar.dll.lib // import library for the dylib |
| // bar.dll.exp // export library for the dylib |
| // msvc's underlying link.exe requires the import library for the dynamic library as input. |
| // That is why the library is bar.dll.lib, not bar.dll. |
| let library = if is_msvc() { "bar.dll.lib" } else { &dynamic_lib_name("bar") }; |
| cc().input("main.c").out_exe("main").arg(library).args(extra_c_flags()).run(); |
| for rlib in shallow_find_files(cwd(), |path| has_extension(path, "rlib")) { |
| rfs::remove_file(rlib); |
| } |
| rfs::remove_file(dynamic_lib_name("foo")); |
| if is_msvc() { |
| rfs::remove_file("foo.dll.lib"); |
| } |
| run("main"); |
| } |