|
1 |
| -#! /bin/sh |
2 |
| -# |
3 |
| -# install - install a program, script, or datafile |
4 |
| -# This comes from X11R5. |
5 |
| -# |
6 |
| -# Calling this script install-sh is preferred over install.sh, to prevent |
7 |
| -# `make' implicit rules from creating a file called install from it |
8 |
| -# when there is no Makefile. |
9 |
| -# |
10 |
| -# This script is compatible with the BSD install script, but was written |
11 |
| -# from scratch. |
12 |
| -# |
13 |
| - |
14 |
| - |
15 |
| -# set DOITPROG to echo to test this script |
16 |
| - |
17 |
| -# Don't use :- since 4.3BSD and earlier shells don't like it. |
18 |
| -doit="${DOITPROG-}" |
19 |
| - |
20 |
| - |
21 |
| -# put in absolute paths if you don't have them in your path; or use env. vars. |
22 |
| - |
23 |
| -mvprog="${MVPROG-mv}" |
24 |
| -cpprog="${CPPROG-cp}" |
25 |
| -chmodprog="${CHMODPROG-chmod}" |
26 |
| -chownprog="${CHOWNPROG-chown}" |
27 |
| -chgrpprog="${CHGRPPROG-chgrp}" |
28 |
| -stripprog="${STRIPPROG-strip}" |
29 |
| -rmprog="${RMPROG-rm}" |
30 |
| -mkdirprog="${MKDIRPROG-mkdir}" |
31 |
| - |
32 |
| -tranformbasename="" |
33 |
| -transform_arg="" |
34 |
| -instcmd="$mvprog" |
35 |
| -chmodcmd="$chmodprog 0755" |
36 |
| -chowncmd="" |
37 |
| -chgrpcmd="" |
38 |
| -stripcmd="" |
39 |
| -rmcmd="$rmprog -f" |
40 |
| -mvcmd="$mvprog" |
41 |
| -src="" |
42 |
| -dst="" |
43 |
| -dir_arg="" |
44 |
| - |
45 |
| -while [ x"$1" != x ]; do |
46 |
| - case $1 in |
47 |
| - -c) instcmd="$cpprog" |
48 |
| - shift |
49 |
| - continue;; |
50 |
| - |
51 |
| - -d) dir_arg=true |
52 |
| - shift |
53 |
| - continue;; |
54 |
| - |
55 |
| - -m) chmodcmd="$chmodprog $2" |
56 |
| - shift |
57 |
| - shift |
58 |
| - continue;; |
59 |
| - |
60 |
| - -o) chowncmd="$chownprog $2" |
61 |
| - shift |
62 |
| - shift |
63 |
| - continue;; |
64 |
| - |
65 |
| - -g) chgrpcmd="$chgrpprog $2" |
66 |
| - shift |
67 |
| - shift |
68 |
| - continue;; |
69 |
| - |
70 |
| - -s) stripcmd="$stripprog" |
71 |
| - shift |
72 |
| - continue;; |
73 |
| - |
74 |
| - -t=*) transformarg=`echo $1 | sed 's/-t=//'` |
75 |
| - shift |
76 |
| - continue;; |
77 |
| - |
78 |
| - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` |
79 |
| - shift |
80 |
| - continue;; |
81 |
| - |
82 |
| - *) if [ x"$src" = x ] |
83 |
| - then |
84 |
| - src=$1 |
85 |
| - else |
86 |
| - # this colon is to work around a 386BSD /bin/sh bug |
87 |
| - : |
88 |
| - dst=$1 |
89 |
| - fi |
90 |
| - shift |
91 |
| - continue;; |
92 |
| - esac |
93 |
| -done |
94 |
| - |
95 |
| -if [ x"$src" = x ] |
96 |
| -then |
97 |
| - echo "install: no input file specified" |
98 |
| - exit 1 |
99 |
| -else |
100 |
| - true |
101 |
| -fi |
102 |
| - |
103 |
| -if [ x"$dir_arg" != x ]; then |
104 |
| - dst=$src |
105 |
| - src="" |
106 |
| - |
107 |
| - if [ -d $dst ]; then |
108 |
| - instcmd=: |
109 |
| - else |
110 |
| - instcmd=mkdir |
111 |
| - fi |
112 |
| -else |
113 |
| - |
114 |
| -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command |
115 |
| -# might cause directories to be created, which would be especially bad |
116 |
| -# if $src (and thus $dsttmp) contains '*'. |
117 |
| - |
118 |
| - if [ -f $src -o -d $src ] |
119 |
| - then |
120 |
| - true |
121 |
| - else |
122 |
| - echo "install: $src does not exist" |
123 |
| - exit 1 |
124 |
| - fi |
125 |
| - |
126 |
| - if [ x"$dst" = x ] |
127 |
| - then |
128 |
| - echo "install: no destination specified" |
129 |
| - exit 1 |
130 |
| - else |
131 |
| - true |
132 |
| - fi |
133 |
| - |
134 |
| -# If destination is a directory, append the input filename; if your system |
135 |
| -# does not like double slashes in filenames, you may need to add some logic |
136 |
| - |
137 |
| - if [ -d $dst ] |
138 |
| - then |
139 |
| - dst="$dst"/`basename $src` |
140 |
| - else |
141 |
| - true |
142 |
| - fi |
143 |
| -fi |
144 |
| - |
145 |
| -## this sed command emulates the dirname command |
146 |
| -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` |
147 |
| - |
148 |
| -# Make sure that the destination directory exists. |
149 |
| -# this part is taken from Noah Friedman's mkinstalldirs script |
150 |
| - |
151 |
| -# Skip lots of stat calls in the usual case. |
152 |
| -if [ ! -d "$dstdir" ]; then |
153 |
| -defaultIFS=' |
154 |
| -' |
155 |
| -IFS="${IFS-${defaultIFS}}" |
156 |
| - |
157 |
| -oIFS="${IFS}" |
158 |
| -# Some sh's can't handle IFS=/ for some reason. |
159 |
| -IFS='%' |
160 |
| -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` |
161 |
| -IFS="${oIFS}" |
162 |
| - |
163 |
| -pathcomp='' |
164 |
| - |
165 |
| -while [ $# -ne 0 ] ; do |
166 |
| - pathcomp="${pathcomp}${1}" |
167 |
| - shift |
168 |
| - |
169 |
| - if [ ! -d "${pathcomp}" ] ; |
170 |
| - then |
171 |
| - $mkdirprog "${pathcomp}" |
172 |
| - else |
173 |
| - true |
174 |
| - fi |
175 |
| - |
176 |
| - pathcomp="${pathcomp}/" |
177 |
| -done |
178 |
| -fi |
179 |
| - |
180 |
| -if [ x"$dir_arg" != x ] |
181 |
| -then |
182 |
| - $doit $instcmd $dst && |
183 |
| - |
184 |
| - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && |
185 |
| - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && |
186 |
| - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && |
187 |
| - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi |
188 |
| -else |
189 |
| - |
190 |
| -# If we're going to rename the final executable, determine the name now. |
191 |
| - |
192 |
| - if [ x"$transformarg" = x ] |
193 |
| - then |
194 |
| - dstfile=`basename $dst` |
195 |
| - else |
196 |
| - dstfile=`basename $dst $transformbasename | |
197 |
| - sed $transformarg`$transformbasename |
198 |
| - fi |
199 |
| - |
200 |
| -# don't allow the sed command to completely eliminate the filename |
201 |
| - |
202 |
| - if [ x"$dstfile" = x ] |
203 |
| - then |
204 |
| - dstfile=`basename $dst` |
205 |
| - else |
206 |
| - true |
207 |
| - fi |
208 |
| - |
209 |
| -# Make a temp file name in the proper directory. |
210 |
| - |
211 |
| - dsttmp=$dstdir/#inst.$$# |
212 |
| - |
213 |
| -# Move or copy the file name to the temp name |
214 |
| - |
215 |
| - $doit $instcmd $src $dsttmp && |
216 |
| - |
217 |
| - trap "rm -f ${dsttmp}" 0 && |
218 |
| - |
219 |
| -# and set any options; do chmod last to preserve setuid bits |
220 |
| - |
221 |
| -# If any of these fail, we abort the whole thing. If we want to |
222 |
| -# ignore errors from any of these, just make sure not to ignore |
223 |
| -# errors from the above "$doit $instcmd $src $dsttmp" command. |
224 |
| - |
225 |
| - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && |
226 |
| - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && |
227 |
| - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && |
228 |
| - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && |
229 |
| - |
230 |
| -# Now rename the file to the real destination. |
231 |
| - |
232 |
| - $doit $rmcmd -f $dstdir/$dstfile && |
233 |
| - $doit $mvcmd $dsttmp $dstdir/$dstfile |
234 |
| - |
235 |
| -fi && |
236 |
| - |
237 |
| - |
238 |
| -exit 0 |
0 commit comments