It's been reported that the latest version of Tux Paint does not run on macOS 10.7 (Lion). This change fixes the issue. BACKGROUND A user has reported Tux Paint 0.9.23 does not run on macOS 10.7. She also identified that the issue is due to a system library required by Tux Paint, /System/Library/Frameworks/CoreGraphics.framework does not exist on macOS 10.7 Some investigation revealed that CoreGraphics.framework is a library required by libSDL, and it exists under an alternate path in macOS 10.7, underneath /System/Library/Frameworks/ApplicationServices.framework/Frameworks/. CoreGraphics.framework also exists underneath this path in newer version of macOS as a symlink to the real directory as well, so the issue can be fixed by simply relinking SDL to use the old (compatible) path instead of the new (default) path to CoreGraphics.framework. This change adds the code such that, during the `make install` step to create TuxPaint.app, any library referencing CoreGraphics.framework is re-linked to the compatible path rather than the path that only exists on the newer version of macOS. For more information, see: https://stackoverflow.com/questions/20206985/xcode-linking-against-applicationservices-framework-with-sdk-10-9-causes-10-7
78 lines
3.1 KiB
Bash
Executable file
78 lines
3.1 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
BUNDLE=TuxPaint.app
|
|
BINARY="$BUNDLE/Contents/MacOS/tuxpaint"
|
|
LIBS=`find $BUNDLE/Contents/Resources/lib -type f`
|
|
LIBDIR="$BUNDLE/Contents/lib"
|
|
CONF_FILES="/opt/local/etc/fonts/fonts.conf"
|
|
CONFDIR="$BUNDLE/Contents/Resources/etc"
|
|
|
|
|
|
# Sanity check
|
|
if [ ! -r "$BINARY" ]; then
|
|
echo "$BINARY: Where is this file?" 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -d "$BUNDLE" ]; then
|
|
echo "$BUNDLE: Where is this file?" 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
# Ensure the target folders exist
|
|
install -d -m 755 "$LIBDIR"
|
|
install -d -m 755 "$CONFDIR"
|
|
|
|
# Copy there any shared libraries referenced by the tuxpaint binary, and any
|
|
# shared libraries those shared libraries reference, and so on. We do this by
|
|
# first copying over any shared libraries referenced by the binary, then
|
|
# repeatedly copying over the shared libraries referenced by any libraries in
|
|
# the target folder until we don't see any more files appearing. There are
|
|
# better ways to do this than copying repeatedly but it works. And you know
|
|
# what they say about premature optimization...
|
|
dylib="$BINARY $LIBS"
|
|
count=0; last=-1
|
|
echo " * Copying Shared Libraries..."
|
|
while [ $count -ne $last ]; do
|
|
cp -p `otool -L $dylib | grep '^\t[/]opt[/]local[/]' | sed -e 's/^[[:space:]]*\([^[:space:]]*\)[[:space:]].*/\1/' | sort | uniq` $LIBDIR
|
|
dylib="$LIBDIR/*"
|
|
|
|
last=$count
|
|
count=`ls -f $dylib | wc -l`
|
|
done
|
|
echo " -> Copied" $count "files to $LIBDIR"
|
|
|
|
# We just copied over a bunch of shared libraries into a random folder in our
|
|
# app bundle, but the tuxpaint binary and the shared libraries won't know to
|
|
# look in that folder unless we tell them. So we tell them.
|
|
echo " * Fixing Shared Library References..."
|
|
for i in "$BINARY" $LIBS $LIBDIR/*; do
|
|
echo " -> $i..."
|
|
for j in `otool -L $dylib | grep '^\t[/]opt[/]local[/]' | sed -e 's/^[[:space:]]*\([^[:space:]]*\)[[:space:]].*/\1/'`; do
|
|
n=`echo "$j" | sed 's/^[/]opt[/]local[/]/@executable_path\/..\//'`
|
|
install_name_tool -change "$j" "$n" "$i"
|
|
done
|
|
|
|
# libSDL links to /System/Library/Frameworks/CoreGraphics.framework by
|
|
# default on newer versions of macOS, but this library is located under
|
|
# /System/Library/Frameworks/ApplicationServices.framework/Frameworks
|
|
# instead in macOS 10.7, and is a symlink to its real location in later
|
|
# versions of macOS. For compatibility reasons, we tell libSDL to link to
|
|
# the former location instead. See here for more information:
|
|
#
|
|
# https://stackoverflow.com/questions/20206985/xcode-linking-against-applicationservices-framework-with-sdk-10-9-causes-10-7
|
|
#
|
|
if [ `otool -L "$i" | grep -c '^\t\/System\/Library\/Frameworks\/CoreGraphics\.framework\/Versions\/A\/CoreGraphics'` -gt 0 ]; then
|
|
defaultlib="/System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics"
|
|
compatlib="/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics"
|
|
install_name_tool -change "$defaultlib" "$compatlib" "$i"
|
|
fi
|
|
done
|
|
|
|
# Some libraries require config files, so copy those...
|
|
echo " * Copying Shared Library Configuration Files..."
|
|
for i in "$CONF_FILES"; do
|
|
echo " -> $i..."
|
|
cp -p "$i" "$CONFDIR"
|
|
done
|
|
|