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