]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blob - install-sh
Undoes mod: xfs-cmds:slinx:120772a
[thirdparty/xfsprogs-dev.git] / install-sh
1 #! /bin/sh
2 #
3 # Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
4 #
5 # This program is free software; you can redistribute it and/or modify it
6 # under the terms of version 2 of the GNU General Public License as
7 # published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it would be useful, but
10 # WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 #
13 # Further, this software is distributed without any warranty that it is
14 # free of the rightful claim of any third person regarding infringement
15 # or the like. Any license provided herein, whether implied or
16 # otherwise, applies only to this software file. Patent licenses, if
17 # any, provided herein do not apply to combinations of this program with
18 # other software, or any other product whatsoever.
19 #
20 # You should have received a copy of the GNU General Public License along
21 # with this program; if not, write the Free Software Foundation, Inc., 59
22 # Temple Place - Suite 330, Boston MA 02111-1307, USA.
23 #
24 # Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
25 # Mountain View, CA 94043, or:
26 #
27 # http://www.sgi.com
28 #
29 # For further information regarding this notice, see:
30 #
31 # http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
32 #
33
34 #
35 # This script emulates bsd install and also recognises
36 # two environment variables, with the following semantics :-
37 #
38 # $DIST_MANIFEST - if set, the name of the file to append manifest
39 # information in the following format:
40 # File : f mode owner group src target
41 # Directory: d mode owner group target
42 # Symlink : l linkval target
43 #
44 # $DIST_ROOT - if set, prepend to target
45 #
46 # The sematics of all combinations of these two variables
47 # are as follows:
48 #
49 # $DIST_MANIFEST? $DIST_ROOT? | Copy? Append Manifest?
50 # -----------------------------+--------------------------
51 # not set not set | yes no
52 # not set set | yes no
53 # set not set | no yes
54 # set set | yes yes
55 #
56 _usage() {
57 echo "Usage: $prog [-o owner] [-g group] [-m mode] -d directory"
58 echo "or $prog [-D] [-o owner] [-g group] [-m mode] file directory/file"
59 echo "or $prog [-o owner] [-g group] [-m mode] file [file ...] directory"
60 echo "or $prog -S file target (creates \"target\" symlink)"
61 echo "or $prog -T lt_arg [-o owner] [-g group] [-m mode] libtool.lai directory"
62 echo ""
63 echo "The \$DIST_MANIFEST and \$DIST_ROOT environment variables affect the"
64 echo "behaviour of this command - see comments in the script."
65 echo "The -D flag is only available for the second usage, and causes"
66 echo "the target directory to be created before installing the file."
67 echo ""
68 exit 1
69 }
70
71 _chown ()
72 {
73 _st=255
74 if [ $# -eq 3 ] ; then
75 chown $1:$2 $3
76 _st=$?
77 if [ $_st -ne 0 ] ; then
78 if [ $REAL_UID != '0' ] ; then
79 if [ ! -f $DIST_ROOT/.chown.quiet ] ; then
80 echo '==============================================='
81 echo Ownership of files under ${DIST_ROOT:-/}
82 echo cannot be changed
83 echo '==============================================='
84 if [ -n "$DIST_ROOT" ] ; then
85 touch $DIST_ROOT/.chown.quiet
86 fi
87 fi
88 _st=0
89 fi
90 fi
91 fi
92
93 return $_st
94 }
95
96
97 _manifest ()
98 {
99 echo $* | sed -e 's/\/\//\//g' >>${DIST_MANIFEST:-/dev/null}
100 }
101
102 prog=`basename $0`
103 HERE=`pwd`
104 dflag=false
105 Dflag=false
106 Sflag=false
107 Tflag=false
108 DIRMODE=755
109 FILEMODE=644
110 OWNER=`id -u`
111 GROUP=`id -g`
112 REAL_UID=$OWNER
113
114 # default is to install and don't append manifest
115 INSTALL=true
116 MANIFEST=:
117
118 [ -n "$DIST_MANIFEST" -a -z "$DIST_ROOT" ] && INSTALL=false
119 [ -n "$DIST_MANIFEST" ] && MANIFEST="_manifest"
120
121 [ $# -eq 0 ] && _usage
122
123 if $INSTALL
124 then
125 CP=cp; LN=ln; MKDIR=mkdir; CHMOD=chmod; CHOWN=_chown
126 else
127 CP=true; LN=true; MKDIR=true; CHMOD=true; CHOWN=true
128 fi
129
130 [ -n "$DIST_ROOT" -a $REAL_UID -ne 0 ] && CHOWN=true
131
132 while getopts "Dcm:d:S:o:g:T:" c $*
133 do
134 case $c in
135 c)
136 ;;
137 g)
138 GROUP=$OPTARG
139 ;;
140 o)
141 OWNER=$OPTARG
142 ;;
143 m)
144 DIRMODE=`expr $OPTARG`
145 FILEMODE=$DIRMODE
146 ;;
147 D)
148 Dflag=true
149 ;;
150 S)
151 symlink=$OPTARG
152 Sflag=true
153 ;;
154 d)
155 dir=$DIST_ROOT/$OPTARG
156 dflag=true
157 ;;
158 T)
159 lt_install=$OPTARG
160 Tflag=true
161 ;;
162 *)
163 _usage
164 ;;
165 esac
166 done
167
168 shift `expr $OPTIND - 1`
169
170 status=0
171 if $dflag
172 then
173 #
174 # first usage
175 #
176 $MKDIR -p $dir
177 status=$?
178 if [ $status -eq 0 ]
179 then
180 $CHMOD $DIRMODE $dir
181 status=$?
182 fi
183 if [ $status -eq 0 ]
184 then
185 $CHOWN $OWNER $GROUP $dir
186 status=$?
187 fi
188 $MANIFEST d $DIRMODE $OWNER $GROUP ${dir#$DIST_ROOT}
189 elif $Sflag
190 then
191 #
192 # fourth usage (symlink)
193 #
194 if [ $# -ne 1 ]
195 then
196 _usage
197 else
198 target=$DIST_ROOT/$1
199 fi
200 $LN -s -f $symlink $target
201 status=$?
202 $MANIFEST l $symlink ${target#$DIST_ROOT}
203 elif $Tflag
204 then
205 #
206 # -T (install libs built by libtool)
207 #
208 if [ $# -ne 2 ]
209 then
210 _usage
211 else
212 libtool_lai=$1
213 # source the libtool variables
214 if [ ! -f $libtool_lai ]
215 then
216 echo "$prog: Unable to find libtool library file $libtool_lai"
217 exit 2
218 fi
219 . ./$libtool_lai
220 target=$DIST_ROOT/$2
221 fi
222 case $lt_install in
223 so_dot_version)
224 # Loop until we find libfoo.so.x.y.z, then break out.
225 for solib in $library_names
226 do
227 # does it have enough parts? libfoo.so.x.y.z == 5
228 cnt=`echo "$solib" | sed -e 's/\./ /g' | wc -w`
229 if [ $cnt -eq 5 ]
230 then
231 install_name=$target/$solib
232 $CP $solib $install_name
233 status=$?
234 $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$solib ${install_name#$DIST_ROOT}
235 break
236 fi
237 done
238 ;;
239
240 so_*)
241 case $lt_install in
242 so_dot_current)
243 # ln -s libfoo.so.x.y.z to libfoo.so.x
244 from_parts=5 # libfoo.so.x.y.z
245 to_parts=3 # libfoo.so.x
246 ;;
247 so_base)
248 # ln -s libfoo.so.x to libfoo.so
249 from_parts=3 # libfoo.so.x
250 to_parts=2 # libfoo.so
251 ;;
252 *)
253 echo "$prog: -T $lt_install invalid"
254 exit 2
255 ;;
256 esac
257
258 # Loop until we find the names, then break out.
259 for solib in $library_names
260 do
261 # does it have enough parts?
262 cnt=`echo "$solib" | sed -e 's/\./ /g' | wc -w`
263 if [ $cnt -eq $from_parts ]
264 then
265 from_name=$solib
266 elif [ $cnt -eq $to_parts ]
267 then
268 to_name=$solib
269 fi
270
271 if [ -n "$from_name" ] && [ -n "$to_name" ]
272 then
273 install_name=$target/$to_name
274 $LN -s -f $from_name $install_name
275 status=$?
276 $MANIFEST l $from_name ${install_name#$DIST_ROOT}
277 break
278 fi
279 done
280 ;;
281 old_lib)
282 install_name=$target/$old_library
283 $CP $old_library $install_name
284 status=$?
285 $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$old_library ${install_name#$DIST_ROOT}
286 ;;
287 *)
288 echo "$prog: -T $lt_install invalid"
289 exit 2
290 ;;
291 esac
292
293 case $lt_install in
294 old_lib|so_dot_version)
295 if [ $status -eq 0 ]
296 then
297 $CHMOD $FILEMODE $install_name
298 $CHOWN $OWNER $GROUP $install_name
299 fi
300 ;;
301 esac
302
303 else
304 list=""
305 dir=""
306 if [ $# -eq 2 ]
307 then
308 #
309 # second usage
310 #
311 f=$1
312 dir=$DIST_ROOT/$2
313 if $Dflag
314 then
315 mkdir -p `dirname $dir`
316 fi
317 $CP $f $dir
318 status=$?
319 if [ $status -eq 0 ]
320 then
321 if [ -f $dir/$f ]
322 then
323 $CHMOD $FILEMODE $dir/$f
324 status=$?
325 if [ $status -eq 0 ]
326 then
327 $CHOWN $OWNER $GROUP $dir/$f
328 status=$?
329 fi
330 $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f
331 else
332 $CHMOD $FILEMODE $dir
333 status=$?
334 if [ $status -eq 0 ]
335 then
336 $CHOWN $OWNER $GROUP $dir
337 status=$?
338 fi
339 $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$dir ${dir#$DIST_ROOT}
340 fi
341 fi
342 else
343 #
344 # third usage
345 #
346 n=1
347 while [ $# -gt 0 ]
348 do
349 if [ $# -gt 1 ]
350 then
351 list="$list $1"
352 else
353 dir=$DIST_ROOT/$1
354 fi
355 shift
356 done
357
358 # echo DIR=$dir list=\"$list\"
359 for f in $list
360 do
361 $CP $f $dir
362 status=$?
363 if [ $status -eq 0 ]
364 then
365 $CHMOD $FILEMODE $dir/$f
366 status=$?
367 if [ $status -eq 0 ]
368 then
369 $CHOWN $OWNER $GROUP $dir/$f
370 status=$?
371 fi
372 $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f
373 fi
374 [ $status -ne 0 ] && break
375 done
376 fi
377 fi
378
379 exit $status