Blame install-sh

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