#! /bin/bash
#
# Copyright (c) 2000-2001 Silicon Graphics, Inc.  All Rights Reserved.
#
# 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
