Blame build-aux/install-sh

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