source: trunk/gui/tclconfig/install-sh @ 1132

Last change on this file since 1132 was 503, checked in by nkissebe, 18 years ago

Converted to Tcl Extension Architecture (TEA) v3.5 for base Windows support. Added Windows ports of getrlimit, getrusage, gettimeofday, setrlimit functions.

  • Property svn:executable set to *
File size: 8.8 KB
Line 
1#!/bin/sh
2# install - install a program, script, or datafile
3
4scriptversion=2004-01-12.10
5
6# This originates from X11R5 (mit/util/scripts/install.sh), which was
7# later released in X11R6 (xc/config/util/install.sh) with the
8# following copyright and license.
9#
10# Copyright (C) 1994 X Consortium
11#
12# Permission is hereby granted, free of charge, to any person obtaining a copy
13# of this software and associated documentation files (the "Software"), to
14# deal in the Software without restriction, including without limitation the
15# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16# sell copies of the Software, and to permit persons to whom the Software is
17# furnished to do so, subject to the following conditions:
18#
19# The above copyright notice and this permission notice shall be included in
20# all copies or substantial portions of the Software.
21#
22# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
25# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
27# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28#
29# Except as contained in this notice, the name of the X Consortium shall not
30# be used in advertising or otherwise to promote the sale, use or other deal-
31# ings in this Software without prior written authorization from the X Consor-
32# tium.
33#
34#
35# FSF changes to this file are in the public domain.
36#
37# Calling this script install-sh is preferred over install.sh, to prevent
38# `make' implicit rules from creating a file called install from it
39# when there is no Makefile.
40#
41# This script is compatible with the BSD install script, but was written
42# from scratch.  It can only install one file at a time, a restriction
43# shared with many OS's install programs.
44
45# set DOITPROG to echo to test this script
46
47# Don't use :- since 4.3BSD and earlier shells don't like it.
48doit="${DOITPROG-}"
49
50# put in absolute paths if you don't have them in your path; or use env. vars.
51
52mvprog="${MVPROG-mv}"
53cpprog="${CPPROG-cp}"
54chmodprog="${CHMODPROG-chmod}"
55chownprog="${CHOWNPROG-chown}"
56chgrpprog="${CHGRPPROG-chgrp}"
57stripprog="${STRIPPROG-strip}"
58rmprog="${RMPROG-rm}"
59mkdirprog="${MKDIRPROG-mkdir}"
60
61transformbasename=
62transform_arg=
63instcmd="$mvprog"
64chmodcmd="$chmodprog 0755"
65chowncmd=
66chgrpcmd=
67stripcmd=
68rmcmd="$rmprog -f"
69mvcmd="$mvprog"
70src=
71dst=
72dir_arg=
73
74usage="Usage: $0 [OPTION]... SRCFILE DSTFILE
75   or: $0 [OPTION]... SRCFILES... DIRECTORY
76   or: $0 -d DIRECTORIES...
77
78In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default.
79In the second, create the directory path DIR.
80
81Options:
82-b=TRANSFORMBASENAME
83-c         copy source (using $cpprog) instead of moving (using $mvprog).
84-d         create directories instead of installing files.
85-g GROUP   $chgrp installed files to GROUP.
86-m MODE    $chmod installed files to MODE.
87-o USER    $chown installed files to USER.
88-s         strip installed files (using $stripprog).
89-t=TRANSFORM
90--help     display this help and exit.
91--version  display version info and exit.
92
93Environment variables override the default commands:
94  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
95"
96
97while test -n "$1"; do
98  case $1 in
99    -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
100        shift
101        continue;;
102
103    -c) instcmd=$cpprog
104        shift
105        continue;;
106
107    -d) dir_arg=true
108        shift
109        continue;;
110
111    -g) chgrpcmd="$chgrpprog $2"
112        shift
113        shift
114        continue;;
115
116    --help) echo "$usage"; exit 0;;
117
118    -m) chmodcmd="$chmodprog $2"
119        shift
120        shift
121        continue;;
122
123    -o) chowncmd="$chownprog $2"
124        shift
125        shift
126        continue;;
127
128    -s) stripcmd=$stripprog
129        shift
130        continue;;
131
132    -t=*) transformarg=`echo $1 | sed 's/-t=//'`
133        shift
134        continue;;
135
136    --version) echo "$0 $scriptversion"; exit 0;;
137
138    *)  # When -d is used, all remaining arguments are directories to create.
139        test -n "$dir_arg" && break
140        # Otherwise, the last argument is the destination.  Remove it from $@.
141        for arg
142        do
143          if test -n "$dstarg"; then
144            # $@ is not empty: it contains at least $arg.
145            set fnord "$@" "$dstarg"
146            shift # fnord
147          fi
148          shift # arg
149          dstarg=$arg
150        done
151        break;;
152  esac
153done
154
155if test -z "$1"; then
156  if test -z "$dir_arg"; then
157    echo "$0: no input file specified." >&2
158    exit 1
159  fi
160  # It's OK to call `install-sh -d' without argument.
161  # This can happen when creating conditional directories.
162  exit 0
163fi
164
165for src
166do
167  # Protect names starting with `-'.
168  case $src in
169    -*) src=./$src ;;
170  esac
171
172  if test -n "$dir_arg"; then
173    dst=$src
174    src=
175
176    if test -d "$dst"; then
177      instcmd=:
178      chmodcmd=
179    else
180      instcmd=$mkdirprog
181    fi
182  else
183    # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
184    # might cause directories to be created, which would be especially bad
185    # if $src (and thus $dsttmp) contains '*'.
186    if test ! -f "$src" && test ! -d "$src"; then
187      echo "$0: $src does not exist." >&2
188      exit 1
189    fi
190
191    if test -z "$dstarg"; then
192      echo "$0: no destination specified." >&2
193      exit 1
194    fi
195
196    dst=$dstarg
197    # Protect names starting with `-'.
198    case $dst in
199      -*) dst=./$dst ;;
200    esac
201
202    # If destination is a directory, append the input filename; won't work
203    # if double slashes aren't ignored.
204    if test -d "$dst"; then
205      dst=$dst/`basename "$src"`
206    fi
207  fi
208
209  # This sed command emulates the dirname command.
210  dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
211
212  # Make sure that the destination directory exists.
213
214  # Skip lots of stat calls in the usual case.
215  if test ! -d "$dstdir"; then
216    defaultIFS='
217        '
218    IFS="${IFS-$defaultIFS}"
219
220    oIFS=$IFS
221    # Some sh's can't handle IFS=/ for some reason.
222    IFS='%'
223    set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
224    IFS=$oIFS
225
226    pathcomp=
227
228    while test $# -ne 0 ; do
229      pathcomp=$pathcomp$1
230      shift
231      test -d "$pathcomp" || $mkdirprog "$pathcomp"
232      pathcomp=$pathcomp/
233    done
234  fi
235
236  if test -n "$dir_arg"; then
237    $doit $instcmd "$dst" \
238      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
239      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
240      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
241      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
242
243  else
244    # If we're going to rename the final executable, determine the name now.
245    if test -z "$transformarg"; then
246      dstfile=`basename "$dst"`
247    else
248      dstfile=`basename "$dst" $transformbasename \
249               | sed $transformarg`$transformbasename
250    fi
251
252    # don't allow the sed command to completely eliminate the filename.
253    test -z "$dstfile" && dstfile=`basename "$dst"`
254
255    # Make a couple of temp file names in the proper directory.
256    dsttmp=$dstdir/_inst.$$_
257    rmtmp=$dstdir/_rm.$$_
258
259    # Trap to clean up those temp files at exit.
260    trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
261    trap '(exit $?); exit' 1 2 13 15
262
263    # Move or copy the file name to the temp name
264    $doit $instcmd "$src" "$dsttmp" &&
265
266    # and set any options; do chmod last to preserve setuid bits.
267    #
268    # If any of these fail, we abort the whole thing.  If we want to
269    # ignore errors from any of these, just make sure not to ignore
270    # errors from the above "$doit $instcmd $src $dsttmp" command.
271    #
272    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
273      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
274      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
275      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
276
277    # Now remove or move aside any old file at destination location.  We
278    # try this two ways since rm can't unlink itself on some systems and
279    # the destination file might be busy for other reasons.  In this case,
280    # the final cleanup might fail but the new file should still install
281    # successfully.
282    {
283      if test -f "$dstdir/$dstfile"; then
284        $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
285        || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
286        || {
287          echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
288          (exit 1); exit
289        }
290      else
291        :
292      fi
293    } &&
294
295    # Now rename the file to the real destination.
296    $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
297  fi || { (exit 1); exit; }
298done
299
300# The final little trick to "correctly" pass the exit status to the exit trap.
301{
302  (exit 0); exit
303}
304
305# Local variables:
306# eval: (add-hook 'write-file-hooks 'time-stamp)
307# time-stamp-start: "scriptversion="
308# time-stamp-format: "%:y-%02m-%02d.%02H"
309# time-stamp-end: "$"
310# End:
Note: See TracBrowser for help on using the repository browser.