diff options
| author | Akaps316 <[email protected]> | 2026-04-03 21:17:05 +0530 |
|---|---|---|
| committer | Akaps316 <[email protected]> | 2026-04-03 21:17:05 +0530 |
| commit | 482b81ae5d4dc0bca6d2869c94237b48a55a2cfa (patch) | |
| tree | 57d5ac4e114f091c09acf1c5893cdb305e19ca56 /xmake | |
| parent | 39fd35ea9d5d14079e4669b85423d488c9097cd4 (diff) | |
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.
Diffstat (limited to 'xmake')
| -rw-r--r-- | xmake/rules/xcode/application/build.lua | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/xmake/rules/xcode/application/build.lua b/xmake/rules/xcode/application/build.lua index 8ea734d28..57c3655d5 100644 --- a/xmake/rules/xcode/application/build.lua +++ b/xmake/rules/xcode/application/build.lua @@ -23,6 +23,7 @@ import("core.base.option") import("core.theme.theme") import("core.project.depend") import("private.tools.codesign") +import("utils.binary.rpath", {alias = "rpath_utils"}) import("utils.progress") function main (target, opt) @@ -49,7 +50,11 @@ function main (target, opt) -- @see https://github.com/xmake-io/xmake/issues/2679#issuecomment-1221839215 local targetfile = path.join(binarydir, path.filename(target:targetfile())) try { function () os.vrunv("install_name_tool", {"-delete_rpath", "@loader_path", targetfile}) end } - os.vrunv("install_name_tool", {"-add_rpath", "@executable_path/../Frameworks", targetfile}) + local rpath = "@executable_path/../Frameworks" + local rpathdirs = rpath_utils.list(targetfile, {plat = target:plat(), arch = target:arch()}) or {} + if not table.contains(rpathdirs, rpath) then + os.vrunv("install_name_tool", {"-add_rpath", rpath, targetfile}) + end -- copy dependent dynamic libraries and frameworks for _, dep in ipairs(target:orderdeps()) do @@ -109,4 +114,3 @@ function main (target, opt) end, {dependfile = target:dependfile(bundledir), files = {bundledir, target:targetfile()}, changed = target:is_rebuilt()}) end - |
