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