[BACK]Return to install-sh CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2018

Diff for /OpenXM_contrib2/asir2018/install-sh between version 1.1 and 1.2

version 1.1, 2018/09/19 05:45:05 version 1.2, 2020/01/08 17:10:53
Line 1 
Line 1 
 #!/bin/sh  #!/bin/sh
 #  
 # install - install a program, script, or datafile  # install - install a program, script, or datafile
 # This comes from X11R5 (mit/util/scripts/install.sh).  
   scriptversion=2013-12-25.23; # UTC
   
   # This originates from X11R5 (mit/util/scripts/install.sh), which was
   # later released in X11R6 (xc/config/util/install.sh) with the
   # following copyright and license.
 #  #
 # Copyright 1991 by the Massachusetts Institute of Technology  # Copyright (C) 1994 X Consortium
 #  #
 # Permission to use, copy, modify, distribute, and sell this software and its  # Permission is hereby granted, free of charge, to any person obtaining a copy
 # documentation for any purpose is hereby granted without fee, provided that  # of this software and associated documentation files (the "Software"), to
 # the above copyright notice appear in all copies and that both that  # deal in the Software without restriction, including without limitation the
 # copyright notice and this permission notice appear in supporting  # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 # documentation, and that the name of M.I.T. not be used in advertising or  # sell copies of the Software, and to permit persons to whom the Software is
 # publicity pertaining to distribution of the software without specific,  # furnished to do so, subject to the following conditions:
 # written prior permission.  M.I.T. makes no representations about the  
 # suitability of this software for any purpose.  It is provided "as is"  
 # without express or implied warranty.  
 #  #
   # The above copyright notice and this permission notice shall be included in
   # all copies or substantial portions of the Software.
   #
   # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
   # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
   # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
   # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
   #
   # Except as contained in this notice, the name of the X Consortium shall not
   # be used in advertising or otherwise to promote the sale, use or other deal-
   # ings in this Software without prior written authorization from the X Consor-
   # tium.
   #
   #
   # FSF changes to this file are in the public domain.
   #
 # Calling this script install-sh is preferred over install.sh, to prevent  # Calling this script install-sh is preferred over install.sh, to prevent
 # `make' implicit rules from creating a file called install from it  # 'make' implicit rules from creating a file called install from it
 # when there is no Makefile.  # when there is no Makefile.
 #  #
 # This script is compatible with the BSD install script, but was written  # This script is compatible with the BSD install script, but was written
 # from scratch.  It can only install one file at a time, a restriction  # from scratch.
 # shared with many OS's install programs.  
   
   tab='   '
   nl='
   '
   IFS=" $tab$nl"
   
 # set DOITPROG to echo to test this script  # Set DOITPROG to "echo" to test this script.
   
 # Don't use :- since 4.3BSD and earlier shells don't like it.  doit=${DOITPROG-}
 doit="${DOITPROG-}"  doit_exec=${doit:-exec}
   
   # Put in absolute file names if you don't have them in your path;
   # or use environment vars.
   
 # put in absolute paths if you don't have them in your path; or use env. vars.  chgrpprog=${CHGRPPROG-chgrp}
   chmodprog=${CHMODPROG-chmod}
   chownprog=${CHOWNPROG-chown}
   cmpprog=${CMPPROG-cmp}
   cpprog=${CPPROG-cp}
   mkdirprog=${MKDIRPROG-mkdir}
   mvprog=${MVPROG-mv}
   rmprog=${RMPROG-rm}
   stripprog=${STRIPPROG-strip}
   
 mvprog="${MVPROG-mv}"  posix_mkdir=
 cpprog="${CPPROG-cp}"  
 chmodprog="${CHMODPROG-chmod}"  
 chownprog="${CHOWNPROG-chown}"  
 chgrpprog="${CHGRPPROG-chgrp}"  
 stripprog="${STRIPPROG-strip}"  
 rmprog="${RMPROG-rm}"  
 mkdirprog="${MKDIRPROG-mkdir}"  
   
 transformbasename=""  # Desired mode of installed file.
 transform_arg=""  mode=0755
 instcmd="$mvprog"  
 chmodcmd="$chmodprog 0755"  chgrpcmd=
 chowncmd=""  chmodcmd=$chmodprog
 chgrpcmd=""  chowncmd=
 stripcmd=""  mvcmd=$mvprog
 rmcmd="$rmprog -f"  rmcmd="$rmprog -f"
 mvcmd="$mvprog"  stripcmd=
 src=""  
 dst=""  
 dir_arg=""  
   
 while [ x"$1" != x ]; do  src=
     case $1 in  dst=
         -c) instcmd="$cpprog"  dir_arg=
             shift  dst_arg=
             continue;;  
   
         -d) dir_arg=true  copy_on_change=false
             shift  is_target_a_directory=possibly
             continue;;  
   
         -m) chmodcmd="$chmodprog $2"  usage="\
             shift  Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
             shift     or: $0 [OPTION]... SRCFILES... DIRECTORY
             continue;;     or: $0 [OPTION]... -t DIRECTORY SRCFILES...
      or: $0 [OPTION]... -d DIRECTORIES...
   
         -o) chowncmd="$chownprog $2"  In the 1st form, copy SRCFILE to DSTFILE.
             shift  In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
             shift  In the 4th, create DIRECTORIES.
             continue;;  
   
         -g) chgrpcmd="$chgrpprog $2"  Options:
             shift       --help     display this help and exit.
             shift       --version  display version info and exit.
             continue;;  
   
         -s) stripcmd="$stripprog"    -c            (ignored)
             shift    -C            install only if different (preserve the last data modification time)
             continue;;    -d            create directories instead of installing files.
     -g GROUP      $chgrpprog installed files to GROUP.
     -m MODE       $chmodprog installed files to MODE.
     -o USER       $chownprog installed files to USER.
     -s            $stripprog installed files.
     -t DIRECTORY  install into DIRECTORY.
     -T            report an error if DSTFILE is a directory.
   
         -t=*) transformarg=`echo $1 | sed 's/-t=//'`  Environment variables override the default commands:
             shift    CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
             continue;;    RMPROG STRIPPROG
   "
   
         -b=*) transformbasename=`echo $1 | sed 's/-b=//'`  while test $# -ne 0; do
             shift    case $1 in
             continue;;      -c) ;;
   
         *)  if [ x"$src" = x ]      -C) copy_on_change=true;;
             then  
                 src=$1      -d) dir_arg=true;;
             else  
                 # this colon is to work around a 386BSD /bin/sh bug      -g) chgrpcmd="$chgrpprog $2"
                 :          shift;;
                 dst=$1  
             fi      --help) echo "$usage"; exit $?;;
             shift  
             continue;;      -m) mode=$2
     esac          case $mode in
             *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
               echo "$0: invalid mode: $mode" >&2
               exit 1;;
           esac
           shift;;
   
       -o) chowncmd="$chownprog $2"
           shift;;
   
       -s) stripcmd=$stripprog;;
   
       -t)
           is_target_a_directory=always
           dst_arg=$2
           # Protect names problematic for 'test' and other utilities.
           case $dst_arg in
             -* | [=\(\)!]) dst_arg=./$dst_arg;;
           esac
           shift;;
   
       -T) is_target_a_directory=never;;
   
       --version) echo "$0 $scriptversion"; exit $?;;
   
       --) shift
           break;;
   
       -*) echo "$0: invalid option: $1" >&2
           exit 1;;
   
       *)  break;;
     esac
     shift
 done  done
   
 if [ x"$src" = x ]  # We allow the use of options -d and -T together, by making -d
 then  # take the precedence; this is for compatibility with GNU install.
         echo "install:  no input file specified"  
         exit 1  if test -n "$dir_arg"; then
 else    if test -n "$dst_arg"; then
         true      echo "$0: target directory not allowed when installing a directory." >&2
       exit 1
     fi
 fi  fi
   
 if [ x"$dir_arg" != x ]; then  if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
         dst=$src    # When -d is used, all remaining arguments are directories to create.
         src=""    # When -t is used, the destination is already specified.
     # Otherwise, the last argument is the destination.  Remove it from $@.
         if [ -d $dst ]; then    for arg
                 instcmd=:    do
                 chmodcmd=""      if test -n "$dst_arg"; then
         else        # $@ is not empty: it contains at least $arg.
                 instcmd=mkdir        set fnord "$@" "$dst_arg"
         fi        shift # fnord
 else      fi
       shift # arg
       dst_arg=$arg
       # Protect names problematic for 'test' and other utilities.
       case $dst_arg in
         -* | [=\(\)!]) dst_arg=./$dst_arg;;
       esac
     done
   fi
   
 # Waiting for this to be detected by the "$instcmd $src $dsttmp" command  if test $# -eq 0; then
 # might cause directories to be created, which would be especially bad    if test -z "$dir_arg"; then
 # if $src (and thus $dsttmp) contains '*'.      echo "$0: no input file specified." >&2
       exit 1
     fi
     # It's OK to call 'install-sh -d' without argument.
     # This can happen when creating conditional directories.
     exit 0
   fi
   
         if [ -f $src -o -d $src ]  if test -z "$dir_arg"; then
         then    if test $# -gt 1 || test "$is_target_a_directory" = always; then
                 true      if test ! -d "$dst_arg"; then
         else        echo "$0: $dst_arg: Is not a directory." >&2
                 echo "install:  $src does not exist"        exit 1
                 exit 1      fi
         fi    fi
   fi
         if [ x"$dst" = x ]  
         then  
                 echo "install:  no destination specified"  
                 exit 1  
         else  
                 true  
         fi  
   
 # If destination is a directory, append the input filename; if your system  if test -z "$dir_arg"; then
 # does not like double slashes in filenames, you may need to add some logic    do_exit='(exit $ret); exit $ret'
     trap "ret=129; $do_exit" 1
     trap "ret=130; $do_exit" 2
     trap "ret=141; $do_exit" 13
     trap "ret=143; $do_exit" 15
   
         if [ -d $dst ]    # Set umask so as not to create temps with too-generous modes.
         then    # However, 'strip' requires both read and write access to temps.
                 dst="$dst"/`basename $src`    case $mode in
         else      # Optimize common cases.
                 true      *644) cp_umask=133;;
         fi      *755) cp_umask=22;;
   
       *[0-7])
         if test -z "$stripcmd"; then
           u_plus_rw=
         else
           u_plus_rw='% 200'
         fi
         cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
       *)
         if test -z "$stripcmd"; then
           u_plus_rw=
         else
           u_plus_rw=,u+rw
         fi
         cp_umask=$mode$u_plus_rw;;
     esac
 fi  fi
   
 ## this sed command emulates the dirname command  for src
 dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`  do
     # Protect names problematic for 'test' and other utilities.
     case $src in
       -* | [=\(\)!]) src=./$src;;
     esac
   
 # Make sure that the destination directory exists.    if test -n "$dir_arg"; then
 #  this part is taken from Noah Friedman's mkinstalldirs script      dst=$src
       dstdir=$dst
       test -d "$dstdir"
       dstdir_status=$?
     else
   
 # Skip lots of stat calls in the usual case.      # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
 if [ ! -d "$dstdir" ]; then      # might cause directories to be created, which would be especially bad
 defaultIFS='      # if $src (and thus $dsttmp) contains '*'.
 '      if test ! -f "$src" && test ! -d "$src"; then
 IFS="${IFS-${defaultIFS}}"        echo "$0: $src does not exist." >&2
         exit 1
       fi
   
 oIFS="${IFS}"      if test -z "$dst_arg"; then
 # Some sh's can't handle IFS=/ for some reason.        echo "$0: no destination specified." >&2
 IFS='%'        exit 1
 set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`      fi
 IFS="${oIFS}"      dst=$dst_arg
   
 pathcomp=''      # If destination is a directory, append the input filename; won't work
       # if double slashes aren't ignored.
       if test -d "$dst"; then
         if test "$is_target_a_directory" = never; then
           echo "$0: $dst_arg: Is a directory" >&2
           exit 1
         fi
         dstdir=$dst
         dst=$dstdir/`basename "$src"`
         dstdir_status=0
       else
         dstdir=`dirname "$dst"`
         test -d "$dstdir"
         dstdir_status=$?
       fi
     fi
   
 while [ $# -ne 0 ] ; do    obsolete_mkdir_used=false
         pathcomp="${pathcomp}${1}"  
         shift  
   
         if [ ! -d "${pathcomp}" ] ;    if test $dstdir_status != 0; then
         then      case $posix_mkdir in
                 $mkdirprog "${pathcomp}"        '')
         else          # Create intermediate dirs using mode 755 as modified by the umask.
                 true          # This is like FreeBSD 'install' as of 1997-10-28.
         fi          umask=`umask`
           case $stripcmd.$umask in
             # Optimize common cases.
             *[2367][2367]) mkdir_umask=$umask;;
             .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
   
         pathcomp="${pathcomp}/"            *[0-7])
 done              mkdir_umask=`expr $umask + 22 \
 fi                - $umask % 100 % 40 + $umask % 20 \
                 - $umask % 10 % 4 + $umask % 2
               `;;
             *) mkdir_umask=$umask,go-w;;
           esac
   
 if [ x"$dir_arg" != x ]          # With -d, create the new directory with the user-specified mode.
 then          # Otherwise, rely on $mkdir_umask.
         $doit $instcmd $dst &&          if test -n "$dir_arg"; then
             mkdir_mode=-m$mode
           else
             mkdir_mode=
           fi
   
         if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&          posix_mkdir=false
         if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&          case $umask in
         if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&            *[123567][0-7][0-7])
         if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi              # POSIX mkdir -p sets u+wx bits regardless of umask, which
 else              # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
               ;;
             *)
               tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
               trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
   
 # If we're going to rename the final executable, determine the name now.              if (umask $mkdir_umask &&
                   exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
               then
                 if test -z "$dir_arg" || {
                      # Check for POSIX incompatibilities with -m.
                      # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
                      # other-writable bit of parent directory when it shouldn't.
                      # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
                      ls_ld_tmpdir=`ls -ld "$tmpdir"`
                      case $ls_ld_tmpdir in
                        d????-?r-*) different_mode=700;;
                        d????-?--*) different_mode=755;;
                        *) false;;
                      esac &&
                      $mkdirprog -m$different_mode -p -- "$tmpdir" && {
                        ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
                        test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
                      }
                    }
                 then posix_mkdir=:
                 fi
                 rmdir "$tmpdir/d" "$tmpdir"
               else
                 # Remove any dirs left behind by ancient mkdir implementations.
                 rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
               fi
               trap '' 0;;
           esac;;
       esac
   
         if [ x"$transformarg" = x ]      if
         then        $posix_mkdir && (
                 dstfile=`basename $dst`          umask $mkdir_umask &&
         else          $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
                 dstfile=`basename $dst $transformbasename |        )
                         sed $transformarg`$transformbasename      then :
         fi      else
   
 # don't allow the sed command to completely eliminate the filename        # The umask is ridiculous, or mkdir does not conform to POSIX,
         # or it failed possibly due to a race condition.  Create the
         # directory the slow way, step by step, checking for races as we go.
   
         if [ x"$dstfile" = x ]        case $dstdir in
         then          /*) prefix='/';;
                 dstfile=`basename $dst`          [-=\(\)!]*) prefix='./';;
         else          *)  prefix='';;
                 true        esac
         fi  
   
 # Make a temp file name in the proper directory.        oIFS=$IFS
         IFS=/
         set -f
         set fnord $dstdir
         shift
         set +f
         IFS=$oIFS
   
         dsttmp=$dstdir/#inst.$$#        prefixes=
   
 # Move or copy the file name to the temp name        for d
         do
           test X"$d" = X && continue
   
         $doit $instcmd $src $dsttmp &&          prefix=$prefix$d
           if test -d "$prefix"; then
             prefixes=
           else
             if $posix_mkdir; then
               (umask=$mkdir_umask &&
                $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
               # Don't fail if two instances are running concurrently.
               test -d "$prefix" || exit 1
             else
               case $prefix in
                 *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
                 *) qprefix=$prefix;;
               esac
               prefixes="$prefixes '$qprefix'"
             fi
           fi
           prefix=$prefix/
         done
   
         trap "rm -f ${dsttmp}" 0 &&        if test -n "$prefixes"; then
           # Don't fail if two instances are running concurrently.
           (umask $mkdir_umask &&
            eval "\$doit_exec \$mkdirprog $prefixes") ||
             test -d "$dstdir" || exit 1
           obsolete_mkdir_used=true
         fi
       fi
     fi
   
 # and set any options; do chmod last to preserve setuid bits    if test -n "$dir_arg"; then
       { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
       { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
       { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
         test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
     else
   
 # If any of these fail, we abort the whole thing.  If we want to      # Make a couple of temp file names in the proper directory.
 # ignore errors from any of these, just make sure not to ignore      dsttmp=$dstdir/_inst.$$_
 # errors from the above "$doit $instcmd $src $dsttmp" command.      rmtmp=$dstdir/_rm.$$_
   
         if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&      # Trap to clean up those temp files at exit.
         if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&      trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
         if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&  
         if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&  
   
 # Now rename the file to the real destination.      # Copy the file name to the temp name.
       (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
   
         $doit $rmcmd -f $dstdir/$dstfile &&      # and set any options; do chmod last to preserve setuid bits.
         $doit $mvcmd $dsttmp $dstdir/$dstfile      #
       # If any of these fail, we abort the whole thing.  If we want to
       # ignore errors from any of these, just make sure not to ignore
       # errors from the above "$doit $cpprog $src $dsttmp" command.
       #
       { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
       { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
       { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
       { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
   
 fi &&      # If -C, don't bother to copy if it wouldn't change the file.
       if $copy_on_change &&
          old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
          new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
          set -f &&
          set X $old && old=:$2:$4:$5:$6 &&
          set X $new && new=:$2:$4:$5:$6 &&
          set +f &&
          test "$old" = "$new" &&
          $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
       then
         rm -f "$dsttmp"
       else
         # Rename the file to the real destination.
         $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
   
         # The rename failed, perhaps because mv can't rename something else
         # to itself, or perhaps because mv is so ancient that it does not
         # support -f.
         {
           # Now remove or move aside any old file at destination location.
           # We try this two ways since rm can't unlink itself on some
           # systems and the destination file might be busy for other
           # reasons.  In this case, the final cleanup might fail but the new
           # file should still install successfully.
           {
             test ! -f "$dst" ||
             $doit $rmcmd -f "$dst" 2>/dev/null ||
             { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
               { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
             } ||
             { echo "$0: cannot unlink or rename $dst" >&2
               (exit 1); exit 1
             }
           } &&
   
 exit 0          # Now rename the file to the real destination.
           $doit $mvcmd "$dsttmp" "$dst"
         }
       fi || exit 1
   
       trap '' 0
     fi
   done
   
   # Local variables:
   # eval: (add-hook 'write-file-hooks 'time-stamp)
   # time-stamp-start: "scriptversion="
   # time-stamp-format: "%:y-%02m-%02d.%02H"
   # time-stamp-time-zone: "UTC"
   # time-stamp-end: "; # UTC"
   # End:

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>