Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /doc/trunk/config/install-sh
ViewVC logotype

Annotation of /doc/trunk/config/install-sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3906 - (view) (download)

1 : jhr 3906 #!/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.
30 :     doit="${DOITPROG-}"
31 :    
32 :    
33 :     # put in absolute paths if you don't have them in your path; or use env. vars.
34 :    
35 :     mvprog="${MVPROG-mv}"
36 :     cpprog="${CPPROG-cp}"
37 :     chmodprog="${CHMODPROG-chmod}"
38 :     chownprog="${CHOWNPROG-chown}"
39 :     chgrpprog="${CHGRPPROG-chgrp}"
40 :     stripprog="${STRIPPROG-strip}"
41 :     rmprog="${RMPROG-rm}"
42 :     mkdirprog="${MKDIRPROG-mkdir}"
43 :    
44 :     transformbasename=""
45 :     transform_arg=""
46 :     instcmd="$mvprog"
47 :     chmodcmd="$chmodprog 0755"
48 :     chowncmd=""
49 :     chgrpcmd=""
50 :     stripcmd=""
51 :     rmcmd="$rmprog -f"
52 :     mvcmd="$mvprog"
53 :     src=""
54 :     dst=""
55 :     dir_arg=""
56 :    
57 :     while [ 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
105 :     done
106 :    
107 :     if [ x"$src" = x ]
108 :     then
109 :     echo "$0: no input file specified" >&2
110 :     exit 1
111 :     else
112 :     :
113 :     fi
114 :    
115 :     if [ 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
125 :     else
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
156 :     fi
157 :    
158 :     ## this sed command emulates the dirname command
159 :     dstdir=`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.
165 :     if [ ! -d "$dstdir" ]; then
166 :     defaultIFS='
167 :     '
168 :     IFS="${IFS-$defaultIFS}"
169 :    
170 :     oIFS=$IFS
171 :     # Some sh's can't handle IFS=/ for some reason.
172 :     IFS='%'
173 :     set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
174 :     IFS=$oIFS
175 :    
176 :     pathcomp=''
177 :    
178 :     while [ $# -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/
190 :     done
191 :     fi
192 :    
193 :     if [ x"$dir_arg" != x ]
194 :     then
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
201 :     else
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 :    
270 :     fi &&
271 :    
272 :     # The final little trick to "correctly" pass the exit status to the exit trap.
273 :    
274 :     {
275 :     (exit 0); exit
276 :     }

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0