#!/bin/sh

if [ -z "$1" ]; then
    echo ""
    echo " Usage: nopathR <r-home>"
    echo ""
    exit 0
fi

R=$1

if [ ! -e $R/lib/libR.dylib ]; then
    echo "Cannot find $R/lib/libR.dylib"
    exit 1
fi

PWD=`pwd`
cd $R/lib

export RBASE="$R"
: ${BASE=/Builds/R-builds/nightly}

if [ -n "$TC_BASE" ]; then 
    echo "NOTE: TC_BASE override ${TC_BASE} from env, skipping toolchain check"
else
. $BASE/check.toolchain
fi

if otool -L $R/lib/libR.dylib | grep /gcc4.0/ > /dev/null; then
    echo " - GCC 4.0.3 mode"
    GCCLIB=/usr/local/gcc4.0/lib
    GCCLIBS="libgcc_s.1.0.dylib libgfortran.0.dylib libstdc++.6.dylib"
else
    if [ -e /usr/local/gfortran/lib/libgfortran.3.dylib ]; then
	echo " - OMP GFORTRAN/clang mode"
	GCCLIB=/usr/local/gfortran/lib
	if [ -e "${TC_BASE}/lib" ]; then
	    echo " - clang: ${TC_BASE}"
	    GCCLIB2=${TC_BASE}/lib
	fi
	GCCLIBS="libgcc_s.1.dylib libgfortran.3.dylib libquadmath.0.dylib libomp.dylib libc++abi.1.dylib libc++.1.dylib libunwind.1.dylib" #libstdc++.6.dylib libubsan.0.dylib libssp.0.dylib libasan.3.dylib"
    else
	echo " - local GCC mode"
	GCCLIB=/usr/local/lib
	GCCLIBS="libgcc_s.1.dylib libgfortran.2.dylib"
    fi
fi

## make sure everything is writable - clang likes to make libraries read-only
chmod u+w $R/lib/*dylib

echo "Fix libR ..."
install_name_tool -id $R/lib/libR.dylib libR.dylib

for gcclib in $GCCLIBS; do
    cd $R/lib
    echo "Copy $gcclib ..."
    cp $GCCLIB/$gcclib .
    if [ -n "$GCCLIB2" ]; then cp $GCCLIB2/$gcclib .; fi

    echo "Fix $gcclib libs ..."
    chmod a+x lib*
    chmod u+w *dylib

    install_name_tool -id $R/lib/$gcclib $R/lib/$gcclib
done

# second pass - fix inside references
for gcclib in $GCCLIBS; do
    cd $R
    echo "Fix all dylib/so in $R ..."
    find . -name \*.dylib -or -name \*.so| xargs -n 1 install_name_tool -change $GCCLIB/$gcclib $R/lib/$gcclib
    find . -name \*.dylib -or -name \*.so| xargs -n 1 install_name_tool -change /usr/local/clang4/lib/$gcclib $R/lib/$gcclib
    find . -name \*.dylib -or -name \*.so| xargs -n 1 install_name_tool -change ${TC_BASE}/lib/$gcclib $R/lib/$gcclib
    find . -name \*.dylib -or -name \*.so| xargs -n 1 install_name_tool -change /usr/local/lib/$gcclib $R/lib/$gcclib
    find . -name \*.dylib -or -name \*.so| xargs -n 1 install_name_tool -change $gcclib $R/lib/$gcclib
    # fix bin/exec*R
    for rbin in `ls bin/exec/*/* bin/exec/R bin/Rscript 2>/dev/null`; do
	## this is mostly for omp and c++
	if [ -n "$GCCLIB2" ]; then
	    install_name_tool -change $GCCLIB2/$gcclib $R/lib/$gcclib $rbin
	fi
	## rest of them
	install_name_tool -change $GCCLIB/$gcclib $R/lib/$gcclib $rbin
	install_name_tool -change /usr/local/clang4/lib/$gcclib $R/lib/$gcclib $rbin
	install_name_tool -change ${TC_BASE}/lib/$gcclib $R/lib/$gcclib $rbin
    done
done

cd $R/lib
otool -L libR.dylib|grep readline
if [ $? == 0 ]; then
    echo "Copying and fixing readline ..."
    rllib=`ls /usr/local/lib/libreadline.?.?.dylib|sort|tail -n 1`
    rllib=`basename ${rllib}`
    cp /usr/local/lib/${rllib} .
    chmod a+x lib*
    chmod u+w *dylib
    chgrp admin lib*
    chmod g+w lib*
    install_name_tool -id $R/lib/${rllib} ${rllib}
    cd $R
    find . -name \*.dylib -o -name \*.so| xargs -n 1 install_name_tool -change ${rllib} $R/lib/${rllib}
    find . -name \*.dylib -o -name \*.so| xargs -n 1 install_name_tool -change /usr/local/lib/${rllib} $R/lib/${rllib}
fi

# last pass -- actually it coulde replace the above two
# it takes care of any linked libraries in /usr/local that are supplied
# (as for packages)

rlib=$R/lib
cd $R/
# now go through all so/dylibs we find
libs=`find . -name \*.so -or -name \*.dylib -or -name \*.jnilib`
for lib in $libs; do
    # in each so/dylib/jnilib, find dependent libraries beginning with /usr/local
    lds=`otool -L $lib| sed -n 's|.\(/usr/local.\{0,\}\) (com.\{0,\}|\1|p'`
    for ld in $lds; do
        # find out what the baes name of the linked dylib is
	ldname=`basename $ld`
	if [ -e "$rlib/$ldname" ]; then
            # if a copy exists in the same location as libR.dylib, fix it
	    echo "LDI: $ld -> $rlib/$ldname"
	    install_name_tool -change "$ld" "$rlib/$ldname" $lib
	else
            # otherwise warn - that is an unresolved dependency
	    echo "LDW: WARNING: $ld not found in $rlib/$ldname"
	fi
    done
done

# fix permission issue with config.h
if [ -e $R/../PrivateHeaders ]; then
    chmod a+r $R/../PrivateHeaders/*
fi

echo "Done"

cd $PWD