Rollup merge of #128107 - Oneirical:tomato-hartester, r=jieyouxu
Migrate `raw-dylib-alt-calling-convention`, `raw-dylib-c` and `redundant-libs` `run-make` tests to rmake Part of #121876 and the associated [Google Summer of Code project](https://blog.rust-lang.org/2024/05/01/gsoc-2024-selected-projects.html). Please try: // try-job: x86_64-msvc // try-job: x86_64-mingw // try-job: i686-msvc try-job: x86_64-gnu-llvm-17 try-job: aarch64-apple
This commit is contained in:
commit
0aaffdb25f
@ -22,9 +22,6 @@ run-make/no-alloc-shim/Makefile
|
|||||||
run-make/pdb-buildinfo-cl-cmd/Makefile
|
run-make/pdb-buildinfo-cl-cmd/Makefile
|
||||||
run-make/pgo-gen-lto/Makefile
|
run-make/pgo-gen-lto/Makefile
|
||||||
run-make/pgo-indirect-call-promotion/Makefile
|
run-make/pgo-indirect-call-promotion/Makefile
|
||||||
run-make/raw-dylib-alt-calling-convention/Makefile
|
|
||||||
run-make/raw-dylib-c/Makefile
|
|
||||||
run-make/redundant-libs/Makefile
|
|
||||||
run-make/remap-path-prefix-dwarf/Makefile
|
run-make/remap-path-prefix-dwarf/Makefile
|
||||||
run-make/reproducible-build/Makefile
|
run-make/reproducible-build/Makefile
|
||||||
run-make/rlib-format-packed-bundled-libs/Makefile
|
run-make/rlib-format-packed-bundled-libs/Makefile
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
# Test the behavior of #[link(.., kind = "raw-dylib")] with alternative calling conventions.
|
|
||||||
|
|
||||||
# only-x86
|
|
||||||
# only-windows
|
|
||||||
|
|
||||||
include ../tools.mk
|
|
||||||
|
|
||||||
all:
|
|
||||||
$(RUSTC) --crate-type lib --crate-name raw_dylib_alt_calling_convention_test lib.rs
|
|
||||||
$(RUSTC) --crate-type bin driver.rs -L "$(TMPDIR)"
|
|
||||||
$(call COMPILE_OBJ,"$(TMPDIR)"/extern.obj,extern.c)
|
|
||||||
ifdef IS_MSVC
|
|
||||||
$(CC) "$(TMPDIR)"/extern.obj -link -dll -out:"$(TMPDIR)"/extern.dll -noimplib
|
|
||||||
else
|
|
||||||
$(CC) "$(TMPDIR)"/extern.obj -shared -o "$(TMPDIR)"/extern.dll
|
|
||||||
endif
|
|
||||||
|
|
||||||
"$(TMPDIR)"/driver > "$(TMPDIR)"/output.txt
|
|
||||||
$(RUSTC_TEST_OP) "$(TMPDIR)"/output.txt output.txt
|
|
||||||
|
|
||||||
ifdef IS_MSVC
|
|
||||||
"$(TMPDIR)"/driver true > "$(TMPDIR)"/output.msvc.txt
|
|
||||||
$(RUSTC_TEST_OP) "$(TMPDIR)"/output.msvc.txt output.msvc.txt
|
|
||||||
endif
|
|
32
tests/run-make/raw-dylib-alt-calling-convention/rmake.rs
Normal file
32
tests/run-make/raw-dylib-alt-calling-convention/rmake.rs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// `raw-dylib` is a Windows-specific attribute which emits idata sections for the items in the
|
||||||
|
// attached extern block,
|
||||||
|
// so they may be linked against without linking against an import library.
|
||||||
|
// To learn more, read https://github.com/rust-lang/rfcs/blob/master/text/2627-raw-dylib-kind.md
|
||||||
|
// This test uses this feature alongside alternative calling conventions, checking that both
|
||||||
|
// features are compatible and result in the expected output upon execution of the binary.
|
||||||
|
// See https://github.com/rust-lang/rust/pull/84171
|
||||||
|
|
||||||
|
//@ only-x86
|
||||||
|
//@ only-windows
|
||||||
|
|
||||||
|
use run_make_support::{build_native_dynamic_lib, diff, is_msvc, run, run_with_args, rustc};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
rustc()
|
||||||
|
.crate_type("lib")
|
||||||
|
.crate_name("raw_dylib_alt_calling_convention_test")
|
||||||
|
.input("lib.rs")
|
||||||
|
.run();
|
||||||
|
rustc().crate_type("bin").input("driver.rs").run();
|
||||||
|
build_native_dynamic_lib("extern");
|
||||||
|
let out = run("driver").stdout_utf8();
|
||||||
|
diff().expected_file("output.txt").actual_text("actual", out).normalize(r#"\r"#, "").run();
|
||||||
|
if is_msvc() {
|
||||||
|
let out_msvc = run_with_args("driver", &["true"]).stdout_utf8();
|
||||||
|
diff()
|
||||||
|
.expected_file("output.msvc.txt")
|
||||||
|
.actual_text("actual", out_msvc)
|
||||||
|
.normalize(r#"\r"#, "")
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
}
|
@ -1,28 +0,0 @@
|
|||||||
# Test the behavior of #[link(.., kind = "raw-dylib")] on windows-msvc
|
|
||||||
|
|
||||||
# only-windows
|
|
||||||
|
|
||||||
include ../tools.mk
|
|
||||||
|
|
||||||
all:
|
|
||||||
$(RUSTC) --crate-type lib --crate-name raw_dylib_test lib.rs
|
|
||||||
$(RUSTC) --crate-type bin driver.rs -L "$(TMPDIR)"
|
|
||||||
$(RUSTC) --crate-type bin --crate-name raw_dylib_test_bin lib.rs
|
|
||||||
$(call COMPILE_OBJ,"$(TMPDIR)"/extern_1.obj,extern_1.c)
|
|
||||||
$(call COMPILE_OBJ,"$(TMPDIR)"/extern_2.obj,extern_2.c)
|
|
||||||
ifdef IS_MSVC
|
|
||||||
$(CC) "$(TMPDIR)"/extern_1.obj -link -dll -out:"$(TMPDIR)"/extern_1.dll -noimplib
|
|
||||||
$(CC) "$(TMPDIR)"/extern_2.obj -link -dll -out:"$(TMPDIR)"/extern_2.dll -noimplib
|
|
||||||
else
|
|
||||||
$(CC) "$(TMPDIR)"/extern_1.obj -shared -o "$(TMPDIR)"/extern_1.dll
|
|
||||||
$(CC) "$(TMPDIR)"/extern_2.obj -shared -o "$(TMPDIR)"/extern_2.dll
|
|
||||||
endif
|
|
||||||
"$(TMPDIR)"/driver | tr -d '\r' > "$(TMPDIR)"/output.txt
|
|
||||||
"$(TMPDIR)"/raw_dylib_test_bin > "$(TMPDIR)"/output_bin.txt
|
|
||||||
|
|
||||||
ifdef RUSTC_BLESS_TEST
|
|
||||||
cp "$(TMPDIR)"/output.txt output.txt
|
|
||||||
else
|
|
||||||
$(DIFF) output.txt "$(TMPDIR)"/output.txt
|
|
||||||
$(DIFF) output.txt "$(TMPDIR)"/output_bin.txt
|
|
||||||
endif
|
|
29
tests/run-make/raw-dylib-c/rmake.rs
Normal file
29
tests/run-make/raw-dylib-c/rmake.rs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// `raw-dylib` is a Windows-specific attribute which emits idata sections for the items in the
|
||||||
|
// attached extern block,
|
||||||
|
// so they may be linked against without linking against an import library.
|
||||||
|
// To learn more, read https://github.com/rust-lang/rfcs/blob/master/text/2627-raw-dylib-kind.md
|
||||||
|
// This test is the simplest of the raw-dylib tests, simply smoke-testing that the feature
|
||||||
|
// can be used to build an executable binary with an expected output with native C files
|
||||||
|
// compiling into dynamic libraries.
|
||||||
|
// See https://github.com/rust-lang/rust/pull/86419
|
||||||
|
|
||||||
|
//@ only-windows
|
||||||
|
|
||||||
|
use run_make_support::{build_native_dynamic_lib, diff, run, rustc};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
rustc().crate_type("lib").crate_name("raw_dylib_test").input("lib.rs").run();
|
||||||
|
rustc().crate_type("bin").input("driver.rs").run();
|
||||||
|
rustc().crate_type("bin").crate_name("raw_dylib_test_bin").input("lib.rs").run();
|
||||||
|
build_native_dynamic_lib("extern_1");
|
||||||
|
build_native_dynamic_lib("extern_2");
|
||||||
|
let out_driver = run("driver").stdout_utf8();
|
||||||
|
let out_raw = run("raw_dylib_test_bin").stdout_utf8();
|
||||||
|
|
||||||
|
diff()
|
||||||
|
.expected_file("output.txt")
|
||||||
|
.actual_text("actual", out_driver)
|
||||||
|
.normalize(r#"\r"#, "")
|
||||||
|
.run();
|
||||||
|
diff().expected_file("output.txt").actual_text("actual", out_raw).normalize(r#"\r"#, "").run();
|
||||||
|
}
|
@ -1,24 +0,0 @@
|
|||||||
# ignore-cross-compile
|
|
||||||
include ../tools.mk
|
|
||||||
|
|
||||||
# ignore-windows-msvc
|
|
||||||
|
|
||||||
# rustc will remove one of the two redundant references to foo below. Depending
|
|
||||||
# on which one gets removed, we'll get a linker error on SOME platforms (like
|
|
||||||
# Linux). On these platforms, when a library is referenced, the linker will
|
|
||||||
# only pull in the symbols needed _at that point in time_. If a later library
|
|
||||||
# depends on additional symbols from the library, they will not have been pulled
|
|
||||||
# in, and you'll get undefined symbols errors.
|
|
||||||
#
|
|
||||||
# So in this example, we need to ensure that rustc keeps the _later_ reference
|
|
||||||
# to foo, and not the former one.
|
|
||||||
RUSTC_FLAGS = \
|
|
||||||
-l static=bar \
|
|
||||||
-l foo \
|
|
||||||
-l static=baz \
|
|
||||||
-l foo \
|
|
||||||
--print link-args
|
|
||||||
|
|
||||||
all: $(call DYLIB,foo) $(call STATICLIB,bar) $(call STATICLIB,baz)
|
|
||||||
$(RUSTC) $(RUSTC_FLAGS) main.rs
|
|
||||||
$(call RUN,main)
|
|
34
tests/run-make/redundant-libs/rmake.rs
Normal file
34
tests/run-make/redundant-libs/rmake.rs
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
// rustc will remove one of the two redundant references to foo below. Depending
|
||||||
|
// on which one gets removed, we'll get a linker error on SOME platforms (like
|
||||||
|
// Linux). On these platforms, when a library is referenced, the linker will
|
||||||
|
// only pull in the symbols needed _at that point in time_. If a later library
|
||||||
|
// depends on additional symbols from the library, they will not have been pulled
|
||||||
|
// in, and you'll get undefined symbols errors.
|
||||||
|
//
|
||||||
|
// So in this example, we need to ensure that rustc keeps the _later_ reference
|
||||||
|
// to foo, and not the former one.
|
||||||
|
|
||||||
|
//@ ignore-cross-compile
|
||||||
|
// Reason: the compiled binary is executed
|
||||||
|
//@ ignore-windows-msvc
|
||||||
|
// Reason: this test links libraries via link.exe, which only accepts the import library
|
||||||
|
// for the dynamic library, i.e. `foo.dll.lib`. However, build_native_dynamic_lib only
|
||||||
|
// produces `foo.dll` - the dynamic library itself. To make this test work on MSVC, one
|
||||||
|
// would need to derive the import library from the dynamic library.
|
||||||
|
// See https://stackoverflow.com/questions/9360280/
|
||||||
|
|
||||||
|
use run_make_support::{
|
||||||
|
build_native_dynamic_lib, build_native_static_lib, cwd, is_msvc, rfs, run, rustc,
|
||||||
|
};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
build_native_dynamic_lib("foo");
|
||||||
|
build_native_static_lib("bar");
|
||||||
|
build_native_static_lib("baz");
|
||||||
|
rustc()
|
||||||
|
.args(&["-lstatic=bar", "-lfoo", "-lstatic=baz", "-lfoo"])
|
||||||
|
.input("main.rs")
|
||||||
|
.print("link-args")
|
||||||
|
.run();
|
||||||
|
run("main");
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user