The R Project SVN R

Rev

Rev 40109 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 40109 Rev 44851
Line 1... Line 1...
1
#!/bin/sh
1
#!/bin/sh
2
# install - install a program, script, or datafile
2
# install - install a program, script, or datafile
3
 
3
 
4
scriptversion=2006-10-14.15
4
scriptversion=2006-12-25.00
5
 
5
 
6
# This originates from X11R5 (mit/util/scripts/install.sh), which was
6
# This originates from X11R5 (mit/util/scripts/install.sh), which was
7
# later released in X11R6 (xc/config/util/install.sh) with the
7
# later released in X11R6 (xc/config/util/install.sh) with the
8
# following copyright and license.
8
# following copyright and license.
9
#
9
#
Line 46... Line 46...
46
IFS=" ""	$nl"
46
IFS=" ""	$nl"
47
 
47
 
48
# set DOITPROG to echo to test this script
48
# set DOITPROG to echo to test this script
49
 
49
 
50
# Don't use :- since 4.3BSD and earlier shells don't like it.
50
# Don't use :- since 4.3BSD and earlier shells don't like it.
51
doit="${DOITPROG-}"
51
doit=${DOITPROG-}
52
if test -z "$doit"; then
52
if test -z "$doit"; then
53
  doit_exec=exec
53
  doit_exec=exec
54
else
54
else
55
  doit_exec=$doit
55
  doit_exec=$doit
56
fi
56
fi
57
 
57
 
58
# Put in absolute file names if you don't have them in your path;
58
# Put in absolute file names if you don't have them in your path;
59
# or use environment vars.
59
# or use environment vars.
60
 
60
 
61
mvprog="${MVPROG-mv}"
61
chgrpprog=${CHGRPPROG-chgrp}
62
cpprog="${CPPROG-cp}"
62
chmodprog=${CHMODPROG-chmod}
63
chmodprog="${CHMODPROG-chmod}"
63
chownprog=${CHOWNPROG-chown}
64
chownprog="${CHOWNPROG-chown}"
64
cmpprog=${CMPPROG-cmp}
65
chgrpprog="${CHGRPPROG-chgrp}"
65
cpprog=${CPPROG-cp}
66
stripprog="${STRIPPROG-strip}"
66
mkdirprog=${MKDIRPROG-mkdir}
-
 
67
mvprog=${MVPROG-mv}
67
rmprog="${RMPROG-rm}"
68
rmprog=${RMPROG-rm}
68
mkdirprog="${MKDIRPROG-mkdir}"
69
stripprog=${STRIPPROG-strip}
-
 
70
 
-
 
71
posix_glob='?'
-
 
72
initialize_posix_glob='
-
 
73
  test "$posix_glob" != "?" || {
-
 
74
    if (set -f) 2>/dev/null; then
-
 
75
      posix_glob=
-
 
76
    else
-
 
77
      posix_glob=:
-
 
78
    fi
-
 
79
  }
-
 
80
'
69
 
81
 
70
posix_glob=
-
 
71
posix_mkdir=
82
posix_mkdir=
72
 
83
 
73
# Desired mode of installed file.
84
# Desired mode of installed file.
74
mode=0755
85
mode=0755
75
 
86
 
-
 
87
chgrpcmd=
76
chmodcmd=$chmodprog
88
chmodcmd=$chmodprog
77
chowncmd=
89
chowncmd=
78
chgrpcmd=
-
 
79
stripcmd=
90
mvcmd=$mvprog
80
rmcmd="$rmprog -f"
91
rmcmd="$rmprog -f"
81
mvcmd="$mvprog"
92
stripcmd=
-
 
93
 
82
src=
94
src=
83
dst=
95
dst=
84
dir_arg=
96
dir_arg=
85
dstarg=
97
dst_arg=
-
 
98
 
-
 
99
copy_on_change=false
86
no_target_directory=
100
no_target_directory=
87
 
101
 
-
 
102
usage="\
88
usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
103
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
89
   or: $0 [OPTION]... SRCFILES... DIRECTORY
104
   or: $0 [OPTION]... SRCFILES... DIRECTORY
90
   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
105
   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
91
   or: $0 [OPTION]... -d DIRECTORIES...
106
   or: $0 [OPTION]... -d DIRECTORIES...
92
 
107
 
93
In the 1st form, copy SRCFILE to DSTFILE.
108
In the 1st form, copy SRCFILE to DSTFILE.
94
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
109
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
95
In the 4th, create DIRECTORIES.
110
In the 4th, create DIRECTORIES.
96
 
111
 
97
Options:
112
Options:
-
 
113
     --help     display this help and exit.
-
 
114
     --version  display version info and exit.
-
 
115
 
98
-c         (ignored)
116
  -c            (ignored)
-
 
117
  -C            install only if different (preserve the last data modification time)
99
-d         create directories instead of installing files.
118
  -d            create directories instead of installing files.
100
-g GROUP   $chgrpprog installed files to GROUP.
119
  -g GROUP      $chgrpprog installed files to GROUP.
101
-m MODE    $chmodprog installed files to MODE.
120
  -m MODE       $chmodprog installed files to MODE.
102
-o USER    $chownprog installed files to USER.
121
  -o USER       $chownprog installed files to USER.
103
-s         $stripprog installed files.
122
  -s            $stripprog installed files.
104
-t DIRECTORY  install into DIRECTORY.
123
  -t DIRECTORY  install into DIRECTORY.
105
-T         report an error if DSTFILE is a directory.
124
  -T            report an error if DSTFILE is a directory.
106
--help     display this help and exit.
-
 
107
--version  display version info and exit.
-
 
108
 
125
 
109
Environment variables override the default commands:
126
Environment variables override the default commands:
110
  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
127
  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
-
 
128
  RMPROG STRIPPROG
111
"
129
"
112
 
130
 
113
while test $# -ne 0; do
131
while test $# -ne 0; do
114
  case $1 in
132
  case $1 in
115
    -c) shift
133
    -c) ;;
-
 
134
 
116
        continue;;
135
    -C) copy_on_change=true;;
117
 
136
 
118
    -d) dir_arg=true
137
    -d) dir_arg=true;;
119
        shift
-
 
120
        continue;;
-
 
121
 
138
 
122
    -g) chgrpcmd="$chgrpprog $2"
139
    -g) chgrpcmd="$chgrpprog $2"
123
        shift
-
 
124
        shift
140
	shift;;
125
        continue;;
-
 
126
 
141
 
127
    --help) echo "$usage"; exit $?;;
142
    --help) echo "$usage"; exit $?;;
128
 
143
 
129
    -m) mode=$2
144
    -m) mode=$2
130
        shift
-
 
131
        shift
-
 
132
	case $mode in
145
	case $mode in
133
	  *' '* | *'	'* | *'
146
	  *' '* | *'	'* | *'
134
'*	  | *'*'* | *'?'* | *'['*)
147
'*	  | *'*'* | *'?'* | *'['*)
135
	    echo "$0: invalid mode: $mode" >&2
148
	    echo "$0: invalid mode: $mode" >&2
136
	    exit 1;;
149
	    exit 1;;
137
	esac
150
	esac
138
        continue;;
151
	shift;;
139
 
152
 
140
    -o) chowncmd="$chownprog $2"
153
    -o) chowncmd="$chownprog $2"
141
        shift
-
 
142
        shift
154
	shift;;
143
        continue;;
-
 
144
 
155
 
145
    -s) stripcmd=$stripprog
156
    -s) stripcmd=$stripprog;;
146
        shift
-
 
147
        continue;;
-
 
148
 
157
 
149
    -t) dstarg=$2
158
    -t) dst_arg=$2
150
	shift
-
 
151
	shift
159
	shift;;
152
	continue;;
-
 
153
 
160
 
154
    -T) no_target_directory=true
161
    -T) no_target_directory=true;;
155
	shift
-
 
156
	continue;;
-
 
157
 
162
 
158
    --version) echo "$0 $scriptversion"; exit $?;;
163
    --version) echo "$0 $scriptversion"; exit $?;;
159
 
164
 
160
    --)	shift
165
    --)	shift
161
	break;;
166
	break;;
Line 163... Line 168...
163
    -*)	echo "$0: invalid option: $1" >&2
168
    -*)	echo "$0: invalid option: $1" >&2
164
	exit 1;;
169
	exit 1;;
165
 
170
 
166
    *)  break;;
171
    *)  break;;
167
  esac
172
  esac
-
 
173
  shift
168
done
174
done
169
 
175
 
170
if test $# -ne 0 && test -z "$dir_arg$dstarg"; then
176
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
171
  # When -d is used, all remaining arguments are directories to create.
177
  # When -d is used, all remaining arguments are directories to create.
172
  # When -t is used, the destination is already specified.
178
  # When -t is used, the destination is already specified.
173
  # Otherwise, the last argument is the destination.  Remove it from $@.
179
  # Otherwise, the last argument is the destination.  Remove it from $@.
174
  for arg
180
  for arg
175
  do
181
  do
176
    if test -n "$dstarg"; then
182
    if test -n "$dst_arg"; then
177
      # $@ is not empty: it contains at least $arg.
183
      # $@ is not empty: it contains at least $arg.
178
      set fnord "$@" "$dstarg"
184
      set fnord "$@" "$dst_arg"
179
      shift # fnord
185
      shift # fnord
180
    fi
186
    fi
181
    shift # arg
187
    shift # arg
182
    dstarg=$arg
188
    dst_arg=$arg
183
  done
189
  done
184
fi
190
fi
185
 
191
 
186
if test $# -eq 0; then
192
if test $# -eq 0; then
187
  if test -z "$dir_arg"; then
193
  if test -z "$dir_arg"; then
Line 222... Line 228...
222
 
228
 
223
for src
229
for src
224
do
230
do
225
  # Protect names starting with `-'.
231
  # Protect names starting with `-'.
226
  case $src in
232
  case $src in
227
    -*) src=./$src ;;
233
    -*) src=./$src;;
228
  esac
234
  esac
229
 
235
 
230
  if test -n "$dir_arg"; then
236
  if test -n "$dir_arg"; then
231
    dst=$src
237
    dst=$src
232
    dstdir=$dst
238
    dstdir=$dst
Line 240... Line 246...
240
    if test ! -f "$src" && test ! -d "$src"; then
246
    if test ! -f "$src" && test ! -d "$src"; then
241
      echo "$0: $src does not exist." >&2
247
      echo "$0: $src does not exist." >&2
242
      exit 1
248
      exit 1
243
    fi
249
    fi
244
 
250
 
245
    if test -z "$dstarg"; then
251
    if test -z "$dst_arg"; then
246
      echo "$0: no destination specified." >&2
252
      echo "$0: no destination specified." >&2
247
      exit 1
253
      exit 1
248
    fi
254
    fi
249
 
255
 
250
    dst=$dstarg
256
    dst=$dst_arg
251
    # Protect names starting with `-'.
257
    # Protect names starting with `-'.
252
    case $dst in
258
    case $dst in
253
      -*) dst=./$dst ;;
259
      -*) dst=./$dst;;
254
    esac
260
    esac
255
 
261
 
256
    # If destination is a directory, append the input filename; won't work
262
    # If destination is a directory, append the input filename; won't work
257
    # if double slashes aren't ignored.
263
    # if double slashes aren't ignored.
258
    if test -d "$dst"; then
264
    if test -d "$dst"; then
259
      if test -n "$no_target_directory"; then
265
      if test -n "$no_target_directory"; then
260
	echo "$0: $dstarg: Is a directory" >&2
266
	echo "$0: $dst_arg: Is a directory" >&2
261
	exit 1
267
	exit 1
262
      fi
268
      fi
263
      dstdir=$dst
269
      dstdir=$dst
264
      dst=$dstdir/`basename "$src"`
270
      dst=$dstdir/`basename "$src"`
265
      dstdir_status=0
271
      dstdir_status=0
Line 376... Line 382...
376
      # The umask is ridiculous, or mkdir does not conform to POSIX,
382
      # The umask is ridiculous, or mkdir does not conform to POSIX,
377
      # or it failed possibly due to a race condition.  Create the
383
      # or it failed possibly due to a race condition.  Create the
378
      # directory the slow way, step by step, checking for races as we go.
384
      # directory the slow way, step by step, checking for races as we go.
379
 
385
 
380
      case $dstdir in
386
      case $dstdir in
381
	/*) prefix=/ ;;
387
	/*) prefix='/';;
382
	-*) prefix=./ ;;
388
	-*) prefix='./';;
383
	*)  prefix= ;;
389
	*)  prefix='';;
384
      esac
390
      esac
385
 
391
 
386
      case $posix_glob in
392
      eval "$initialize_posix_glob"
387
        '')
-
 
388
	  if (set -f) 2>/dev/null; then
-
 
389
	    posix_glob=true
-
 
390
	  else
-
 
391
	    posix_glob=false
-
 
392
	  fi ;;
-
 
393
      esac
-
 
394
 
393
 
395
      oIFS=$IFS
394
      oIFS=$IFS
396
      IFS=/
395
      IFS=/
397
      $posix_glob && set -f
396
      $posix_glob set -f
398
      set fnord $dstdir
397
      set fnord $dstdir
399
      shift
398
      shift
400
      $posix_glob && set +f
399
      $posix_glob set +f
401
      IFS=$oIFS
400
      IFS=$oIFS
402
 
401
 
403
      prefixes=
402
      prefixes=
404
 
403
 
405
      for d
404
      for d
Line 457... Line 456...
457
    #
456
    #
458
    # If any of these fail, we abort the whole thing.  If we want to
457
    # If any of these fail, we abort the whole thing.  If we want to
459
    # ignore errors from any of these, just make sure not to ignore
458
    # ignore errors from any of these, just make sure not to ignore
460
    # errors from the above "$doit $cpprog $src $dsttmp" command.
459
    # errors from the above "$doit $cpprog $src $dsttmp" command.
461
    #
460
    #
462
    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
461
    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
463
      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
462
    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
464
      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
463
    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
465
      && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
464
    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
 
465
 
-
 
466
    # If -C, don't bother to copy if it wouldn't change the file.
-
 
467
    if $copy_on_change &&
-
 
468
       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
-
 
469
       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
-
 
470
 
-
 
471
       eval "$initialize_posix_glob" &&
-
 
472
       $posix_glob set -f &&
-
 
473
       set X $old && old=:$2:$4:$5:$6 &&
-
 
474
       set X $new && new=:$2:$4:$5:$6 &&
-
 
475
       $posix_glob set +f &&
466
 
476
 
-
 
477
       test "$old" = "$new" &&
-
 
478
       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
-
 
479
    then
-
 
480
      rm -f "$dsttmp"
-
 
481
    else
467
    # Now rename the file to the real destination.
482
      # Rename the file to the real destination.
468
    { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \
483
      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
469
      || {
484
 
470
	   # The rename failed, perhaps because mv can't rename something else
485
      # The rename failed, perhaps because mv can't rename something else
471
	   # to itself, or perhaps because mv is so ancient that it does not
486
      # to itself, or perhaps because mv is so ancient that it does not
472
	   # support -f.
487
      # support -f.
473
 
488
      {
474
	   # Now remove or move aside any old file at destination location.
489
	# Now remove or move aside any old file at destination location.
475
	   # We try this two ways since rm can't unlink itself on some
490
	# We try this two ways since rm can't unlink itself on some
476
	   # systems and the destination file might be busy for other
491
	# systems and the destination file might be busy for other
477
	   # reasons.  In this case, the final cleanup might fail but the new
492
	# reasons.  In this case, the final cleanup might fail but the new
478
	   # file should still install successfully.
493
	# file should still install successfully.
479
	   {
494
	{
480
	     if test -f "$dst"; then
495
	  test ! -f "$dst" ||
481
	       $doit $rmcmd -f "$dst" 2>/dev/null \
496
	  $doit $rmcmd -f "$dst" 2>/dev/null ||
482
	       || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \
497
	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
483
		     && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\
498
	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
484
	       || {
499
	  } ||
485
		 echo "$0: cannot unlink or rename $dst" >&2
500
	  { echo "$0: cannot unlink or rename $dst" >&2
486
		 (exit 1); exit 1
501
	    (exit 1); exit 1
487
	       }
502
	  }
488
	     else
-
 
489
	       :
-
 
490
	     fi
-
 
491
	   } &&
503
	} &&
492
 
504
 
493
	   # Now rename the file to the real destination.
505
	# Now rename the file to the real destination.
494
	   $doit $mvcmd "$dsttmp" "$dst"
506
	$doit $mvcmd "$dsttmp" "$dst"
495
	 }
507
      }
496
    } || exit 1
508
    fi || exit 1
497
 
509
 
498
    trap '' 0
510
    trap '' 0
499
  fi
511
  fi
500
done
512
done
501
 
513