Blame install-sh

Packit b0b924
#! /bin/sh
Packit b0b924
#
Packit b0b924
# Copyright (c) 2000-2002 Silicon Graphics, Inc.  All Rights Reserved.
Packit b0b924
# 
Packit b0b924
# This program is free software; you can redistribute it and/or modify it
Packit b0b924
# under the terms of version 2 of the GNU General Public License as
Packit b0b924
# published by the Free Software Foundation.
Packit b0b924
# 
Packit b0b924
# This program is distributed in the hope that it would be useful, but
Packit b0b924
# WITHOUT ANY WARRANTY; without even the implied warranty of
Packit b0b924
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Packit b0b924
# 
Packit b0b924
# Further, this software is distributed without any warranty that it is
Packit b0b924
# free of the rightful claim of any third person regarding infringement
Packit b0b924
# or the like.  Any license provided herein, whether implied or
Packit b0b924
# otherwise, applies only to this software file.  Patent licenses, if
Packit b0b924
# any, provided herein do not apply to combinations of this program with
Packit b0b924
# other software, or any other product whatsoever.
Packit b0b924
# 
Packit b0b924
# You should have received a copy of the GNU General Public License along
Packit b0b924
# with this program; if not, write the Free Software Foundation, Inc., 59
Packit b0b924
# Temple Place - Suite 330, Boston MA 02111-1307, USA.
Packit b0b924
# 
Packit b0b924
# Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
Packit b0b924
# Mountain View, CA  94043, or:
Packit b0b924
# 
Packit b0b924
# http://www.sgi.com 
Packit b0b924
# 
Packit b0b924
# For further information regarding this notice, see: 
Packit b0b924
# 
Packit b0b924
# http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
Packit b0b924
#
Packit b0b924
Packit b0b924
#
Packit b0b924
# This script emulates bsd install and also recognises
Packit b0b924
# two environment variables, with the following semantics :-
Packit b0b924
#
Packit b0b924
# $DIST_MANIFEST - if set, the name of the file to append manifest
Packit b0b924
#                  information in the following format:
Packit b0b924
#                  File     :  f mode owner group src target
Packit b0b924
#                  Directory:  d mode owner group target
Packit b0b924
#                  Symlink  :  l linkval target
Packit b0b924
#
Packit b0b924
# $DIST_ROOT     - if set, prepend to target
Packit b0b924
#
Packit b0b924
# The sematics of all combinations of these two variables
Packit b0b924
# are as follows:
Packit b0b924
#
Packit b0b924
# $DIST_MANIFEST?  $DIST_ROOT? |   Copy?  Append Manifest?
Packit b0b924
# -----------------------------+--------------------------
Packit b0b924
#       not set       not set  |    yes        no
Packit b0b924
#       not set       set      |    yes        no
Packit b0b924
#       set           not set  |    no         yes
Packit b0b924
#       set           set      |    yes        yes
Packit b0b924
# 
Packit b0b924
_usage() {
Packit b0b924
    echo "Usage: $prog [-o owner] [-g group] [-m mode] -d directory"
Packit b0b924
    echo "or     $prog [-D] [-o owner] [-g group] [-m mode] file directory/file"
Packit b0b924
    echo "or     $prog [-o owner] [-g group] [-m mode] file [file ...] directory"
Packit b0b924
    echo "or     $prog -S file target  (creates \"target\" symlink)"
Packit b0b924
    echo "or     $prog -T lt_arg [-o owner] [-g group] [-m mode] libtool.lai directory"
Packit b0b924
    echo ""
Packit b0b924
    echo "The \$DIST_MANIFEST and \$DIST_ROOT environment variables affect the"
Packit b0b924
    echo "behaviour of this command - see comments in the script."
Packit b0b924
    echo "The -D flag is only available for the second usage, and causes"
Packit b0b924
    echo "the target directory to be created before installing the file."
Packit b0b924
    echo ""
Packit b0b924
    exit 1
Packit b0b924
}
Packit b0b924
Packit b0b924
_chown ()
Packit b0b924
{
Packit b0b924
    _st=255
Packit b0b924
    if [ $# -eq 3 ] ; then
Packit b0b924
	chown $1:$2 $3
Packit b0b924
	_st=$?
Packit b0b924
	if [ $_st -ne 0 ] ; then
Packit b0b924
	    if [ $REAL_UID != '0' ] ; then
Packit b0b924
		if [ ! -f $DIST_ROOT/.chown.quiet ] ; then
Packit b0b924
		    echo '==============================================='
Packit b0b924
		    echo Ownership of files under ${DIST_ROOT:-/}
Packit b0b924
		    echo cannot be changed
Packit b0b924
		    echo '==============================================='
Packit b0b924
		    if [ -n "$DIST_ROOT" ] ; then
Packit b0b924
			touch $DIST_ROOT/.chown.quiet
Packit b0b924
		    fi
Packit b0b924
		fi
Packit b0b924
	       _st=0
Packit b0b924
	    fi     
Packit b0b924
	fi
Packit b0b924
    fi
Packit b0b924
Packit b0b924
    return $_st
Packit b0b924
}
Packit b0b924
Packit b0b924
Packit b0b924
_manifest ()
Packit b0b924
{ 
Packit b0b924
    echo $* | sed -e 's/\/\//\//g' >>${DIST_MANIFEST:-/dev/null}
Packit b0b924
}
Packit b0b924
Packit b0b924
prog=`basename $0`
Packit b0b924
HERE=`pwd`
Packit b0b924
dflag=false
Packit b0b924
Dflag=false
Packit b0b924
Sflag=false
Packit b0b924
Tflag=false
Packit b0b924
DIRMODE=755
Packit b0b924
FILEMODE=644
Packit b0b924
OWNER=`id -u`
Packit b0b924
GROUP=`id -g`
Packit b0b924
REAL_UID=$OWNER
Packit b0b924
Packit b0b924
# default is to install and don't append manifest
Packit b0b924
INSTALL=true
Packit b0b924
MANIFEST=:
Packit b0b924
Packit b0b924
[ -n "$DIST_MANIFEST" -a -z "$DIST_ROOT" ] && INSTALL=false
Packit b0b924
[ -n "$DIST_MANIFEST" ] && MANIFEST="_manifest"
Packit b0b924
Packit b0b924
[ $# -eq 0 ] && _usage
Packit b0b924
Packit b0b924
if $INSTALL
Packit b0b924
then
Packit b0b924
    CP=cp; LN=ln; MKDIR=mkdir; CHMOD=chmod; CHOWN=_chown
Packit b0b924
else
Packit b0b924
    CP=true; LN=true; MKDIR=true; CHMOD=true; CHOWN=true
Packit b0b924
fi
Packit b0b924
Packit b0b924
[ -n "$DIST_ROOT" -a $REAL_UID -ne 0 ] && CHOWN=true
Packit b0b924
Packit b0b924
while getopts "Dcm:d:S:o:g:T:" c $*
Packit b0b924
do
Packit b0b924
   case $c in
Packit b0b924
   c)
Packit b0b924
	;;
Packit b0b924
   g)
Packit b0b924
	GROUP=$OPTARG
Packit b0b924
	;;
Packit b0b924
   o)
Packit b0b924
	OWNER=$OPTARG
Packit b0b924
	;;
Packit b0b924
   m)
Packit b0b924
	DIRMODE=`expr $OPTARG`
Packit b0b924
	FILEMODE=$DIRMODE
Packit b0b924
	;;
Packit b0b924
   D) 
Packit b0b924
	Dflag=true
Packit b0b924
	;;
Packit b0b924
   S) 
Packit b0b924
	symlink=$OPTARG
Packit b0b924
	Sflag=true
Packit b0b924
	;;
Packit b0b924
   d) 
Packit b0b924
	dir=$DIST_ROOT/$OPTARG
Packit b0b924
	dflag=true
Packit b0b924
	;;
Packit b0b924
   T)
Packit b0b924
	lt_install=$OPTARG
Packit b0b924
	Tflag=true
Packit b0b924
	;;
Packit b0b924
   *)
Packit b0b924
   	_usage
Packit b0b924
	;;
Packit b0b924
   esac
Packit b0b924
done
Packit b0b924
Packit b0b924
shift `expr $OPTIND - 1`
Packit b0b924
Packit b0b924
status=0
Packit b0b924
if $dflag
Packit b0b924
then
Packit b0b924
    #
Packit b0b924
    # first usage
Packit b0b924
    #
Packit b0b924
    $MKDIR -p $dir 
Packit b0b924
    status=$?
Packit b0b924
    if [ $status -eq 0 ]
Packit b0b924
    then
Packit b0b924
	$CHMOD $DIRMODE $dir
Packit b0b924
	status=$?
Packit b0b924
    fi
Packit b0b924
    if [ $status -eq 0 ]
Packit b0b924
    then
Packit b0b924
	$CHOWN $OWNER $GROUP $dir
Packit b0b924
	status=$?
Packit b0b924
    fi
Packit b0b924
    $MANIFEST d $DIRMODE $OWNER $GROUP ${dir#$DIST_ROOT}
Packit b0b924
elif $Sflag
Packit b0b924
then
Packit b0b924
    #
Packit b0b924
    # fourth usage (symlink)
Packit b0b924
    #
Packit b0b924
    if [ $# -ne 1 ]
Packit b0b924
    then
Packit b0b924
    	_usage
Packit b0b924
    else
Packit b0b924
    	target=$DIST_ROOT/$1
Packit b0b924
    fi
Packit b0b924
    $LN -s -f $symlink $target
Packit b0b924
    status=$?
Packit b0b924
    $MANIFEST l $symlink ${target#$DIST_ROOT} 
Packit b0b924
elif $Tflag
Packit b0b924
then
Packit b0b924
    #
Packit b0b924
    # -T (install libs built by libtool)
Packit b0b924
    #
Packit b0b924
    if [ $# -ne 2 ]
Packit b0b924
    then
Packit b0b924
	_usage
Packit b0b924
    else
Packit b0b924
	libtool_lai=$1
Packit b0b924
	# source the libtool variables
Packit b0b924
	if [ ! -f $libtool_lai ]
Packit b0b924
	then
Packit b0b924
		echo "$prog: Unable to find libtool library file $libtool_lai"
Packit b0b924
		exit 2
Packit b0b924
	fi
Packit b0b924
	. ./$libtool_lai
Packit b0b924
	target=$DIST_ROOT/$2
Packit b0b924
    fi
Packit b0b924
    case $lt_install in
Packit b0b924
    so_dot_version)
Packit b0b924
	# Loop until we find libfoo.so.x.y.z, then break out.
Packit b0b924
	for solib in $library_names
Packit b0b924
	do
Packit b0b924
		# does it have enough parts?  libfoo.so.x.y.z == 5
Packit b0b924
		cnt=`echo "$solib" | sed -e 's/\./ /g' | wc -w`
Packit b0b924
		if [ $cnt -eq 5 ]
Packit b0b924
		then
Packit b0b924
			install_name=$target/$solib
Packit b0b924
			$CP $solib $install_name
Packit b0b924
			status=$?
Packit b0b924
			$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$solib ${install_name#$DIST_ROOT}
Packit b0b924
			break
Packit b0b924
		fi
Packit b0b924
	done
Packit b0b924
	;;
Packit b0b924
Packit b0b924
    so_*)
Packit b0b924
	case $lt_install in
Packit b0b924
	so_dot_current)
Packit b0b924
		# ln -s libfoo.so.x.y.z to libfoo.so.x
Packit b0b924
		from_parts=5  # libfoo.so.x.y.z
Packit b0b924
		to_parts=3    # libfoo.so.x
Packit b0b924
		;;
Packit b0b924
	so_base)
Packit b0b924
		# ln -s libfoo.so.x to libfoo.so
Packit b0b924
		from_parts=3  # libfoo.so.x
Packit b0b924
		to_parts=2    # libfoo.so
Packit b0b924
		;;
Packit b0b924
	*)
Packit b0b924
		echo "$prog: -T $lt_install invalid"
Packit b0b924
		exit 2
Packit b0b924
		;;
Packit b0b924
	esac
Packit b0b924
Packit b0b924
	# Loop until we find the names, then break out.
Packit b0b924
	for solib in $library_names
Packit b0b924
	do
Packit b0b924
		# does it have enough parts?
Packit b0b924
		cnt=`echo "$solib" | sed -e 's/\./ /g' | wc -w`
Packit b0b924
		if [ $cnt -eq $from_parts ]
Packit b0b924
		then
Packit b0b924
			from_name=$solib
Packit b0b924
		elif [ $cnt -eq $to_parts ]
Packit b0b924
		then
Packit b0b924
			to_name=$solib
Packit b0b924
		fi
Packit b0b924
Packit b0b924
		if [ -n "$from_name" ] && [ -n "$to_name" ]
Packit b0b924
		then
Packit b0b924
			install_name=$target/$to_name
Packit b0b924
			$LN -s -f $from_name $install_name
Packit b0b924
			status=$?
Packit b0b924
			$MANIFEST l $from_name ${install_name#$DIST_ROOT}
Packit b0b924
			break
Packit b0b924
		fi
Packit b0b924
	done
Packit b0b924
	;;
Packit b0b924
    old_lib)
Packit b0b924
	install_name=$target/$old_library
Packit b0b924
	$CP $old_library $install_name
Packit b0b924
	status=$?
Packit b0b924
	$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$old_library ${install_name#$DIST_ROOT}
Packit b0b924
	;;
Packit b0b924
    *)
Packit b0b924
	echo "$prog: -T $lt_install invalid"
Packit b0b924
	exit 2
Packit b0b924
	;;
Packit b0b924
    esac
Packit b0b924
Packit b0b924
    case $lt_install in
Packit b0b924
    old_lib|so_dot_version)
Packit b0b924
	if [ $status -eq 0 ]
Packit b0b924
	then
Packit b0b924
		$CHMOD $FILEMODE $install_name
Packit b0b924
		$CHOWN $OWNER $GROUP $install_name
Packit b0b924
	fi
Packit b0b924
	;;
Packit b0b924
    esac
Packit b0b924
Packit b0b924
else
Packit b0b924
    list=""
Packit b0b924
    dir=""
Packit b0b924
    if [ $# -eq 2 ]
Packit b0b924
    then
Packit b0b924
	#
Packit b0b924
	# second usage
Packit b0b924
	#
Packit b0b924
	f=$1
Packit b0b924
	dir=$DIST_ROOT/$2
Packit b0b924
	if $Dflag
Packit b0b924
	then
Packit b0b924
	    mkdir -p `dirname $dir`
Packit b0b924
	fi
Packit b0b924
	$CP $f $dir
Packit b0b924
	status=$?
Packit b0b924
	if [ $status -eq 0 ]
Packit b0b924
	then 
Packit b0b924
	    if [ -f $dir/$f ]
Packit b0b924
	    then
Packit b0b924
		$CHMOD $FILEMODE $dir/$f
Packit b0b924
		status=$?
Packit b0b924
		if [ $status -eq 0 ]
Packit b0b924
		then
Packit b0b924
		    $CHOWN $OWNER $GROUP $dir/$f
Packit b0b924
		    status=$?
Packit b0b924
		fi
Packit b0b924
		$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f
Packit b0b924
	    else
Packit b0b924
		$CHMOD $FILEMODE $dir
Packit b0b924
		status=$?
Packit b0b924
		if [ $status -eq 0 ]
Packit b0b924
		then
Packit b0b924
		    $CHOWN $OWNER $GROUP $dir
Packit b0b924
		    status=$?
Packit b0b924
		fi
Packit b0b924
		$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$dir ${dir#$DIST_ROOT}
Packit b0b924
	    fi
Packit b0b924
	fi
Packit b0b924
    else
Packit b0b924
	#
Packit b0b924
	# third usage
Packit b0b924
	#
Packit b0b924
	n=1
Packit b0b924
	while [ $# -gt 0 ]
Packit b0b924
	do
Packit b0b924
	    if [ $# -gt 1 ]
Packit b0b924
	    then
Packit b0b924
		list="$list $1"
Packit b0b924
	    else
Packit b0b924
		dir=$DIST_ROOT/$1
Packit b0b924
	    fi
Packit b0b924
	    shift
Packit b0b924
	done
Packit b0b924
Packit b0b924
	for f in $list
Packit b0b924
	do
Packit b0b924
	    $CP $f $dir
Packit b0b924
	    status=$?
Packit b0b924
	    if [ $status -eq 0 ]
Packit b0b924
	    then
Packit b0b924
		$CHMOD $FILEMODE $dir/$f
Packit b0b924
		status=$?
Packit b0b924
		if [ $status -eq 0 ]
Packit b0b924
		then
Packit b0b924
		    $CHOWN $OWNER $GROUP $dir/$f
Packit b0b924
		    status=$?
Packit b0b924
		fi
Packit b0b924
		$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f
Packit b0b924
	    fi
Packit b0b924
	    [ $status -ne 0 ] && break
Packit b0b924
	done
Packit b0b924
    fi
Packit b0b924
fi
Packit b0b924
Packit b0b924
exit $status