aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorNadia Holmquist Pedersen <nadia@nhp.sh>2021-04-23 13:11:49 +0200
committerNadia Holmquist Pedersen <nadia@nhp.sh>2021-04-23 13:13:44 +0200
commit9e20aa8a3e75cd34b5a36a7b41b5481c4a0711a8 (patch)
tree2dcdf27ffec4a9a462780c8735e4ad86546a0125 /tools
parent796ef958629ec71ad7d0c30c15c4e38b0bba7149 (diff)
Make Mac builds a lot smaller by avoiding macdeployqt
Diffstat (limited to 'tools')
-rwxr-xr-xtools/mac-libs.sh67
1 files changed, 51 insertions, 16 deletions
diff --git a/tools/mac-libs.sh b/tools/mac-libs.sh
index 1766cf7..c748890 100755
--- a/tools/mac-libs.sh
+++ b/tools/mac-libs.sh
@@ -27,36 +27,71 @@ abspath() {
cmake_qtdir=$(grep -E "Qt._DIR" CMakeCache.txt | cut -d= -f2)
qtdir="$(abspath "$cmake_qtdir"/../../..)"
-if [[ ! -d "$app/Contents/Frameworks" ]]; then
- "${qtdir}/bin/macdeployqt" "$app"
-fi
-
-# We'll have to copy the Qt plugins we need on our own if macdeployqt forgets
-# Qt6 bug?
plugindir="$app/Contents/PlugIns"
if [[ ! -d "$plugindir" ]]; then
- mkdir -p "$plugindir/styles" "$plugindir/platforms"
- cp "$qtdir/share/qt/plugins/styles/libqmacstyle.dylib" "$plugindir/styles/"
- cp "$qtdir/share/qt/plugins/platforms/libqcocoa.dylib" "$plugindir/platforms/"
+ qt_plugins="$qtdir/plugins"
+ if [[ ! -d "$qt_plugins" ]]; then
+ qt_plugins="$qtdir/share/qt/plugins"
+ fi
- install_name_tool -add_rpath "@executable_path/../Frameworks" "$app/Contents/MacOS/melonDS"
+ mkdir -p "$plugindir/styles" "$plugindir/platforms"
+ cp "$qt_plugins/styles/libqmacstyle.dylib" "$plugindir/styles/"
+ cp "$qt_plugins/platforms/libqcocoa.dylib" "$plugindir/platforms/"
fi
-# Fix library load paths that macdeployqt forgot about
+mkdir "$app/Contents/Frameworks"
+install_name_tool -add_rpath "@executable_path/../Frameworks" "$app/Contents/MacOS/melonDS"
+
fixup_libs() {
- local libs=($(otool -L "$1" | sed -E 's/\t(.*) \(.*$/\1/' | grep -vE '/System|/usr/lib|\.framework|^\@|:$'))
+ local libs=($(otool -L "$1" | grep -vE "/System|/usr/lib|:$" | sed -E 's/\t(.*) \(.*$/\1/'))
for lib in "${libs[@]}"; do
- local base="$(basename "$lib")"
- install_name_tool -change "$lib" "@executable_path/../Frameworks/$base" "$1"
+ # Dereference symlinks to get the actual .dylib as binaries' load
+ # commands can contain paths to symlinked libraries.
+ local abslib="$(abspath "$lib")"
+
+ if [[ "$abslib" == *".framework/"* ]]; then
+ local fwpath="$(echo "$abslib" | sed -E 's@(.*\.framework)/.*@\1/@')"
+ local fwlib="$(echo "$abslib" | sed -E 's/.*\.framework//')"
+ local fwname="$(basename "$fwpath")"
+ local install_path="$app/Contents/Frameworks/$fwname"
+
+ install_name_tool -change "$lib" "@rpath/$fwname/$fwlib" "$1"
+
+ if [[ ! -d "$install_path" ]]; then
+ cp -a "$fwpath" "$install_path"
+ chown -R $UID "$install_path"
+ chmod -R u+w "$install_path"
+ strip -SNTx "$install_path/$fwlib"
+ fixup_libs "$install_path/$fwlib"
+ fi
+ else
+ local base="$(basename "$abslib")"
+ local install_path="$app/Contents/Frameworks/$base"
+
+ install_name_tool -change "$lib" "@rpath/$base" "$1"
+
+ if [[ ! -f "$install_path" ]]; then
+ install -m644 "$abslib" "$install_path"
+ strip -SNTx "$install_path"
+ fixup_libs "$install_path"
+ fi
+ fi
done
}
-find "$app/Contents/Frameworks" -maxdepth 1 -name '*.dylib' | while read lib; do
+
+fixup_libs "$app/Contents/MacOS/melonDS"
+find "$app/Contents/PlugIns" -name '*.dylib' | while read lib; do
fixup_libs "$lib"
done
-fixup_libs "$app/Contents/MacOS/melonDS"
+bad_rpaths=($(otool -l "$app/Contents/MacOS/melonDS" | grep -E "^ *path (/usr/local|/opt)" | sed -E 's/^ *path (.*) \(.*/\1/'))
+
+for path in "${bad_rpaths[@]}"; do
+ install_name_tool -delete_rpath "$path" "$app/Contents/MacOS/melonDS"
+done
+
codesign -s - --deep "$app"
if [[ $build_dmg == 1 ]]; then