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