about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-03-26 20:22:54 +0000
committerbors <bors@rust-lang.org>2024-03-26 20:22:54 +0000
commit47ecded3525392b77843534bed69b4302f9af8d2 (patch)
treedcf6d824db30f500d63e42a3fdfb6dc45747bd07
parent3b370cf46a7573e9387b04e3e76762e2e34c464b (diff)
parent440fce19a1d412d560a13cfe1d98351e16703468 (diff)
downloadrust-47ecded3525392b77843534bed69b4302f9af8d2.tar.gz
rust-47ecded3525392b77843534bed69b4302f9af8d2.zip
Auto merge of #118644 - madsmtm:macos-weak-linking-test, r=compiler-errors
Add test for Apple's `-weak_framework` linker argument

The [`-weak_framework`](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html) linker argument can sometimes be useful to reduce startup times, and to link newer frameworks while still having older deployment targets.

So I made a test to ensure that it continues to work.

Discussed in https://github.com/rust-lang/rust/issues/99427.
-rw-r--r--src/tools/compiletest/src/header.rs1
-rw-r--r--tests/run-make/link-framework/Makefile23
-rw-r--r--tests/run-make/link-framework/dep-link-framework.rs4
-rw-r--r--tests/run-make/link-framework/dep-link-weak-framework.rs6
-rw-r--r--tests/run-make/link-framework/empty.rs1
-rw-r--r--tests/run-make/link-framework/link-both.rs4
-rw-r--r--tests/run-make/link-framework/link-framework.rs3
-rw-r--r--tests/run-make/link-framework/link-weak-framework.rs3
-rw-r--r--tests/run-pass-valgrind/osx-frameworks.rs21
-rw-r--r--tests/ui/linkage-attr/framework.omit.stderr8
-rw-r--r--tests/ui/linkage-attr/framework.rs30
11 files changed, 83 insertions, 21 deletions
diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs
index 6ff47dbffbc..00fe1208c2f 100644
--- a/src/tools/compiletest/src/header.rs
+++ b/src/tools/compiletest/src/header.rs
@@ -708,6 +708,7 @@ const KNOWN_DIRECTIVE_NAMES: &[&str] = &[
     "check-run-results",
     "check-stdout",
     "check-test-line-numbers-match",
+    "compare-output-lines-by-subset",
     "compile-flags",
     "dont-check-compiler-stderr",
     "dont-check-compiler-stdout",
diff --git a/tests/run-make/link-framework/Makefile b/tests/run-make/link-framework/Makefile
new file mode 100644
index 00000000000..f33347ac7f8
--- /dev/null
+++ b/tests/run-make/link-framework/Makefile
@@ -0,0 +1,23 @@
+# only-macos
+#
+# Check that linking to a framework actually makes it to the linker.
+
+include ../tools.mk
+
+all:
+	$(RUSTC) dep-link-framework.rs
+	$(RUSTC) dep-link-weak-framework.rs
+
+	$(RUSTC) empty.rs
+	otool -L $(TMPDIR)/no-link | $(CGREP) -v CoreFoundation
+
+	$(RUSTC) link-framework.rs
+	otool -L $(TMPDIR)/link-framework | $(CGREP) CoreFoundation | $(CGREP) -v weak
+
+	$(RUSTC) link-weak-framework.rs
+	otool -L $(TMPDIR)/link-weak-framework | $(CGREP) CoreFoundation | $(CGREP) weak
+
+# When linking the framework both normally, and weakly, the weak linking takes preference
+
+	$(RUSTC) link-both.rs
+	otool -L $(TMPDIR)/link-both | $(CGREP) CoreFoundation | $(CGREP) weak
diff --git a/tests/run-make/link-framework/dep-link-framework.rs b/tests/run-make/link-framework/dep-link-framework.rs
new file mode 100644
index 00000000000..9bdeb2052d2
--- /dev/null
+++ b/tests/run-make/link-framework/dep-link-framework.rs
@@ -0,0 +1,4 @@
+#![crate_type = "rlib"]
+
+#[link(name = "CoreFoundation", kind = "framework")]
+extern "C" {}
diff --git a/tests/run-make/link-framework/dep-link-weak-framework.rs b/tests/run-make/link-framework/dep-link-weak-framework.rs
new file mode 100644
index 00000000000..d3e1cf9c98f
--- /dev/null
+++ b/tests/run-make/link-framework/dep-link-weak-framework.rs
@@ -0,0 +1,6 @@
+#![crate_type = "rlib"]
+#![feature(link_arg_attribute)]
+
+#[link(name = "-weak_framework", kind = "link-arg", modifiers = "+verbatim")]
+#[link(name = "CoreFoundation", kind = "link-arg", modifiers = "+verbatim")]
+extern "C" {}
diff --git a/tests/run-make/link-framework/empty.rs b/tests/run-make/link-framework/empty.rs
new file mode 100644
index 00000000000..f328e4d9d04
--- /dev/null
+++ b/tests/run-make/link-framework/empty.rs
@@ -0,0 +1 @@
+fn main() {}
diff --git a/tests/run-make/link-framework/link-both.rs b/tests/run-make/link-framework/link-both.rs
new file mode 100644
index 00000000000..31fc79e1929
--- /dev/null
+++ b/tests/run-make/link-framework/link-both.rs
@@ -0,0 +1,4 @@
+extern crate dep_link_framework;
+extern crate dep_link_weak_framework;
+
+fn main() {}
diff --git a/tests/run-make/link-framework/link-framework.rs b/tests/run-make/link-framework/link-framework.rs
new file mode 100644
index 00000000000..e33e830248e
--- /dev/null
+++ b/tests/run-make/link-framework/link-framework.rs
@@ -0,0 +1,3 @@
+extern crate dep_link_framework;
+
+fn main() {}
diff --git a/tests/run-make/link-framework/link-weak-framework.rs b/tests/run-make/link-framework/link-weak-framework.rs
new file mode 100644
index 00000000000..f0557f8013a
--- /dev/null
+++ b/tests/run-make/link-framework/link-weak-framework.rs
@@ -0,0 +1,3 @@
+extern crate dep_link_weak_framework;
+
+fn main() {}
diff --git a/tests/run-pass-valgrind/osx-frameworks.rs b/tests/run-pass-valgrind/osx-frameworks.rs
deleted file mode 100644
index 71465c0d199..00000000000
--- a/tests/run-pass-valgrind/osx-frameworks.rs
+++ /dev/null
@@ -1,21 +0,0 @@
-//@ pretty-expanded FIXME #23616
-
-#![feature(rustc_private)]
-
-extern crate libc;
-
-#[cfg(target_os = "macos")]
-#[link(name = "CoreFoundation", kind = "framework")]
-extern "C" {
-    fn CFRunLoopGetTypeID() -> libc::c_ulong;
-}
-
-#[cfg(target_os = "macos")]
-pub fn main() {
-    unsafe {
-        CFRunLoopGetTypeID();
-    }
-}
-
-#[cfg(not(target_os = "macos"))]
-pub fn main() {}
diff --git a/tests/ui/linkage-attr/framework.omit.stderr b/tests/ui/linkage-attr/framework.omit.stderr
new file mode 100644
index 00000000000..5cb4d391437
--- /dev/null
+++ b/tests/ui/linkage-attr/framework.omit.stderr
@@ -0,0 +1,8 @@
+error: linking with `cc` failed: exit status: 1
+   |
+           ld: Undefined symbols:
+             _CFRunLoopGetTypeID, referenced from:
+           clang: error: linker command failed with exit code 1 (use -v to see invocation)
+
+
+error: aborting due to 1 previous error
diff --git a/tests/ui/linkage-attr/framework.rs b/tests/ui/linkage-attr/framework.rs
new file mode 100644
index 00000000000..662ef4c429d
--- /dev/null
+++ b/tests/ui/linkage-attr/framework.rs
@@ -0,0 +1,30 @@
+// Check that linking frameworks on Apple platforms works.
+//@ only-macos
+//@ revisions: omit link weak both
+//@ [omit]build-fail
+//@ [link]run-pass
+//@ [weak]run-pass
+//@ [both]run-pass
+
+// The linker's exact error output changes between Xcode versions.
+//@ compare-output-lines-by-subset
+//@ normalize-stderr-test: "Undefined symbols for architecture .*" -> "ld: Undefined symbols:"
+//@ normalize-stderr-test: "._CFRunLoopGetTypeID.," -> "_CFRunLoopGetTypeID,"
+
+#![cfg_attr(any(weak, both), feature(link_arg_attribute))]
+
+#[cfg_attr(any(link, both), link(name = "CoreFoundation", kind = "framework"))]
+#[cfg_attr(
+    any(weak, both),
+    link(name = "-weak_framework", kind = "link-arg", modifiers = "+verbatim"),
+    link(name = "CoreFoundation", kind = "link-arg", modifiers = "+verbatim")
+)]
+extern "C" {
+    fn CFRunLoopGetTypeID() -> core::ffi::c_ulong;
+}
+
+pub fn main() {
+    unsafe {
+        CFRunLoopGetTypeID();
+    }
+}