source: trunk/third/atk/install-sh @ 20776

Revision 20776, 6.2 KB checked in by ghudson, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r20775, which included commits to RCS files with non-trunk default branches.
  • Property svn:executable set to *
Line 
1#!/bin/sh
2#
3# install - install a program, script, or datafile
4# This comes from X11R5 (mit/util/scripts/install.sh).
5#
6# Copyright 1991 by the Massachusetts Institute of Technology
7#
8# Permission to use, copy, modify, distribute, and sell this software and its
9# documentation for any purpose is hereby granted without fee, provided that
10# the above copyright notice appear in all copies and that both that
11# copyright notice and this permission notice appear in supporting
12# documentation, and that the name of M.I.T. not be used in advertising or
13# publicity pertaining to distribution of the software without specific,
14# written prior permission.  M.I.T. makes no representations about the
15# suitability of this software for any purpose.  It is provided "as is"
16# without express or implied warranty.
17#
18# Calling this script install-sh is preferred over install.sh, to prevent
19# `make' implicit rules from creating a file called install from it
20# when there is no Makefile.
21#
22# This script is compatible with the BSD install script, but was written
23# from scratch.  It can only install one file at a time, a restriction
24# shared with many OS's install programs.
25
26
27# set DOITPROG to echo to test this script
28
29# Don't use :- since 4.3BSD and earlier shells don't like it.
30doit="${DOITPROG-}"
31
32
33# put in absolute paths if you don't have them in your path; or use env. vars.
34
35mvprog="${MVPROG-mv}"
36cpprog="${CPPROG-cp}"
37chmodprog="${CHMODPROG-chmod}"
38chownprog="${CHOWNPROG-chown}"
39chgrpprog="${CHGRPPROG-chgrp}"
40stripprog="${STRIPPROG-strip}"
41rmprog="${RMPROG-rm}"
42mkdirprog="${MKDIRPROG-mkdir}"
43
44transformbasename=""
45transform_arg=""
46instcmd="$mvprog"
47chmodcmd="$chmodprog 0755"
48chowncmd=""
49chgrpcmd=""
50stripcmd=""
51rmcmd="$rmprog -f"
52mvcmd="$mvprog"
53src=""
54dst=""
55dir_arg=""
56
57while [ x"$1" != x ]; do
58    case $1 in
59        -c) instcmd=$cpprog
60            shift
61            continue;;
62
63        -d) dir_arg=true
64            shift
65            continue;;
66
67        -m) chmodcmd="$chmodprog $2"
68            shift
69            shift
70            continue;;
71
72        -o) chowncmd="$chownprog $2"
73            shift
74            shift
75            continue;;
76
77        -g) chgrpcmd="$chgrpprog $2"
78            shift
79            shift
80            continue;;
81
82        -s) stripcmd=$stripprog
83            shift
84            continue;;
85
86        -t=*) transformarg=`echo $1 | sed 's/-t=//'`
87            shift
88            continue;;
89
90        -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
91            shift
92            continue;;
93
94        *)  if [ x"$src" = x ]
95            then
96                src=$1
97            else
98                # this colon is to work around a 386BSD /bin/sh bug
99                :
100                dst=$1
101            fi
102            shift
103            continue;;
104    esac
105done
106
107if [ x"$src" = x ]
108then
109        echo "$0: no input file specified" >&2
110        exit 1
111else
112        :
113fi
114
115if [ x"$dir_arg" != x ]; then
116        dst=$src
117        src=""
118
119        if [ -d "$dst" ]; then
120                instcmd=:
121                chmodcmd=""
122        else
123                instcmd=$mkdirprog
124        fi
125else
126
127# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
128# might cause directories to be created, which would be especially bad
129# if $src (and thus $dsttmp) contains '*'.
130
131        if [ -f "$src" ] || [ -d "$src" ]
132        then
133                :
134        else
135                echo "$0: $src does not exist" >&2
136                exit 1
137        fi
138
139        if [ x"$dst" = x ]
140        then
141                echo "$0: no destination specified" >&2
142                exit 1
143        else
144                :
145        fi
146
147# If destination is a directory, append the input filename; if your system
148# does not like double slashes in filenames, you may need to add some logic
149
150        if [ -d "$dst" ]
151        then
152                dst=$dst/`basename "$src"`
153        else
154                :
155        fi
156fi
157
158## this sed command emulates the dirname command
159dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
160
161# Make sure that the destination directory exists.
162#  this part is taken from Noah Friedman's mkinstalldirs script
163
164# Skip lots of stat calls in the usual case.
165if [ ! -d "$dstdir" ]; then
166defaultIFS='
167        '
168IFS="${IFS-$defaultIFS}"
169
170oIFS=$IFS
171# Some sh's can't handle IFS=/ for some reason.
172IFS='%'
173set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
174IFS=$oIFS
175
176pathcomp=''
177
178while [ $# -ne 0 ] ; do
179        pathcomp=$pathcomp$1
180        shift
181
182        if [ ! -d "$pathcomp" ] ;
183        then
184                $mkdirprog "$pathcomp"
185        else
186                :
187        fi
188
189        pathcomp=$pathcomp/
190done
191fi
192
193if [ x"$dir_arg" != x ]
194then
195        $doit $instcmd "$dst" &&
196
197        if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
198        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
199        if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
200        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
201else
202
203# If we're going to rename the final executable, determine the name now.
204
205        if [ x"$transformarg" = x ]
206        then
207                dstfile=`basename "$dst"`
208        else
209                dstfile=`basename "$dst" $transformbasename |
210                        sed $transformarg`$transformbasename
211        fi
212
213# don't allow the sed command to completely eliminate the filename
214
215        if [ x"$dstfile" = x ]
216        then
217                dstfile=`basename "$dst"`
218        else
219                :
220        fi
221
222# Make a couple of temp file names in the proper directory.
223
224        dsttmp=$dstdir/#inst.$$#
225        rmtmp=$dstdir/#rm.$$#
226
227# Trap to clean up temp files at exit.
228
229        trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
230        trap '(exit $?); exit' 1 2 13 15
231
232# Move or copy the file name to the temp name
233
234        $doit $instcmd "$src" "$dsttmp" &&
235
236# and set any options; do chmod last to preserve setuid bits
237
238# If any of these fail, we abort the whole thing.  If we want to
239# ignore errors from any of these, just make sure not to ignore
240# errors from the above "$doit $instcmd $src $dsttmp" command.
241
242        if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
243        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
244        if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
245        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
246
247# Now remove or move aside any old file at destination location.  We try this
248# two ways since rm can't unlink itself on some systems and the destination
249# file might be busy for other reasons.  In this case, the final cleanup
250# might fail but the new file should still install successfully.
251
252{
253        if [ -f "$dstdir/$dstfile" ]
254        then
255                $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
256                $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
257                {
258                  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
259                  (exit 1); exit
260                }
261        else
262                :
263        fi
264} &&
265
266# Now rename the file to the real destination.
267
268        $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
269
270fi &&
271
272# The final little trick to "correctly" pass the exit status to the exit trap.
273
274{
275        (exit 0); exit
276}
Note: See TracBrowser for help on using the repository browser.