#! /bin/sh
#
# shlib-install - install a shared library and do any necessary host-specific
#		  post-installation configuration (like ldconfig)
#
# usage: shlib-install [-D] -O host_os -d installation-dir [-b bin-dir] -i install-prog [-U] library
#
# Chet Ramey
# chet@po.cwru.edu

#
# defaults
#
INSTALLDIR=/usr/local/lib
LDCONFIG=ldconfig

PROGNAME=`basename $0`
USAGE="$PROGNAME [-D] -O host_os -d installation-dir [-b bin-dir] -i install-prog [-U] library"

# process options

while [ $# -gt 0 ]; do
	case "$1" in
	-O)	shift; host_os="$1"; shift ;;
	-d)	shift; INSTALLDIR="$1"; shift ;;
	-b)	shift; BINDIR="$1" ; shift ;;
	-i)	shift; INSTALLPROG="$1" ; shift ;;
	-D)	echo=echo ; shift ;;
	-U)	uninstall=true ; shift ;;
	-*)	echo "$USAGE" >&2 ; exit 2;;
	*)	break ;;
	esac
done

# set install target name
LIBNAME="$1"

if [ -z "$LIBNAME" ]; then
	echo "$USAGE" >&2
	exit 2
fi

OLDSUFF=old
MV=mv
RM="rm -f"
LN="ln -s"

# pre-install

if [ -z "$uninstall" ]; then
	${echo} $RM ${INSTALLDIR}/${LIBNAME}.${OLDSUFF}
	if [ -f "$INSTALLDIR/$LIBNAME" ]; then
		${echo} $MV $INSTALLDIR/$LIBNAME ${INSTALLDIR}/${LIBNAME}.${OLDSUFF}
	fi
fi

# install/uninstall

if [ -z "$uninstall" ] ; then
	${echo} eval ${INSTALLPROG} $LIBNAME ${INSTALLDIR}/${LIBNAME}
else
	${echo} ${RM} ${INSTALLDIR}/${LIBNAME}
fi

# post-install/uninstall

# HP-UX and Darwin/MacOS X require that a shared library have execute permission
# Linux does, too, and ldd warns about it
# Cygwin installs both a dll (which must go in $BINDIR) and an implicit
# link library (in $libdir)
case "$host_os" in
hpux*|darwin*|macosx*|linux*)
	if [ -z "$uninstall" ]; then
		chmod 555 ${INSTALLDIR}/${LIBNAME}
	fi ;;
cygwin*)
	IMPLIBNAME=`echo ${LIBNAME} \
		| sed -e 's,^cyg,lib,' -e 's,[0-9]*.dll$,.dll.a,'`
	if [ -z "$uninstall" ]; then
		${echo} $RM ${BINDIR}/${LIBNAME}.${OLDSUFF}
		if [ -f "$BINDIR/$LIBNAME" ]; then
			${echo} $MV $BINDIR/$LIBNAME $BINDIR/$LIBNAME.$OLDSUFF
		fi
		${echo} $MV ${INSTALLDIR}/${LIBNAME} ${BINDIR}/${LIBNAME}
		${echo} chmod a+x ${BINDIR}/${LIBNAME}
		${echo} eval ${INSTALLPROG} ${LIBNAME}.a \
			${INSTALLDIR}/${IMPLIBNAME}
	else
		${echo} ${RM} ${BINDIR}/${LIBNAME}
		${echo} ${RM} ${INSTALLDIR}/${IMPLIBNAME}
	fi ;;

*)	;;
esac

case "$LIBNAME" in
*.*.[0-9].[0-9])	# libname.so.M.N
	LINK2=`echo $LIBNAME | sed 's:\(.*\..*\.[0-9]\)\.[0-9]:\1:'`	# libname.so.M
	LINK1=`echo $LIBNAME | sed 's:\(.*\..*\)\.[0-9]\.[0-9]:\1:'`	# libname.so
	;;
*.*.[0-9])		# libname.so.M
	LINK1=`echo $LIBNAME | sed 's:\(.*\..*\)\.[0-9]:\1:'`		# libname.so
	;;
*.[0-9])		# libname.M
	LINK1=`echo $LIBNAME | sed 's:\(.*\)\.[0-9]:\1:'`		# libname
	;;
*.[0-9].[0-9].dylib)	# libname.M.N.dylib
	LINK2=`echo $LIBNAME | sed 's:\(.*\.[0-9]\)\.[0-9]:\1:'`	# libname.M.dylib
	LINK1=`echo $LIBNAME | sed 's:\(.*\)\.[0-9]\.[0-9]:\1:'`	# libname.dylib
esac

INSTALL_LINK1='${echo} cd $INSTALLDIR && ${echo} ${LN} $LIBNAME $LINK1'
INSTALL_LINK2='${echo} cd $INSTALLDIR && ${echo} ${LN} $LIBNAME $LINK2'

#
# Create symlinks to the installed library.  This section is incomplete.
#
case "$host_os" in
*linux*)
	# libname.so.M -> libname.so.M.N
	${echo} ${RM} ${INSTALLDIR}/$LINK2
	if [ -z "$uninstall" ]; then
		eval $INSTALL_LINK2
	fi

	# libname.so -> libname.so.M
	${echo} ${RM} ${INSTALLDIR}/$LINK1
	if [ -z "$uninstall" ]; then
		${echo} cd $INSTALLDIR && ${echo} ${LN} $LINK2 $LINK1
	fi
	;;

bsdi4*|*gnu*|darwin*|macosx*|k*bsd*-gnu)
	# libname.so.M -> libname.so.M.N
	${echo} ${RM} ${INSTALLDIR}/$LINK2
	if [ -z "$uninstall" ]; then
		eval $INSTALL_LINK2
	fi

	# libname.so -> libname.so.M.N
	${echo} ${RM} ${INSTALLDIR}/$LINK1
	if [ -z "$uninstall" ]; then
		eval $INSTALL_LINK1
	fi
	;;

solaris2*|aix4.[2-9]*|osf*|irix[56]*|sysv[45]*|dgux*)
	# libname.so -> libname.so.M
	${echo} ${RM} ${INSTALLDIR}/$LINK1
	if [ -z "$uninstall" ]; then
		eval $INSTALL_LINK1
	fi
	;;


# FreeBSD 3.x and above can have either a.out or ELF shared libraries
freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*)
	if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then
		# libname.so -> libname.so.M
		${echo} ${RM} ${INSTALLDIR}/$LINK1
		if [ -z "$uninstall" ]; then
			eval $INSTALL_LINK1
		fi
	else
		# libname.so.M -> libname.so.M.N
		${echo} ${RM} ${INSTALLDIR}/$LINK2
		if [ -z "$uninstall" ]; then
			eval $INSTALL_LINK2
		fi

		# libname.so -> libname.so.M.N
		${echo} ${RM} ${INSTALLDIR}/$LINK1
		if [ -z "$uninstall" ]; then
			eval $INSTALL_LINK1
		fi
	fi
	;;

hpux1*)
	# libname.sl -> libname.M
	${echo} ${RM} ${INSTALLDIR}/$LINK1.sl
	if [ -z "$uninstall" ]; then
		eval $INSTALL_LINK1
	fi
	;;

cygwin*)
	# Links to .dlls don't work.  Hence shobj-conf used DLLVERSION.dll
	# instead of so.SHLIB_MAJOR.SHLIB_MINOR.  The postinstall above
	# took care of everything else.
	;;

*)	;;
esac

exit 0
