rust/tests/run-make/cdylib-dylib-linkage/rmake.rs
2024-08-05 10:39:17 -04:00

42 lines
1.7 KiB
Rust

// Previously, rustc mandated that cdylibs could only link against rlibs as dependencies,
// making linkage between cdylibs and dylibs impossible. After this was changed in #68448,
// this test attempts to link both `foo` (a cdylib) and `bar` (a dylib) and checks that
// both compilation and execution are successful.
// See https://github.com/rust-lang/rust/pull/68448
//@ ignore-cross-compile
// Reason: the compiled binary is executed
use run_make_support::{
bin_name, cc, dynamic_lib_extension, dynamic_lib_name, filename_contains, has_extension,
has_prefix, has_suffix, is_msvc, msvc_import_dynamic_lib_name, path, run, rustc,
shallow_find_files, target,
};
fn main() {
rustc().arg("-Cprefer-dynamic").input("bar.rs").run();
rustc().input("foo.rs").run();
let sysroot = rustc().print("sysroot").run().stdout_utf8();
let sysroot = sysroot.trim();
let target_sysroot = path(sysroot).join("lib/rustlib").join(target()).join("lib");
if is_msvc() {
let mut libs = shallow_find_files(&target_sysroot, |path| {
has_prefix(path, "libstd-") && has_suffix(path, ".dll.lib")
});
libs.push(path(msvc_import_dynamic_lib_name("foo")));
libs.push(path(msvc_import_dynamic_lib_name("bar")));
cc().input("foo.c").args(&libs).out_exe("foo").run();
} else {
let stdlibs = shallow_find_files(&target_sysroot, |path| {
has_extension(path, dynamic_lib_extension()) && filename_contains(path, "std")
});
cc().input("foo.c")
.args(&[dynamic_lib_name("foo"), dynamic_lib_name("bar")])
.arg(stdlibs.get(0).unwrap())
.library_search_path(&target_sysroot)
.output(bin_name("foo"))
.run();
}
run("foo");
}