diff options
author | Nadia Holmquist Pedersen <nadia@nhp.sh> | 2021-04-23 13:11:49 +0200 |
---|---|---|
committer | Nadia Holmquist Pedersen <nadia@nhp.sh> | 2021-04-23 13:13:44 +0200 |
commit | 9e20aa8a3e75cd34b5a36a7b41b5481c4a0711a8 (patch) | |
tree | 2dcdf27ffec4a9a462780c8735e4ad86546a0125 /tools | |
parent | 796ef958629ec71ad7d0c30c15c4e38b0bba7149 (diff) |
Make Mac builds a lot smaller by avoiding macdeployqt
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/mac-libs.sh | 67 |
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 |