From 482b81ae5d4dc0bca6d2869c94237b48a55a2cfa Mon Sep 17 00:00:00 2001
From: Akaps316 <48785708+Akaps316@users.noreply.github.com>
Date: Fri, 3 Apr 2026 21:17:05 +0530
Subject: fix(xcode.application): avoid duplicate bundle rpath insertion
Only add the macOS app bundle framework rpath if it is missing from the copied app binary.
This avoids install_name_tool failing when the target already links with @executable_path/../Frameworks, for example via add_rpathdirs().
Add a regression test covering a macOS app target that already carries the bundle rpath before xcode.application generates the app bundle.
---
.../objc/macapp_duplicate_rpath/src/Info.plist | 18 ++++++++++++++++++
tests/projects/objc/macapp_duplicate_rpath/src/main.m | 5 +++++
tests/projects/objc/macapp_duplicate_rpath/test.lua | 18 ++++++++++++++++++
tests/projects/objc/macapp_duplicate_rpath/xmake.lua | 9 +++++++++
4 files changed, 50 insertions(+)
create mode 100644 tests/projects/objc/macapp_duplicate_rpath/src/Info.plist
create mode 100644 tests/projects/objc/macapp_duplicate_rpath/src/main.m
create mode 100644 tests/projects/objc/macapp_duplicate_rpath/test.lua
create mode 100644 tests/projects/objc/macapp_duplicate_rpath/xmake.lua
(limited to 'tests/projects/objc')
diff --git a/tests/projects/objc/macapp_duplicate_rpath/src/Info.plist b/tests/projects/objc/macapp_duplicate_rpath/src/Info.plist
new file mode 100644
index 000000000..e20952d73
--- /dev/null
+++ b/tests/projects/objc/macapp_duplicate_rpath/src/Info.plist
@@ -0,0 +1,18 @@
+
+
+
+
+ CFBundleExecutable
+ demo
+ CFBundleIdentifier
+ io.xmake.demo.duprpath
+ CFBundleName
+ demo
+ CFBundlePackageType
+ APPL
+ CFBundleVersion
+ 1
+ CFBundleShortVersionString
+ 1.0
+
+
diff --git a/tests/projects/objc/macapp_duplicate_rpath/src/main.m b/tests/projects/objc/macapp_duplicate_rpath/src/main.m
new file mode 100644
index 000000000..f481d2909
--- /dev/null
+++ b/tests/projects/objc/macapp_duplicate_rpath/src/main.m
@@ -0,0 +1,5 @@
+#import
+
+int main(void) {
+ return 0;
+}
diff --git a/tests/projects/objc/macapp_duplicate_rpath/test.lua b/tests/projects/objc/macapp_duplicate_rpath/test.lua
new file mode 100644
index 000000000..f2821df14
--- /dev/null
+++ b/tests/projects/objc/macapp_duplicate_rpath/test.lua
@@ -0,0 +1,18 @@
+function main(t)
+ if not is_host("macosx") then
+ return t:skip("wrong host platform")
+ end
+
+ local homedir = path.absolute("home")
+ os.setenv("HOME", homedir)
+ os.mkdir(homedir)
+ os.mkdir(path.join(homedir, ".xmake"))
+
+ local xmake = path.absolute(path.join(os.projectdir(), "build", "xmake"))
+ local xmake_program_dir = path.absolute(path.join(os.projectdir(), "xmake"))
+ os.setenv("XMAKE_PROGRAM_FILE", xmake)
+ os.setenv("XMAKE_PROGRAM_DIR", xmake_program_dir)
+
+ os.execv(xmake, {"f", "-p", "macosx", "-a", os.arch(), "-c"})
+ os.execv(xmake, {"-vD"})
+end
diff --git a/tests/projects/objc/macapp_duplicate_rpath/xmake.lua b/tests/projects/objc/macapp_duplicate_rpath/xmake.lua
new file mode 100644
index 000000000..a9428203f
--- /dev/null
+++ b/tests/projects/objc/macapp_duplicate_rpath/xmake.lua
@@ -0,0 +1,9 @@
+add_rules("mode.release", "mode.debug")
+
+set_languages("c11", "objc")
+
+target("demo")
+ add_rules("xcode.application")
+ add_rpathdirs("@executable_path/../Frameworks")
+ add_files("src/main.m")
+ add_files("src/Info.plist")
--
cgit v1.3.1