summaryrefslogtreecommitdiffstats
path: root/bin/merge-app-bundles
diff options
context:
space:
mode:
Diffstat (limited to 'bin/merge-app-bundles')
-rwxr-xr-xbin/merge-app-bundles145
1 files changed, 145 insertions, 0 deletions
diff --git a/bin/merge-app-bundles b/bin/merge-app-bundles
new file mode 100755
index 0000000000..b92c90b5a0
--- /dev/null
+++ b/bin/merge-app-bundles
@@ -0,0 +1,145 @@
+#!/usr/bin/env bash
+
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Exit on errors
+set -e
+
+# Use of unset variable is an error
+set -u
+
+# If any part of a pipeline of commands fails, the whole pipeline fails
+set -o pipefail
+
+if [ `uname` != Darwin ]; then
+ echo This is for macOS only >&2
+ exit 1
+fi
+
+if [ $# != 3 ]; then
+ echo Usage: $0 app-bundle-1 app-bundle-2 output-app-bundle
+ exit 1
+fi
+
+if [ -d "$3" ]; then
+ echo The directory $3 exists already
+ exit 1
+fi
+
+if [ -f "$3" ]; then
+ echo $3 exists and is a file
+ exit 1
+fi
+
+if [ ! -d "$1" ]; then
+ echo No such directory: $1
+ exit 1
+fi
+
+if [ ! -d "$2" ]; then
+ echo No such directory: $2
+ exit 1
+fi
+
+ONE=$(cd "$1" && /bin/pwd)
+TWO=$(cd "$2" && /bin/pwd)
+mkdir "$3"
+OUT=$(cd "$3" && /bin/pwd)
+
+# Create all directories
+(
+ cd "$ONE"
+ find . -type d -print
+) |
+(
+ cd "$OUT"
+ while read dirname; do
+ mkdir -p "$dirname"
+ done
+)
+
+# Check which files in 1 exist in 2, and if they are executable, merge them into a fat copy. For
+# other files, just use one copy, assuming they are equivalent in most cases.
+(
+ cd "$ONE"
+ find . -type l -or -type f
+) |
+(
+ cd "$TWO"
+ while read fname; do
+ if test -L "$fname"; then
+ ln -s $(readlink "$fname") "$OUT/$fname"
+ elif test -f "$fname"; then
+ case "$fname" in
+ *.so | \
+ *.jnilib | \
+ *.jnilib.* | \
+ *.dylib | \
+ *.dylib.* | \
+ */Frameworks/LibreOfficePython.framework/Versions/*/LibreOfficePython | \
+ */Frameworks/LibreOfficePython.framework/Versions/*/Resources/Python.app/Contents/MacOS/LibreOfficePython | \
+ */Library/Spotlight/OOoSpotlightImporter.mdimporter/Contents/MacOS/OOoSpotlightImporter)
+ lipo -create -output "$OUT/$fname" "$fname" "$ONE/$fname"
+ ;;
+ # Ignore differences in these files. Let's hope it's just the timestamps.
+ *.ot[tp] | \
+ *.bau | \
+ *.pyc | \
+ */_sysconfigdata_m_darwin_darwin.py | \
+ */Contents/Resources/firebird/security3.fdb | \
+ */Contents/Resources/autocorr/acor_*.dat | \
+ */Contents/Resources/resource/*/LC_MESSAGES/*.mo | \
+ */Contents/Resources/config/images_*.zip)
+ cp "$fname" "$OUT/$fname"
+ ;;
+ *)
+ case $(file --brief "$fname") in
+ Mach-O\ 64-bit\ executable\ *)
+ lipo -create -output "$OUT/$fname" "$fname" "$ONE/$fname"
+ ;;
+ *)
+ cmp -s "$fname" "$ONE/$fname" ||
+ echo "$fname differs and is not an executable!?" >&2
+ cp "$fname" "$OUT/$fname"
+ esac
+ esac
+ else
+ # We ignore some files that can't be built for macOS on arm64 for now
+ case "$fname" in
+ ./Contents/Frameworks/LibreOfficePython.framework/Versions/3.7/lib/python*/lib-dynload/_ctypes.cpython-*m.so)
+ ;;
+ *)
+ echo "$fname does not exist in $TWO" >&2
+ ;;
+ esac
+ cp "$ONE/$fname" "$OUT/$fname"
+ fi
+ done
+)
+
+# Look for files in 2 that don't exist in 1
+(
+ cd "$TWO"
+ find . -type f -print
+) |
+(
+ cd "$ONE"
+ while read fname; do
+ if test -f "$fname"; then
+ :
+ else
+ echo "$fname does not exist in $ONE" >&2
+ cp "$TWO/$fname" "$OUT/$fname"
+ fi
+ done
+)
+
+# Local Variables:
+# tab-width: 4
+# indent-tabs-mode: nil
+# fill-column: 100
+# End: