You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
5.4 KiB
Bash

#!/usr/bin/env bash
#
# Copyright (c) 1991-2024 by the GMT Team (https://www.generic-mapping-tools.org/team.html)
# See LICENSE.TXT file for copying and redistribution conditions.
#
# Until/if we are able to get MATLAB to not override every
# single request for a shared library with its own out-of-date
# version which results in version conflicts, we have to use
# this trick under OS X:
#
# 1. Duplicate the lib, bin, include files from the bundle into
# an separate directory, here /opt/gmt.
# 2. Rebaptize all libs with unique names by inserting an "X"
# 3. Link the gmt.mex executable with these libraries.
#
# To prepare your system to run the gmt.mex application, run
# /Application/GMT-6.x.x[_r#####.app]/Contents/Resources/share/tools/gmt_prepmex.sh
# This will require sudo privileges.
#
#-------------------------------------------------------------------------
Rel=$(gmt --version | awk '{print substr($1,1,3)}')
printf "\ngmt_prepmex.sh will convert a GMT %s.x bundle so libraries are suitable for building the MATLAB interface.\n" $Rel >&2
printf "You must have sudo privileges on this computer.\n\nContinue? (y/n) [y]:" >&2
read answer
if [ "X$answer" = "Xn" ]; then
exit 0
fi
here=$(pwd)
# First get a reliable absolute path to the bundle's top directory
pushd $(dirname $0) > /dev/null
BUNDLEDIR=$(pwd | sed -e sB/Contents/Resources/share/toolsBBg)
popd > /dev/null
# Set path to the new gmt installation
MEXGMT5DIR=/tmp/$$/gmt
# Set path to additional subdirectories
MEXLIBDIR=$MEXGMT5DIR/lib
MEXINCDIR=$MEXGMT5DIR/include
MEXSHADIR=$MEXGMT5DIR/share
MEXBINDIR=$MEXGMT5DIR/bin
MEXSUPDIR=$MEXLIBDIR/gmt/plugins
# Create install directory [remove first if exist]
rm -rf $MEXGMT5DIR
printf "gmt_prepmex.sh: Create $MEXGMT5DIR and copy files\n" >&2
mkdir -p $MEXBINDIR $MEXSUPDIR $MEXINCDIR
# Copy the share files
cd $BUNDLEDIR/Contents/Resources
cp -r share $MEXSHADIR
# Copy the include files
cd $BUNDLEDIR/Contents/Resources/include
cp -r gmt $MEXINCDIR
# Copy the bin files
cd $BUNDLEDIR/Contents/Resources/bin
cp -r * $MEXBINDIR
# Now copy the lib files
printf "gmt_prepmex.sh: Copy and rename libraries\n" >&2
cd $BUNDLEDIR/Contents/Resources/lib
# Find a list of all libs shipped with the OSX bundle, except our own:
ls *.dylib | egrep -v 'libgmt.dylib|libpostscriptlight.dylib' > /tmp/l.lis
# For each, duplicate into /opt/gmt but add a leading X to each name
while read lib; do
new=$(echo $lib | awk '{printf "libX%s\n", substr($1,4)}')
cp $lib $MEXLIBDIR/$new
done < /tmp/l.lis
# Copy the supplement shared plugin
cp gmt/plugins/supplements.so $MEXLIBDIR/gmt/plugins
cd $MEXLIBDIR
ls *.dylib > /tmp/l.lis
printf "gmt_prepmex.sh: Rebaptize libraries\n" >&2
# For all libs in $MEXLIBDIR, change internal references to contain the leading "X"
while read lib; do
otool -L $lib | grep executable_path | awk '{print $1}' > /tmp/t.lis
let k=1
while read old; do
new=$(echo $old | awk -F/ '{printf "libX%s\n", substr($NF,4)}')
if [ $k -eq 1 ]; then # Do the id change
was=$(echo $lib | awk -F/ '{print substr($1,4)}')
install_name_tool -id /opt/gmt/lib/$new $lib
else
install_name_tool -change $old /opt/gmt/lib/$new $lib
fi
let k=k+1
done < /tmp/t.lis
done < /tmp/l.lis
# Set links to the new libs
ln -s libXgmt.dylib libgmt.dylib
ln -s libXpostscriptlight.dylib libpostscriptlight.dylib
ln -s libXgmt.6.dylib libXgmt.dylib
ln -s libXpostscriptlight.6.dylib libXpostscriptlight.dylib
# If argument gs is given then we also do the same to the GS library.
if [ "$1" == "gs" ]; then
# Same stuff for gs which is called by psconvert as a system call.
# Here we must determine from where to copy...
GSV=$(gs --version)
if [ -d /sw/lib ]; then # Fink has no shared lib yet...
FROM=/sw/lib
echo "Sorry, no libgs.dylib under fink yet"
elif [ -d /opt/local/lib ]; then # Macports
FROM=/opt/local/lib
cp $FROM/libgs.${GSV}.dylib libXgs.${GSV}.dylib
cp $FROM/libfreetype.6.dylib libXfreetype.6.dylib
install_name_tool -id /opt/gmt/lib/libXgs.${GSV}.dylib libXgs.${GSV}.dylib
install_name_tool -id /opt/gmt/lib/libXfreetype.6.dylib libXfreetype.6.dylib
install_name_tool -change $FROM/libtiff.5.dylib /opt/gmt/lib/libXtiff.5.dylib libXgs.${GSV}.dylib
install_name_tool -change $FROM/libfreetype.6.dylib /opt/gmt/lib/libXfreetype.6.dylib libXgs.${GSV}.dylib
elif [ -d /usr/local/lib ]; then # Brew
FROM=/usr/local/lib
echo "Sorry, no libgs.dylib under HomeBrew yet"
fi
fi
# Do plugin supplement separately since not called lib*
cd gmt/plugins
otool -L supplements.so | grep executable_path | awk '{print $1}' > /tmp/t.lis
let k=1
while read old; do
new=$(echo $old | awk -F/ '{printf "libX%s\n", substr($NF,4)}')
install_name_tool -change $old /opt/gmt/lib/$new supplements.so
let k=k+1
done < /tmp/t.lis
# Do bin dir
cd $MEXBINDIR
otool -L gmt | grep executable_path | awk '{print $1}' > /tmp/t.lis
let k=1
while read old; do
new=$(echo $old | awk -F/ '{printf "libX%s\n", substr($NF,4)}')
install_name_tool -change $old /opt/gmt/lib/$new gmt
let k=k+1
done < /tmp/t.lis
chmod -R ugo+r $MEXGMT5DIR
printf "gmt_prepmex.sh: Install /opt/gmt\n" >&2
sudo cp -fpR $MEXGMT5DIR /opt
rm -rf /tmp/$$
cd $here
version=$(/opt/gmt/bin/gmt-config --version)
# Report
cat << EOF >&2
gmt_prepmex.sh: Made updated GMT $version installation in /opt/gmt
gmt_prepmex.sh: Add /opt/gmt to your .gmtversions and run gmtswitch to select this version
gmt_prepmex.sh: MATLAB may need a gmt.conf file with GMT_CUSTOM_LIBS=/opt/gmt/lib/gmt/plugins/supplements.so in the startup directory
EOF