Rollup merge of #125808 - GuillaumeGomez:migrate-run-make-c-link-to-rust-dylib, r=jieyouxu

Migrate `run-make/c-link-to-rust-dylib` to `rmake.rs`

Part of https://github.com/rust-lang/rust/issues/121876.

First commit comes from https://github.com/rust-lang/rust/pull/125773.

r? `@jieyouxu`
This commit is contained in:
Jubilee 2024-06-02 12:58:08 -07:00 committed by GitHub
commit 800b2f8b64
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 67 additions and 34 deletions

View File

@ -123,12 +123,23 @@ pub fn dynamic_lib_name(name: &str) -> String {
// ``` // ```
assert!(!name.contains(char::is_whitespace), "dynamic library name cannot contain whitespace"); assert!(!name.contains(char::is_whitespace), "dynamic library name cannot contain whitespace");
let extension = dynamic_lib_extension();
if is_darwin() { if is_darwin() {
format!("lib{name}.dylib") format!("lib{name}.{extension}")
} else if is_windows() { } else if is_windows() {
format!("{name}.dll") format!("{name}.{extension}")
} else { } else {
format!("lib{name}.so") format!("lib{name}.{extension}")
}
}
pub fn dynamic_lib_extension() -> &'static str {
if is_darwin() {
"dylib"
} else if is_windows() {
"dll"
} else {
"so"
} }
} }
@ -249,16 +260,13 @@ fn read_file(path: &Path) -> Vec<u8> {
} }
let dir2 = dir2.as_ref(); let dir2 = dir2.as_ref();
for entry in fs::read_dir(dir1).unwrap() { read_dir(dir1, |entry_path| {
let entry = entry.unwrap(); let entry_name = entry_path.file_name().unwrap();
let entry_name = entry.file_name(); if entry_path.is_dir() {
let path = entry.path(); recursive_diff(&entry_path, &dir2.join(entry_name));
if path.is_dir() {
recursive_diff(&path, &dir2.join(entry_name));
} else { } else {
let path2 = dir2.join(entry_name); let path2 = dir2.join(entry_name);
let file1 = read_file(&path); let file1 = read_file(&entry_path);
let file2 = read_file(&path2); let file2 = read_file(&path2);
// We don't use `assert_eq!` because they are `Vec<u8>`, so not great for display. // We don't use `assert_eq!` because they are `Vec<u8>`, so not great for display.
@ -267,10 +275,16 @@ fn read_file(path: &Path) -> Vec<u8> {
assert!( assert!(
file1 == file2, file1 == file2,
"`{}` and `{}` have different content", "`{}` and `{}` have different content",
path.display(), entry_path.display(),
path2.display(), path2.display(),
); );
} }
});
}
pub fn read_dir<F: Fn(&Path)>(dir: impl AsRef<Path>, callback: F) {
for entry in fs::read_dir(dir).unwrap() {
callback(&entry.unwrap().path());
} }
} }

View File

@ -6,7 +6,6 @@ run-make/bare-outfile/Makefile
run-make/branch-protection-check-IBT/Makefile run-make/branch-protection-check-IBT/Makefile
run-make/c-dynamic-dylib/Makefile run-make/c-dynamic-dylib/Makefile
run-make/c-dynamic-rlib/Makefile run-make/c-dynamic-rlib/Makefile
run-make/c-link-to-rust-dylib/Makefile
run-make/c-static-dylib/Makefile run-make/c-static-dylib/Makefile
run-make/c-static-rlib/Makefile run-make/c-static-rlib/Makefile
run-make/c-unwind-abi-catch-lib-panic/Makefile run-make/c-unwind-abi-catch-lib-panic/Makefile

View File

@ -1,21 +0,0 @@
# This test checks that C linking with Rust does not encounter any errors, with dynamic libraries.
# See https://github.com/rust-lang/rust/issues/10434
# ignore-cross-compile
include ../tools.mk
all: $(TMPDIR)/$(call BIN,bar)
$(call RUN,bar)
$(call REMOVE_DYLIBS,foo)
$(call FAIL,bar)
ifdef IS_MSVC
$(TMPDIR)/$(call BIN,bar): $(call DYLIB,foo)
$(CC) bar.c $(TMPDIR)/foo.dll.lib $(call OUT_EXE,bar)
else
$(TMPDIR)/$(call BIN,bar): $(call DYLIB,foo)
$(CC) bar.c -lfoo -o $(call RUN_BINFILE,bar) -L $(TMPDIR)
endif
$(call DYLIB,foo): foo.rs
$(RUSTC) foo.rs

View File

@ -0,0 +1,41 @@
// This test checks that C linking with Rust does not encounter any errors, with dynamic libraries.
// See <https://github.com/rust-lang/rust/issues/10434>.
//@ ignore-cross-compile
use std::fs::remove_file;
use run_make_support::{
cc, dynamic_lib_extension, is_msvc, read_dir, run, run_fail, rustc, tmp_dir,
};
fn main() {
rustc().input("foo.rs").run();
if is_msvc() {
let lib = tmp_dir().join("foo.dll.lib");
cc().input("bar.c").arg(lib).out_exe("bar").run();
} else {
cc().input("bar.c")
.arg("-lfoo")
.output(tmp_dir().join("bar"))
.library_search_path(tmp_dir())
.run();
}
run("bar");
let expected_extension = dynamic_lib_extension();
read_dir(tmp_dir(), |path| {
if path.is_file()
&& path.extension().is_some_and(|ext| ext == expected_extension)
&& path.file_name().and_then(|name| name.to_str()).is_some_and(|name| {
name.ends_with(".so") || name.ends_with(".dll") || name.ends_with(".dylib")
})
{
remove_file(path).unwrap();
}
});
run_fail("bar");
}