scripts/install-sh
author "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
Mon Apr 16 15:25:36 2012 +0200 (2012-04-16)
changeset 2941 13e40098fffc
permissions -rwxr-xr-x
cc/gcc: update Linaro GCC revisions to 2012.04

Update Linaro GCC with the latest available revisions.

The 4.7 revision is also released, but the infrastructure is not yet ready for
it in CT-NG.

Signed-off-by: "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
yann@2834
     1
#!/bin/sh
yann@2834
     2
# install - install a program, script, or datafile
yann@2834
     3
yann@2834
     4
scriptversion=2009-04-28.21; # UTC
yann@2834
     5
yann@2834
     6
# This originates from X11R5 (mit/util/scripts/install.sh), which was
yann@2834
     7
# later released in X11R6 (xc/config/util/install.sh) with the
yann@2834
     8
# following copyright and license.
yann@2834
     9
#
yann@2834
    10
# Copyright (C) 1994 X Consortium
yann@2834
    11
#
yann@2834
    12
# Permission is hereby granted, free of charge, to any person obtaining a copy
yann@2834
    13
# of this software and associated documentation files (the "Software"), to
yann@2834
    14
# deal in the Software without restriction, including without limitation the
yann@2834
    15
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
yann@2834
    16
# sell copies of the Software, and to permit persons to whom the Software is
yann@2834
    17
# furnished to do so, subject to the following conditions:
yann@2834
    18
#
yann@2834
    19
# The above copyright notice and this permission notice shall be included in
yann@2834
    20
# all copies or substantial portions of the Software.
yann@2834
    21
#
yann@2834
    22
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
yann@2834
    23
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
yann@2834
    24
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
yann@2834
    25
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
yann@2834
    26
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
yann@2834
    27
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
yann@2834
    28
#
yann@2834
    29
# Except as contained in this notice, the name of the X Consortium shall not
yann@2834
    30
# be used in advertising or otherwise to promote the sale, use or other deal-
yann@2834
    31
# ings in this Software without prior written authorization from the X Consor-
yann@2834
    32
# tium.
yann@2834
    33
#
yann@2834
    34
#
yann@2834
    35
# FSF changes to this file are in the public domain.
yann@2834
    36
#
yann@2834
    37
# Calling this script install-sh is preferred over install.sh, to prevent
yann@2834
    38
# `make' implicit rules from creating a file called install from it
yann@2834
    39
# when there is no Makefile.
yann@2834
    40
#
yann@2834
    41
# This script is compatible with the BSD install script, but was written
yann@2834
    42
# from scratch.
yann@2834
    43
yann@2834
    44
nl='
yann@2834
    45
'
yann@2834
    46
IFS=" ""	$nl"
yann@2834
    47
yann@2834
    48
# set DOITPROG to echo to test this script
yann@2834
    49
yann@2834
    50
# Don't use :- since 4.3BSD and earlier shells don't like it.
yann@2834
    51
doit=${DOITPROG-}
yann@2834
    52
if test -z "$doit"; then
yann@2834
    53
  doit_exec=exec
yann@2834
    54
else
yann@2834
    55
  doit_exec=$doit
yann@2834
    56
fi
yann@2834
    57
yann@2834
    58
# Put in absolute file names if you don't have them in your path;
yann@2834
    59
# or use environment vars.
yann@2834
    60
yann@2834
    61
chgrpprog=${CHGRPPROG-chgrp}
yann@2834
    62
chmodprog=${CHMODPROG-chmod}
yann@2834
    63
chownprog=${CHOWNPROG-chown}
yann@2834
    64
cmpprog=${CMPPROG-cmp}
yann@2834
    65
cpprog=${CPPROG-cp}
yann@2834
    66
mkdirprog=${MKDIRPROG-mkdir}
yann@2834
    67
mvprog=${MVPROG-mv}
yann@2834
    68
rmprog=${RMPROG-rm}
yann@2834
    69
stripprog=${STRIPPROG-strip}
yann@2834
    70
yann@2834
    71
posix_glob='?'
yann@2834
    72
initialize_posix_glob='
yann@2834
    73
  test "$posix_glob" != "?" || {
yann@2834
    74
    if (set -f) 2>/dev/null; then
yann@2834
    75
      posix_glob=
yann@2834
    76
    else
yann@2834
    77
      posix_glob=:
yann@2834
    78
    fi
yann@2834
    79
  }
yann@2834
    80
'
yann@2834
    81
yann@2834
    82
posix_mkdir=
yann@2834
    83
yann@2834
    84
# Desired mode of installed file.
yann@2834
    85
mode=0755
yann@2834
    86
yann@2834
    87
chgrpcmd=
yann@2834
    88
chmodcmd=$chmodprog
yann@2834
    89
chowncmd=
yann@2834
    90
mvcmd=$mvprog
yann@2834
    91
rmcmd="$rmprog -f"
yann@2834
    92
stripcmd=
yann@2834
    93
yann@2834
    94
src=
yann@2834
    95
dst=
yann@2834
    96
dir_arg=
yann@2834
    97
dst_arg=
yann@2834
    98
yann@2834
    99
copy_on_change=false
yann@2834
   100
no_target_directory=
yann@2834
   101
yann@2834
   102
usage="\
yann@2834
   103
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
yann@2834
   104
   or: $0 [OPTION]... SRCFILES... DIRECTORY
yann@2834
   105
   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
yann@2834
   106
   or: $0 [OPTION]... -d DIRECTORIES...
yann@2834
   107
yann@2834
   108
In the 1st form, copy SRCFILE to DSTFILE.
yann@2834
   109
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
yann@2834
   110
In the 4th, create DIRECTORIES.
yann@2834
   111
yann@2834
   112
Options:
yann@2834
   113
     --help     display this help and exit.
yann@2834
   114
     --version  display version info and exit.
yann@2834
   115
yann@2834
   116
  -c            (ignored)
yann@2834
   117
  -C            install only if different (preserve the last data modification time)
yann@2834
   118
  -d            create directories instead of installing files.
yann@2834
   119
  -g GROUP      $chgrpprog installed files to GROUP.
yann@2834
   120
  -m MODE       $chmodprog installed files to MODE.
yann@2834
   121
  -o USER       $chownprog installed files to USER.
yann@2834
   122
  -s            $stripprog installed files.
yann@2834
   123
  -t DIRECTORY  install into DIRECTORY.
yann@2834
   124
  -T            report an error if DSTFILE is a directory.
yann@2834
   125
yann@2834
   126
Environment variables override the default commands:
yann@2834
   127
  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
yann@2834
   128
  RMPROG STRIPPROG
yann@2834
   129
"
yann@2834
   130
yann@2834
   131
while test $# -ne 0; do
yann@2834
   132
  case $1 in
yann@2834
   133
    -c) ;;
yann@2834
   134
yann@2834
   135
    -C) copy_on_change=true;;
yann@2834
   136
yann@2834
   137
    -d) dir_arg=true;;
yann@2834
   138
yann@2834
   139
    -g) chgrpcmd="$chgrpprog $2"
yann@2834
   140
	shift;;
yann@2834
   141
yann@2834
   142
    --help) echo "$usage"; exit $?;;
yann@2834
   143
yann@2834
   144
    -m) mode=$2
yann@2834
   145
	case $mode in
yann@2834
   146
	  *' '* | *'	'* | *'
yann@2834
   147
'*	  | *'*'* | *'?'* | *'['*)
yann@2834
   148
	    echo "$0: invalid mode: $mode" >&2
yann@2834
   149
	    exit 1;;
yann@2834
   150
	esac
yann@2834
   151
	shift;;
yann@2834
   152
yann@2834
   153
    -o) chowncmd="$chownprog $2"
yann@2834
   154
	shift;;
yann@2834
   155
yann@2834
   156
    -s) stripcmd=$stripprog;;
yann@2834
   157
yann@2834
   158
    -t) dst_arg=$2
yann@2834
   159
	shift;;
yann@2834
   160
yann@2834
   161
    -T) no_target_directory=true;;
yann@2834
   162
yann@2834
   163
    --version) echo "$0 $scriptversion"; exit $?;;
yann@2834
   164
yann@2834
   165
    --)	shift
yann@2834
   166
	break;;
yann@2834
   167
yann@2834
   168
    -*)	echo "$0: invalid option: $1" >&2
yann@2834
   169
	exit 1;;
yann@2834
   170
yann@2834
   171
    *)  break;;
yann@2834
   172
  esac
yann@2834
   173
  shift
yann@2834
   174
done
yann@2834
   175
yann@2834
   176
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
yann@2834
   177
  # When -d is used, all remaining arguments are directories to create.
yann@2834
   178
  # When -t is used, the destination is already specified.
yann@2834
   179
  # Otherwise, the last argument is the destination.  Remove it from $@.
yann@2834
   180
  for arg
yann@2834
   181
  do
yann@2834
   182
    if test -n "$dst_arg"; then
yann@2834
   183
      # $@ is not empty: it contains at least $arg.
yann@2834
   184
      set fnord "$@" "$dst_arg"
yann@2834
   185
      shift # fnord
yann@2834
   186
    fi
yann@2834
   187
    shift # arg
yann@2834
   188
    dst_arg=$arg
yann@2834
   189
  done
yann@2834
   190
fi
yann@2834
   191
yann@2834
   192
if test $# -eq 0; then
yann@2834
   193
  if test -z "$dir_arg"; then
yann@2834
   194
    echo "$0: no input file specified." >&2
yann@2834
   195
    exit 1
yann@2834
   196
  fi
yann@2834
   197
  # It's OK to call `install-sh -d' without argument.
yann@2834
   198
  # This can happen when creating conditional directories.
yann@2834
   199
  exit 0
yann@2834
   200
fi
yann@2834
   201
yann@2834
   202
if test -z "$dir_arg"; then
yann@2834
   203
  trap '(exit $?); exit' 1 2 13 15
yann@2834
   204
yann@2834
   205
  # Set umask so as not to create temps with too-generous modes.
yann@2834
   206
  # However, 'strip' requires both read and write access to temps.
yann@2834
   207
  case $mode in
yann@2834
   208
    # Optimize common cases.
yann@2834
   209
    *644) cp_umask=133;;
yann@2834
   210
    *755) cp_umask=22;;
yann@2834
   211
yann@2834
   212
    *[0-7])
yann@2834
   213
      if test -z "$stripcmd"; then
yann@2834
   214
	u_plus_rw=
yann@2834
   215
      else
yann@2834
   216
	u_plus_rw='% 200'
yann@2834
   217
      fi
yann@2834
   218
      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
yann@2834
   219
    *)
yann@2834
   220
      if test -z "$stripcmd"; then
yann@2834
   221
	u_plus_rw=
yann@2834
   222
      else
yann@2834
   223
	u_plus_rw=,u+rw
yann@2834
   224
      fi
yann@2834
   225
      cp_umask=$mode$u_plus_rw;;
yann@2834
   226
  esac
yann@2834
   227
fi
yann@2834
   228
yann@2834
   229
for src
yann@2834
   230
do
yann@2834
   231
  # Protect names starting with `-'.
yann@2834
   232
  case $src in
yann@2834
   233
    -*) src=./$src;;
yann@2834
   234
  esac
yann@2834
   235
yann@2834
   236
  if test -n "$dir_arg"; then
yann@2834
   237
    dst=$src
yann@2834
   238
    dstdir=$dst
yann@2834
   239
    test -d "$dstdir"
yann@2834
   240
    dstdir_status=$?
yann@2834
   241
  else
yann@2834
   242
yann@2834
   243
    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
yann@2834
   244
    # might cause directories to be created, which would be especially bad
yann@2834
   245
    # if $src (and thus $dsttmp) contains '*'.
yann@2834
   246
    if test ! -f "$src" && test ! -d "$src"; then
yann@2834
   247
      echo "$0: $src does not exist." >&2
yann@2834
   248
      exit 1
yann@2834
   249
    fi
yann@2834
   250
yann@2834
   251
    if test -z "$dst_arg"; then
yann@2834
   252
      echo "$0: no destination specified." >&2
yann@2834
   253
      exit 1
yann@2834
   254
    fi
yann@2834
   255
yann@2834
   256
    dst=$dst_arg
yann@2834
   257
    # Protect names starting with `-'.
yann@2834
   258
    case $dst in
yann@2834
   259
      -*) dst=./$dst;;
yann@2834
   260
    esac
yann@2834
   261
yann@2834
   262
    # If destination is a directory, append the input filename; won't work
yann@2834
   263
    # if double slashes aren't ignored.
yann@2834
   264
    if test -d "$dst"; then
yann@2834
   265
      if test -n "$no_target_directory"; then
yann@2834
   266
	echo "$0: $dst_arg: Is a directory" >&2
yann@2834
   267
	exit 1
yann@2834
   268
      fi
yann@2834
   269
      dstdir=$dst
yann@2834
   270
      dst=$dstdir/`basename "$src"`
yann@2834
   271
      dstdir_status=0
yann@2834
   272
    else
yann@2834
   273
      # Prefer dirname, but fall back on a substitute if dirname fails.
yann@2834
   274
      dstdir=`
yann@2834
   275
	(dirname "$dst") 2>/dev/null ||
yann@2834
   276
	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
yann@2834
   277
	     X"$dst" : 'X\(//\)[^/]' \| \
yann@2834
   278
	     X"$dst" : 'X\(//\)$' \| \
yann@2834
   279
	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
yann@2834
   280
	echo X"$dst" |
yann@2834
   281
	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
yann@2834
   282
		   s//\1/
yann@2834
   283
		   q
yann@2834
   284
		 }
yann@2834
   285
		 /^X\(\/\/\)[^/].*/{
yann@2834
   286
		   s//\1/
yann@2834
   287
		   q
yann@2834
   288
		 }
yann@2834
   289
		 /^X\(\/\/\)$/{
yann@2834
   290
		   s//\1/
yann@2834
   291
		   q
yann@2834
   292
		 }
yann@2834
   293
		 /^X\(\/\).*/{
yann@2834
   294
		   s//\1/
yann@2834
   295
		   q
yann@2834
   296
		 }
yann@2834
   297
		 s/.*/./; q'
yann@2834
   298
      `
yann@2834
   299
yann@2834
   300
      test -d "$dstdir"
yann@2834
   301
      dstdir_status=$?
yann@2834
   302
    fi
yann@2834
   303
  fi
yann@2834
   304
yann@2834
   305
  obsolete_mkdir_used=false
yann@2834
   306
yann@2834
   307
  if test $dstdir_status != 0; then
yann@2834
   308
    case $posix_mkdir in
yann@2834
   309
      '')
yann@2834
   310
	# Create intermediate dirs using mode 755 as modified by the umask.
yann@2834
   311
	# This is like FreeBSD 'install' as of 1997-10-28.
yann@2834
   312
	umask=`umask`
yann@2834
   313
	case $stripcmd.$umask in
yann@2834
   314
	  # Optimize common cases.
yann@2834
   315
	  *[2367][2367]) mkdir_umask=$umask;;
yann@2834
   316
	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
yann@2834
   317
yann@2834
   318
	  *[0-7])
yann@2834
   319
	    mkdir_umask=`expr $umask + 22 \
yann@2834
   320
	      - $umask % 100 % 40 + $umask % 20 \
yann@2834
   321
	      - $umask % 10 % 4 + $umask % 2
yann@2834
   322
	    `;;
yann@2834
   323
	  *) mkdir_umask=$umask,go-w;;
yann@2834
   324
	esac
yann@2834
   325
yann@2834
   326
	# With -d, create the new directory with the user-specified mode.
yann@2834
   327
	# Otherwise, rely on $mkdir_umask.
yann@2834
   328
	if test -n "$dir_arg"; then
yann@2834
   329
	  mkdir_mode=-m$mode
yann@2834
   330
	else
yann@2834
   331
	  mkdir_mode=
yann@2834
   332
	fi
yann@2834
   333
yann@2834
   334
	posix_mkdir=false
yann@2834
   335
	case $umask in
yann@2834
   336
	  *[123567][0-7][0-7])
yann@2834
   337
	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
yann@2834
   338
	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
yann@2834
   339
	    ;;
yann@2834
   340
	  *)
yann@2834
   341
	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
yann@2834
   342
	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
yann@2834
   343
yann@2834
   344
	    if (umask $mkdir_umask &&
yann@2834
   345
		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
yann@2834
   346
	    then
yann@2834
   347
	      if test -z "$dir_arg" || {
yann@2834
   348
		   # Check for POSIX incompatibilities with -m.
yann@2834
   349
		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
yann@2834
   350
		   # other-writeable bit of parent directory when it shouldn't.
yann@2834
   351
		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
yann@2834
   352
		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
yann@2834
   353
		   case $ls_ld_tmpdir in
yann@2834
   354
		     d????-?r-*) different_mode=700;;
yann@2834
   355
		     d????-?--*) different_mode=755;;
yann@2834
   356
		     *) false;;
yann@2834
   357
		   esac &&
yann@2834
   358
		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
yann@2834
   359
		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
yann@2834
   360
		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
yann@2834
   361
		   }
yann@2834
   362
		 }
yann@2834
   363
	      then posix_mkdir=:
yann@2834
   364
	      fi
yann@2834
   365
	      rmdir "$tmpdir/d" "$tmpdir"
yann@2834
   366
	    else
yann@2834
   367
	      # Remove any dirs left behind by ancient mkdir implementations.
yann@2834
   368
	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
yann@2834
   369
	    fi
yann@2834
   370
	    trap '' 0;;
yann@2834
   371
	esac;;
yann@2834
   372
    esac
yann@2834
   373
yann@2834
   374
    if
yann@2834
   375
      $posix_mkdir && (
yann@2834
   376
	umask $mkdir_umask &&
yann@2834
   377
	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
yann@2834
   378
      )
yann@2834
   379
    then :
yann@2834
   380
    else
yann@2834
   381
yann@2834
   382
      # The umask is ridiculous, or mkdir does not conform to POSIX,
yann@2834
   383
      # or it failed possibly due to a race condition.  Create the
yann@2834
   384
      # directory the slow way, step by step, checking for races as we go.
yann@2834
   385
yann@2834
   386
      case $dstdir in
yann@2834
   387
	/*) prefix='/';;
yann@2834
   388
	-*) prefix='./';;
yann@2834
   389
	*)  prefix='';;
yann@2834
   390
      esac
yann@2834
   391
yann@2834
   392
      eval "$initialize_posix_glob"
yann@2834
   393
yann@2834
   394
      oIFS=$IFS
yann@2834
   395
      IFS=/
yann@2834
   396
      $posix_glob set -f
yann@2834
   397
      set fnord $dstdir
yann@2834
   398
      shift
yann@2834
   399
      $posix_glob set +f
yann@2834
   400
      IFS=$oIFS
yann@2834
   401
yann@2834
   402
      prefixes=
yann@2834
   403
yann@2834
   404
      for d
yann@2834
   405
      do
yann@2834
   406
	test -z "$d" && continue
yann@2834
   407
yann@2834
   408
	prefix=$prefix$d
yann@2834
   409
	if test -d "$prefix"; then
yann@2834
   410
	  prefixes=
yann@2834
   411
	else
yann@2834
   412
	  if $posix_mkdir; then
yann@2834
   413
	    (umask=$mkdir_umask &&
yann@2834
   414
	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
yann@2834
   415
	    # Don't fail if two instances are running concurrently.
yann@2834
   416
	    test -d "$prefix" || exit 1
yann@2834
   417
	  else
yann@2834
   418
	    case $prefix in
yann@2834
   419
	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
yann@2834
   420
	      *) qprefix=$prefix;;
yann@2834
   421
	    esac
yann@2834
   422
	    prefixes="$prefixes '$qprefix'"
yann@2834
   423
	  fi
yann@2834
   424
	fi
yann@2834
   425
	prefix=$prefix/
yann@2834
   426
      done
yann@2834
   427
yann@2834
   428
      if test -n "$prefixes"; then
yann@2834
   429
	# Don't fail if two instances are running concurrently.
yann@2834
   430
	(umask $mkdir_umask &&
yann@2834
   431
	 eval "\$doit_exec \$mkdirprog $prefixes") ||
yann@2834
   432
	  test -d "$dstdir" || exit 1
yann@2834
   433
	obsolete_mkdir_used=true
yann@2834
   434
      fi
yann@2834
   435
    fi
yann@2834
   436
  fi
yann@2834
   437
yann@2834
   438
  if test -n "$dir_arg"; then
yann@2834
   439
    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
yann@2834
   440
    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
yann@2834
   441
    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
yann@2834
   442
      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
yann@2834
   443
  else
yann@2834
   444
yann@2834
   445
    # Make a couple of temp file names in the proper directory.
yann@2834
   446
    dsttmp=$dstdir/_inst.$$_
yann@2834
   447
    rmtmp=$dstdir/_rm.$$_
yann@2834
   448
yann@2834
   449
    # Trap to clean up those temp files at exit.
yann@2834
   450
    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
yann@2834
   451
yann@2834
   452
    # Copy the file name to the temp name.
yann@2834
   453
    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
yann@2834
   454
yann@2834
   455
    # and set any options; do chmod last to preserve setuid bits.
yann@2834
   456
    #
yann@2834
   457
    # If any of these fail, we abort the whole thing.  If we want to
yann@2834
   458
    # ignore errors from any of these, just make sure not to ignore
yann@2834
   459
    # errors from the above "$doit $cpprog $src $dsttmp" command.
yann@2834
   460
    #
yann@2834
   461
    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
yann@2834
   462
    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
yann@2834
   463
    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
yann@2834
   464
    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
yann@2834
   465
yann@2834
   466
    # If -C, don't bother to copy if it wouldn't change the file.
yann@2834
   467
    if $copy_on_change &&
yann@2834
   468
       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
yann@2834
   469
       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
yann@2834
   470
yann@2834
   471
       eval "$initialize_posix_glob" &&
yann@2834
   472
       $posix_glob set -f &&
yann@2834
   473
       set X $old && old=:$2:$4:$5:$6 &&
yann@2834
   474
       set X $new && new=:$2:$4:$5:$6 &&
yann@2834
   475
       $posix_glob set +f &&
yann@2834
   476
yann@2834
   477
       test "$old" = "$new" &&
yann@2834
   478
       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
yann@2834
   479
    then
yann@2834
   480
      rm -f "$dsttmp"
yann@2834
   481
    else
yann@2834
   482
      # Rename the file to the real destination.
yann@2834
   483
      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
yann@2834
   484
yann@2834
   485
      # The rename failed, perhaps because mv can't rename something else
yann@2834
   486
      # to itself, or perhaps because mv is so ancient that it does not
yann@2834
   487
      # support -f.
yann@2834
   488
      {
yann@2834
   489
	# Now remove or move aside any old file at destination location.
yann@2834
   490
	# We try this two ways since rm can't unlink itself on some
yann@2834
   491
	# systems and the destination file might be busy for other
yann@2834
   492
	# reasons.  In this case, the final cleanup might fail but the new
yann@2834
   493
	# file should still install successfully.
yann@2834
   494
	{
yann@2834
   495
	  test ! -f "$dst" ||
yann@2834
   496
	  $doit $rmcmd -f "$dst" 2>/dev/null ||
yann@2834
   497
	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
yann@2834
   498
	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
yann@2834
   499
	  } ||
yann@2834
   500
	  { echo "$0: cannot unlink or rename $dst" >&2
yann@2834
   501
	    (exit 1); exit 1
yann@2834
   502
	  }
yann@2834
   503
	} &&
yann@2834
   504
yann@2834
   505
	# Now rename the file to the real destination.
yann@2834
   506
	$doit $mvcmd "$dsttmp" "$dst"
yann@2834
   507
      }
yann@2834
   508
    fi || exit 1
yann@2834
   509
yann@2834
   510
    trap '' 0
yann@2834
   511
  fi
yann@2834
   512
done
yann@2834
   513
yann@2834
   514
# Local variables:
yann@2834
   515
# eval: (add-hook 'write-file-hooks 'time-stamp)
yann@2834
   516
# time-stamp-start: "scriptversion="
yann@2834
   517
# time-stamp-format: "%:y-%02m-%02d.%02H"
yann@2834
   518
# time-stamp-time-zone: "UTC"
yann@2834
   519
# time-stamp-end: "; # UTC"
yann@2834
   520
# End: