Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate cdylib-dylib-linkage run-make test to rmake #128245

Merged
merged 1 commit into from
Aug 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/tools/run-make-support/src/artifact_names.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,17 @@ pub fn dynamic_lib_name(name: &str) -> String {
format!("{}{name}.{}", std::env::consts::DLL_PREFIX, std::env::consts::DLL_EXTENSION)
}

/// Construct the name of the import library for the dynamic library, exclusive to MSVC and
/// accepted by link.exe.
#[track_caller]
#[must_use]
pub fn msvc_import_dynamic_lib_name(name: &str) -> String {
Oneirical marked this conversation as resolved.
Show resolved Hide resolved
assert!(is_msvc(), "this function is exclusive to MSVC");
assert!(!name.contains(char::is_whitespace), "import library name cannot contain whitespace");

format!("{name}.dll.lib")
}

/// Construct the dynamic library extension based on the target.
#[must_use]
pub fn dynamic_lib_extension() -> &'static str {
Expand Down
7 changes: 4 additions & 3 deletions src/tools/run-make-support/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,13 +72,14 @@ pub use targets::{is_darwin, is_msvc, is_windows, llvm_components_contain, targe

/// Helpers for building names of output artifacts that are potentially target-specific.
pub use artifact_names::{
bin_name, dynamic_lib_extension, dynamic_lib_name, rust_lib_name, static_lib_name,
bin_name, dynamic_lib_extension, dynamic_lib_name, msvc_import_dynamic_lib_name, rust_lib_name,
static_lib_name,
};

/// Path-related helpers.
pub use path_helpers::{
cwd, filename_not_in_denylist, has_extension, has_prefix, has_suffix, not_contains, path,
shallow_find_files, source_root,
cwd, filename_contains, filename_not_in_denylist, has_extension, has_prefix, has_suffix,
not_contains, path, shallow_find_files, source_root,
};

/// Helpers for scoped test execution where certain properties are attempted to be maintained.
Expand Down
8 changes: 7 additions & 1 deletion src/tools/run-make-support/src/path_helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
use std::path::{Path, PathBuf};

use crate::env::env_var;
use crate::rfs;

/// Return the current working directory.
///
Expand Down Expand Up @@ -40,7 +41,7 @@ pub fn shallow_find_files<P: AsRef<Path>, F: Fn(&PathBuf) -> bool>(
filter: F,
) -> Vec<PathBuf> {
let mut matching_files = Vec::new();
for entry in std::fs::read_dir(path).unwrap() {
for entry in rfs::read_dir(path) {
let entry = entry.expect("failed to read directory entry.");
let path = entry.path();

Expand Down Expand Up @@ -78,3 +79,8 @@ pub fn has_extension<P: AsRef<Path>>(path: P, extension: &str) -> bool {
pub fn has_suffix<P: AsRef<Path>>(path: P, suffix: &str) -> bool {
path.as_ref().file_name().is_some_and(|name| name.to_str().unwrap().ends_with(suffix))
}

/// Returns true if the filename at `path` contains `needle`.
pub fn filename_contains<P: AsRef<Path>>(path: P, needle: &str) -> bool {
path.as_ref().file_name().is_some_and(|name| name.to_str().unwrap().contains(needle))
}
1 change: 0 additions & 1 deletion src/tools/tidy/src/allowed_run_make_makefiles.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
run-make/branch-protection-check-IBT/Makefile
run-make/cat-and-grep-sanity-check/Makefile
run-make/cdylib-dylib-linkage/Makefile
run-make/cross-lang-lto-upstream-rlibs/Makefile
run-make/dep-info-doesnt-run-much/Makefile
run-make/dep-info-spaces/Makefile
Expand Down
31 changes: 0 additions & 31 deletions tests/run-make/cdylib-dylib-linkage/Makefile

This file was deleted.

41 changes: 41 additions & 0 deletions tests/run-make/cdylib-dylib-linkage/rmake.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// 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");
}
Loading