about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-07-08 23:07:51 +0000
committerbors <bors@rust-lang.org>2024-07-08 23:07:51 +0000
commitd4a620058bbfc02548c0f7b3221c3d8b4c7d59af (patch)
tree87322bdf4bd5f5a894d8c26d212912f50e3c38fd
parent35b658fb1071d752d092751d9f17a9fa7b154ec4 (diff)
parent9f994b633a4ca0ed4f75066ee27ca052e56453dc (diff)
downloadrust-d4a620058bbfc02548c0f7b3221c3d8b4c7d59af.tar.gz
rust-d4a620058bbfc02548c0f7b3221c3d8b4c7d59af.zip
Auto merge of #127328 - Oneirical:yield-to-petestrians, r=jieyouxu
Migrate `pass-linker-flags-flavor`, `pass-linker-flags-from-dep` and `pass-linker-flags` `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 test on i686-msvc. Expected to fail.

try-job: aarch64-apple
-rw-r--r--src/tools/tidy/src/allowed_run_make_makefiles.txt3
-rw-r--r--tests/run-make/pass-linker-flags-flavor/Makefile11
-rw-r--r--tests/run-make/pass-linker-flags-flavor/rmake.rs84
-rw-r--r--tests/run-make/pass-linker-flags-from-dep/Makefile12
-rw-r--r--tests/run-make/pass-linker-flags-from-dep/rmake.rs43
-rw-r--r--tests/run-make/pass-linker-flags/Makefile5
-rw-r--r--tests/run-make/pass-linker-flags/rmake.rs28
7 files changed, 155 insertions, 31 deletions
diff --git a/src/tools/tidy/src/allowed_run_make_makefiles.txt b/src/tools/tidy/src/allowed_run_make_makefiles.txt
index e658621ab88..d3924054401 100644
--- a/src/tools/tidy/src/allowed_run_make_makefiles.txt
+++ b/src/tools/tidy/src/allowed_run_make_makefiles.txt
@@ -98,9 +98,6 @@ run-make/no-builtins-attribute/Makefile
 run-make/no-duplicate-libs/Makefile
 run-make/obey-crate-type-flag/Makefile
 run-make/panic-abort-eh_frame/Makefile
-run-make/pass-linker-flags-flavor/Makefile
-run-make/pass-linker-flags-from-dep/Makefile
-run-make/pass-linker-flags/Makefile
 run-make/pass-non-c-like-enum-to-c/Makefile
 run-make/pdb-buildinfo-cl-cmd/Makefile
 run-make/pgo-gen-lto/Makefile
diff --git a/tests/run-make/pass-linker-flags-flavor/Makefile b/tests/run-make/pass-linker-flags-flavor/Makefile
deleted file mode 100644
index 1bb05d0f974..00000000000
--- a/tests/run-make/pass-linker-flags-flavor/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# only-linux
-
-include ../tools.mk
-
-all:
-	$(RUSTC) empty.rs -Z unstable-options -C linker-flavor=gnu-cc -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*-Wl,a1.*l2.*-Wl,a2.*d1.*-Wl,a3'
-	$(RUSTC) empty.rs -Z unstable-options -C linker-flavor=gnu-cc -l static=l1 -l link-arg:+verbatim=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*-Wl,a2.*d1.*-Wl,a3'
-	$(RUSTC) empty.rs -Z unstable-options -C linker-flavor=ld -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*"a2".*d1.*"a3"'
-	$(RUSTC) attribute.rs -Z unstable-options -C linker-flavor=gnu-cc --print link-args | $(CGREP) -e 'l1.*-Wl,a1.*l2.*-Wl,a2.*d1.*-Wl,a3'
-	$(RUSTC) --cfg 'feature="verbatim"' attribute.rs -Z unstable-options -C linker-flavor=gnu-cc --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*-Wl,a2.*d1.*-Wl,a3'
-	$(RUSTC) attribute.rs -C linker-flavor=ld --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*"a2".*d1.*"a3"'
diff --git a/tests/run-make/pass-linker-flags-flavor/rmake.rs b/tests/run-make/pass-linker-flags-flavor/rmake.rs
new file mode 100644
index 00000000000..e36d68cc884
--- /dev/null
+++ b/tests/run-make/pass-linker-flags-flavor/rmake.rs
@@ -0,0 +1,84 @@
+// Setting the linker flavor as a C compiler should cause the output of the -l flags to be
+// prefixed by -Wl, except when a flag is requested to be verbatim. A bare linker (ld) should
+// never cause prefixes to appear in the output. This test checks this ruleset twice, once with
+// explicit flags and then with those flags passed inside the rust source code.
+// See https://github.com/rust-lang/rust/pull/118202
+
+//@ only-linux
+// Reason: the `gnu-cc` linker is only available on linux
+
+use run_make_support::{regex, rustc};
+
+fn main() {
+    let out_gnu = rustc()
+        .input("empty.rs")
+        .linker_flavor("gnu-cc")
+        .arg("-Zunstable-options")
+        .arg("-lstatic=l1")
+        .arg("-llink-arg=a1")
+        .arg("-lstatic=l2")
+        .arg("-llink-arg=a2")
+        .arg("-ldylib=d1")
+        .arg("-llink-arg=a3")
+        .print("link-args")
+        .run_unchecked()
+        .stdout_utf8();
+    let out_gnu_verbatim = rustc()
+        .input("empty.rs")
+        .linker_flavor("gnu-cc")
+        .arg("-Zunstable-options")
+        .arg("-lstatic=l1")
+        .arg("-llink-arg:+verbatim=a1")
+        .arg("-lstatic=l2")
+        .arg("-llink-arg=a2")
+        .arg("-ldylib=d1")
+        .arg("-llink-arg=a3")
+        .print("link-args")
+        .run_unchecked()
+        .stdout_utf8();
+    let out_ld = rustc()
+        .input("empty.rs")
+        .linker_flavor("ld")
+        .arg("-Zunstable-options")
+        .arg("-lstatic=l1")
+        .arg("-llink-arg=a1")
+        .arg("-lstatic=l2")
+        .arg("-llink-arg=a2")
+        .arg("-ldylib=d1")
+        .arg("-llink-arg=a3")
+        .print("link-args")
+        .run_unchecked()
+        .stdout_utf8();
+    let out_att_gnu = rustc()
+        .arg("-Zunstable-options")
+        .linker_flavor("gnu-cc")
+        .input("attribute.rs")
+        .print("link-args")
+        .run_unchecked()
+        .stdout_utf8();
+    let out_att_gnu_verbatim = rustc()
+        .cfg(r#"feature="verbatim""#)
+        .arg("-Zunstable-options")
+        .linker_flavor("gnu-cc")
+        .input("attribute.rs")
+        .print("link-args")
+        .run_unchecked()
+        .stdout_utf8();
+    let out_att_ld = rustc()
+        .linker_flavor("ld")
+        .input("attribute.rs")
+        .print("link-args")
+        .run_unchecked()
+        .stdout_utf8();
+
+    let no_verbatim = regex::Regex::new("l1.*-Wl,a1.*l2.*-Wl,a2.*d1.*-Wl,a3").unwrap();
+    let one_verbatim = regex::Regex::new(r#"l1.*"a1".*l2.*-Wl,a2.*d1.*-Wl,a3"#).unwrap();
+    let ld = regex::Regex::new(r#"l1.*"a1".*l2.*"a2".*d1.*"a3""#).unwrap();
+
+    assert!(no_verbatim.is_match(&out_gnu));
+    assert!(no_verbatim.is_match(&out_att_gnu));
+    assert!(one_verbatim.is_match(&out_gnu_verbatim));
+    assert!(one_verbatim.is_match(&out_att_gnu_verbatim));
+    assert!(ld.is_match(&out_ld));
+    assert!(ld.is_match(&out_att_ld));
+}
diff --git a/tests/run-make/pass-linker-flags-from-dep/Makefile b/tests/run-make/pass-linker-flags-from-dep/Makefile
deleted file mode 100644
index 48b3b26ce81..00000000000
--- a/tests/run-make/pass-linker-flags-from-dep/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-include ../tools.mk
-
-all:
-	# Build deps
-	$(RUSTC) native_dep_1.rs --crate-type=staticlib
-	$(RUSTC) native_dep_2.rs --crate-type=staticlib
-	$(RUSTC) rust_dep_flag.rs -l static:-bundle=native_dep_1 -l link-arg=some_flag -l static:-bundle=native_dep_2 --crate-type=lib -Z unstable-options
-	$(RUSTC) rust_dep_attr.rs --crate-type=lib
-
-	# Check sequence of linker args
-	$(RUSTC) main.rs --extern lib=$(TMPDIR)/librust_dep_flag.rlib --crate-type=bin --print link-args | $(CGREP) -e 'native_dep_1.*some_flag.*native_dep_2'
-	$(RUSTC) main.rs --extern lib=$(TMPDIR)/librust_dep_attr.rlib --crate-type=bin --print link-args | $(CGREP) -e 'native_dep_1.*some_flag.*native_dep_2'
diff --git a/tests/run-make/pass-linker-flags-from-dep/rmake.rs b/tests/run-make/pass-linker-flags-from-dep/rmake.rs
new file mode 100644
index 00000000000..4b8e0486e14
--- /dev/null
+++ b/tests/run-make/pass-linker-flags-from-dep/rmake.rs
@@ -0,0 +1,43 @@
+// A similar test to pass-linker-flags, testing that the `-l link-arg` flag
+// respects the order relative to other `-l` flags, but this time, the flags
+// are passed on the compilation of a dependency. This test checks that the
+// downstream compiled binary contains the linker arguments of the dependency,
+// and in the correct order.
+// See https://github.com/rust-lang/rust/issues/99427
+
+use run_make_support::{regex, rust_lib_name, rustc};
+
+fn main() {
+    // Build dependencies
+    rustc().input("native_dep_1.rs").crate_type("staticlib").run();
+    rustc().input("native_dep_2.rs").crate_type("staticlib").run();
+    rustc()
+        .input("rust_dep_flag.rs")
+        .arg("-lstatic:-bundle=native_dep_1")
+        .arg("-llink-arg=some_flag")
+        .arg("-lstatic:-bundle=native_dep_2")
+        .crate_type("lib")
+        .arg("-Zunstable-options")
+        .run();
+    rustc().input("rust_dep_attr.rs").crate_type("lib").run();
+
+    // Check sequence of linker arguments
+    let out_flag = rustc()
+        .input("main.rs")
+        .extern_("lib", rust_lib_name("rust_dep_flag"))
+        .crate_type("bin")
+        .print("link-args")
+        .run_unchecked()
+        .stdout_utf8();
+    let out_attr = rustc()
+        .input("main.rs")
+        .extern_("lib", rust_lib_name("rust_dep_attr"))
+        .crate_type("bin")
+        .print("link-args")
+        .run_unchecked()
+        .stdout_utf8();
+
+    let re = regex::Regex::new("native_dep_1.*some_flag.*native_dep_2").unwrap();
+    assert!(re.is_match(&out_flag));
+    assert!(re.is_match(&out_attr));
+}
diff --git a/tests/run-make/pass-linker-flags/Makefile b/tests/run-make/pass-linker-flags/Makefile
deleted file mode 100644
index 226943e93bd..00000000000
--- a/tests/run-make/pass-linker-flags/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-include ../tools.mk
-
-all:
-	$(RUSTC) empty.rs -Z unstable-options -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*a1.*l2.*a2.*d1.*a3'
-	$(RUSTC) attribute.rs --print link-args | $(CGREP) -e 'l1.*a1.*l2.*a2.*d1.*a3'
diff --git a/tests/run-make/pass-linker-flags/rmake.rs b/tests/run-make/pass-linker-flags/rmake.rs
new file mode 100644
index 00000000000..de69567a6e6
--- /dev/null
+++ b/tests/run-make/pass-linker-flags/rmake.rs
@@ -0,0 +1,28 @@
+// This test checks the proper function of `-l link-arg=NAME`, which, unlike
+// -C link-arg, is supposed to guarantee that the order relative to other -l
+// options will be respected. In this test, compilation fails (because none of the
+// link arguments like `a1` exist), but it is still checked if the output contains the
+// link arguments in the exact order they were passed in. `attribute.rs` is a variant
+// of the test where the flags are defined in the rust file itself.
+// See https://github.com/rust-lang/rust/issues/99427
+
+use run_make_support::{regex, rustc};
+
+fn main() {
+    let out = rustc()
+        .input("empty.rs")
+        .arg("-Zunstable-options")
+        .arg("-lstatic=l1")
+        .arg("-llink-arg=a1")
+        .arg("-lstatic=l2")
+        .arg("-llink-arg=a2")
+        .arg("-ldylib=d1")
+        .arg("-llink-arg=a3")
+        .print("link-args")
+        .run_unchecked()
+        .stdout_utf8();
+    let out2 = rustc().input("attribute.rs").print("link-args").run_unchecked().stdout_utf8();
+    let re = regex::Regex::new("l1.*a1.*l2.*a2.*d1.*a3").unwrap();
+    assert!(re.is_match(&out));
+    assert!(re.is_match(&out2));
+}