office-gobmx/bin/merge-app-bundles
Tor Lillqvist 6c905031ed Add copyright blurb
Change-Id: Icd77587590103eef44f7ec41fcba280b7ce2a473
2020-12-02 15:09:34 +02:00

143 lines
3.9 KiB
Bash
Executable file

#!/bin/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 | \
*.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: