From ee6de0cb97d5241adee661ab6a9799347a99d251 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Tue, 5 Dec 2023 14:36:36 +0100 Subject: [PATCH 1/2] Add test for Apple's -weak_framework linker argument --- tests/run-pass-valgrind/osx-frameworks.rs | 21 ---------------- tests/ui/linkage-attr/framework.omit.stderr | 12 +++++++++ tests/ui/linkage-attr/framework.rs | 27 +++++++++++++++++++++ 3 files changed, 39 insertions(+), 21 deletions(-) delete mode 100644 tests/run-pass-valgrind/osx-frameworks.rs create mode 100644 tests/ui/linkage-attr/framework.omit.stderr create mode 100644 tests/ui/linkage-attr/framework.rs diff --git a/tests/run-pass-valgrind/osx-frameworks.rs b/tests/run-pass-valgrind/osx-frameworks.rs deleted file mode 100644 index 571621c1de776..0000000000000 --- 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 0000000000000..854c07d98e8fe --- /dev/null +++ b/tests/ui/linkage-attr/framework.omit.stderr @@ -0,0 +1,12 @@ +error: linking with `cc` failed: exit status: 1 + | + = note: [linker command] + = note: ld: warning: search path '$TEST_BUILD_DIR/linkage-attr/framework.omit/auxiliary' not found + ld: Undefined symbols: + _CFRunLoopGetTypeID, referenced from: + framework::main::HASH in framework.framework.HASH-cgu.0.rcgu.o + 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 0000000000000..d6cb410a217b0 --- /dev/null +++ b/tests/ui/linkage-attr/framework.rs @@ -0,0 +1,27 @@ +// 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 +// normalize-stderr-test: "note: env .*" -> "note: [linker command]" +// normalize-stderr-test: "framework::main::\w* in framework\.framework\.\w*-cgu\.0\.rcgu\.o" -> "framework::main::HASH in framework.framework.HASH-cgu.0.rcgu.o" + +#![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(); + } +} From d63d1a17a05c18fc9a47e12cf96fcb0cc7a20893 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Tue, 12 Dec 2023 05:56:07 +0100 Subject: [PATCH 2/2] Ensure using `otool` that framework linking actually happened --- tests/run-make/link-framework/Makefile | 23 +++++++++++++++++++ .../link-framework/dep-link-framework.rs | 4 ++++ .../link-framework/dep-link-weak-framework.rs | 6 +++++ tests/run-make/link-framework/empty.rs | 1 + tests/run-make/link-framework/link-both.rs | 4 ++++ .../run-make/link-framework/link-framework.rs | 3 +++ .../link-framework/link-weak-framework.rs | 3 +++ 7 files changed, 44 insertions(+) create mode 100644 tests/run-make/link-framework/Makefile create mode 100644 tests/run-make/link-framework/dep-link-framework.rs create mode 100644 tests/run-make/link-framework/dep-link-weak-framework.rs create mode 100644 tests/run-make/link-framework/empty.rs create mode 100644 tests/run-make/link-framework/link-both.rs create mode 100644 tests/run-make/link-framework/link-framework.rs create mode 100644 tests/run-make/link-framework/link-weak-framework.rs diff --git a/tests/run-make/link-framework/Makefile b/tests/run-make/link-framework/Makefile new file mode 100644 index 0000000000000..f33347ac7f8f5 --- /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 0000000000000..9bdeb2052d255 --- /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 0000000000000..d3e1cf9c98f5f --- /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 0000000000000..f328e4d9d04c3 --- /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 0000000000000..31fc79e1929ac --- /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 0000000000000..e33e830248ebe --- /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 0000000000000..f0557f8013a43 --- /dev/null +++ b/tests/run-make/link-framework/link-weak-framework.rs @@ -0,0 +1,3 @@ +extern crate dep_link_weak_framework; + +fn main() {}