| #! /bin/bash | |
| # | |
| # SPDX-License-Identifier: GPL-2.0 | |
| # 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 |