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
142 lines
5.4 KiB
Bash
|
1 month ago
|
#!/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
|