#! /bin/sh
#
# Copyright (c) 2000-2001 Silicon Graphics, Inc.  All Rights Reserved.
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

# This script emulates bsd install and also recognises
# two environment variables, with the following semantics :-
#
# $DIST_MANIFEST - if set, the name of the file to append manifest
#                  information in the following format:
#                  File     :  f mode owner group src target
#                  Directory:  d mode owner group target
#                  Symlink  :  l linkval target
#
# $DIST_ROOT     - if set, prepend to target
#
# The sematics of all combinations of these two variables
# are as follows:
#
# $DIST_MANIFEST?  $DIST_ROOT? |   Copy?  Append Manifest?
# -----------------------------+--------------------------
#       not set       not set  |    yes        no
#       not set       set      |    yes        no
#       set           not set  |    no         yes
#       set           set      |    yes        yes
#
_usage() {
    echo "Usage: $prog [-o owner] [-g group] [-m mode] -d directory"
    echo "or     $prog [-D] [-o owner] [-g group] [-m mode] file directory/file"
    echo "or     $prog [-o owner] [-g group] [-m mode] file [file ...] directory"
    echo "or     $prog -S file target  (creates \"target\" symlink)"
    echo "or     $prog -T lt_arg [-o owner] [-g group] [-m mode] libtool.lai directory"
    echo ""
    echo "The \$DIST_MANIFEST and \$DIST_ROOT environment variables affect the"
    echo "behaviour of this command - see comments in the script."
    echo "The -D flag is only available for the second usage, and causes"
    echo "the target directory to be created before installing the file."
    echo ""
    exit 1
}

_chown ()
{
    _st=255
    if [ $# -eq 3 ] ; then
	chown $1:$2 $3
	_st=$?
	if [ $_st -ne 0 ] ; then
	    if [ $REAL_UID != '0' ] ; then
		if [ ! -f $DIST_ROOT/.chown.quiet ] ; then
		    echo '==============================================='
		    echo Ownership of files under ${DIST_ROOT:-/}
		    echo cannot be changed
		    echo '==============================================='
		    if [ -n "$DIST_ROOT" ] ; then
			touch $DIST_ROOT/.chown.quiet
		    fi
		fi
	       _st=0
	    fi
	fi
    fi

    return $_st
}


_manifest ()
{
    echo $* | sed -e 's/\/\//\//g' >>${DIST_MANIFEST:-/dev/null}
}

prog=`basename $0`
HERE=`pwd`
dflag=false
Dflag=false
Sflag=false
Tflag=false
DIRMODE=755
FILEMODE=644
OWNER=`id -u`
GROUP=`id -g`
REAL_UID=$OWNER

# default is to install and don't append manifest
INSTALL=true
MANIFEST=:

: ${DIST_ROOT:=${DESTDIR}}

[ -n "$DIST_MANIFEST" -a -z "$DIST_ROOT" ] && INSTALL=false
[ -n "$DIST_MANIFEST" ] && MANIFEST="_manifest"

[ $# -eq 0 ] && _usage

if $INSTALL
then
    CP=cp; LN=ln; MKDIR=mkdir; CHMOD=chmod; CHOWN=_chown
else
    CP=true; LN=true; MKDIR=true; CHMOD=true; CHOWN=true
fi

[ -n "$DIST_ROOT" -a $REAL_UID -ne 0 ] && CHOWN=true

while getopts "Dcm:d:S:o:g:T:" c $*
do
   case $c in
   c)
	;;
   g)
	GROUP=$OPTARG
	;;
   o)
	OWNER=$OPTARG
	;;
   m)
	DIRMODE=`expr $OPTARG`
	FILEMODE=$DIRMODE
	;;
   D)
	Dflag=true
	;;
   S)
	symlink=$OPTARG
	Sflag=true
	;;
   d)
	dir=$DIST_ROOT/$OPTARG
	dflag=true
	;;
   T)
	lt_install=$OPTARG
	Tflag=true
	;;
   *)
	_usage
	;;
   esac
done

shift `expr $OPTIND - 1`

status=0
if $dflag
then
    #
    # first usage
    #
    $MKDIR -p $dir
    status=$?
    if [ $status -eq 0 ]
    then
	$CHMOD $DIRMODE $dir
	status=$?
    fi
    if [ $status -eq 0 ]
    then
	$CHOWN $OWNER $GROUP $dir
	status=$?
    fi
    $MANIFEST d $DIRMODE $OWNER $GROUP ${dir#$DIST_ROOT}
elif $Sflag
then
    #
    # fourth usage (symlink)
    #
    if [ $# -ne 1 ]
    then
	_usage
    else
	target=$DIST_ROOT/$1
    fi
    $LN -s -f $symlink $target
    status=$?
    $MANIFEST l $symlink ${target#$DIST_ROOT}
elif $Tflag
then
    #
    # -T (install libs built by libtool)
    #
    if [ $# -ne 2 ]
    then
	_usage
    else
	libtool_lai=$1
	# source the libtool variables
	if [ ! -f $libtool_lai ]
	then
		echo "$prog: Unable to find libtool library file $libtool_lai"
		exit 2
	fi
	. ./$libtool_lai
	target=$DIST_ROOT/$2
    fi
    case $lt_install in
    so_dot_version)
	# Loop until we find libfoo.so.x.y.z, then break out.
	for solib in $library_names
	do
		# does it have enough parts?  libfoo.so.x.y.z == 5
		cnt=`echo "$solib" | sed -e 's/\./ /g' | wc -w`
		if [ $cnt -eq 5 ]
		then
			install_name=$target/$solib
			$CP $solib $install_name
			status=$?
			$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$solib ${install_name#$DIST_ROOT}
			break
		fi
	done
	;;

    so_*)
	case $lt_install in
	so_dot_current)
		# ln -s libfoo.so.x.y.z to libfoo.so.x
		from_parts=5  # libfoo.so.x.y.z
		to_parts=3    # libfoo.so.x
		;;
	so_base)
		# ln -s libfoo.so.x to libfoo.so
		from_parts=3  # libfoo.so.x
		to_parts=2    # libfoo.so
		;;
	*)
		echo "$prog: -T $lt_install invalid"
		exit 2
		;;
	esac

	# Loop until we find the names, then break out.
	for solib in $library_names
	do
		# does it have enough parts?
		cnt=`echo "$solib" | sed -e 's/\./ /g' | wc -w`
		if [ $cnt -eq $from_parts ]
		then
			from_name=$solib
		elif [ $cnt -eq $to_parts ]
		then
			to_name=$solib
		fi

		if [ -n "$from_name" ] && [ -n "$to_name" ]
		then
			install_name=$target/$to_name
			$LN -s -f $from_name $install_name
			status=$?
			$MANIFEST l $from_name ${install_name#$DIST_ROOT}
			break
		fi
	done
	;;
    old_lib)
	install_name=$target/$old_library
	$CP $old_library $install_name
	status=$?
	$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$old_library ${install_name#$DIST_ROOT}
	;;
    *)
	echo "$prog: -T $lt_install invalid"
	exit 2
	;;
    esac

    case $lt_install in
    old_lib|so_dot_version)
	if [ $status -eq 0 ]
	then
		$CHMOD $FILEMODE $install_name
		$CHOWN $OWNER $GROUP $install_name
	fi
	;;
    esac

else
    list=""
    dir=""
    if [ $# -eq 2 ]
    then
	#
	# second usage
	#
	f=$1
	dir=$DIST_ROOT/$2
	if $Dflag
	then
	    mkdir -p `dirname $dir`
	fi
	$CP $f $dir
	status=$?
	if [ $status -eq 0 ]
	then
	    if [ -f $dir/$f ]
	    then
		$CHMOD $FILEMODE $dir/$f
		status=$?
		if [ $status -eq 0 ]
		then
		    $CHOWN $OWNER $GROUP $dir/$f
		    status=$?
		fi
		$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f
	    else
		$CHMOD $FILEMODE $dir
		status=$?
		if [ $status -eq 0 ]
		then
		    $CHOWN $OWNER $GROUP $dir
		    status=$?
		fi
		$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$dir ${dir#$DIST_ROOT}
	    fi
	fi
    else
	#
	# third usage
	#
	n=1
	while [ $# -gt 0 ]
	do
	    if [ $# -gt 1 ]
	    then
		list="$list $1"
	    else
		dir=$DIST_ROOT/$1
	    fi
	    shift
	done

	# echo DIR=$dir list=\"$list\"
	for f in $list
	do
	    $CP $f $dir
	    status=$?
	    if [ $status -eq 0 ]
	    then
		$CHMOD $FILEMODE $dir/$f
		status=$?
		if [ $status -eq 0 ]
		then
		    $CHOWN $OWNER $GROUP $dir/$f
		    status=$?
		fi
		$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f
	    fi
	    [ $status -ne 0 ] && break
	done
    fi
fi

exit $status
