#!/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
