source: trunk/third/gettext/install-sh @ 16931

Revision 16931, 6.2 KB checked in by ghudson, 23 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r16930, which included commits to RCS files with non-trunk default branches.
  • Property svn:executable set to *
RevLine 
[15273]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
[16930]58    case "$1" in
59        -c) instcmd=$cpprog
[15273]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
[16930]82        -s) stripcmd=$stripprog
[15273]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
[16930]109        echo "install:  no input file specified" >&2
[15273]110        exit 1
111else
112        true
113fi
114
115if [ x"$dir_arg" != x ]; then
116        dst=$src
117        src=""
[16930]118
119        if [ -d "$dst" ]; then
[15273]120                instcmd=:
[16930]121                chmodcmd=""
[15273]122        else
[16930]123                instcmd=$mkdirprog
[15273]124        fi
125else
126
127# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
[16930]128# might cause directories to be created, which would be especially bad
[15273]129# if $src (and thus $dsttmp) contains '*'.
130
[16930]131        if [ -f "$src" -o -d "$src" ]
[15273]132        then
133                true
134        else
[16930]135                echo "install:  $src does not exist" >&2
[15273]136                exit 1
137        fi
[16930]138
[15273]139        if [ x"$dst" = x ]
140        then
[16930]141                echo "install:  no destination specified" >&2
[15273]142                exit 1
143        else
144                true
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
[16930]150        if [ -d "$dst" ]
[15273]151        then
[16930]152                dst=$dst/`basename "$src"`
[15273]153        else
154                true
155        fi
156fi
157
158## this sed command emulates the dirname command
[16930]159dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
[15273]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
[16930]166defaultIFS='
167        '
168IFS="${IFS-$defaultIFS}"
[15273]169
[16930]170oIFS=$IFS
[15273]171# Some sh's can't handle IFS=/ for some reason.
172IFS='%'
[16930]173set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
174IFS=$oIFS
[15273]175
176pathcomp=''
177
178while [ $# -ne 0 ] ; do
[16930]179        pathcomp=$pathcomp$1
[15273]180        shift
181
[16930]182        if [ ! -d "$pathcomp" ] ;
[15273]183        then
[16930]184                $mkdirprog "$pathcomp"
[15273]185        else
186                true
187        fi
188
[16930]189        pathcomp=$pathcomp/
[15273]190done
191fi
192
193if [ x"$dir_arg" != x ]
194then
[16930]195        $doit $instcmd "$dst" &&
[15273]196
[16930]197        if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else true ; fi &&
198        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else true ; fi &&
199        if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else true ; fi &&
200        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else true ; fi
[15273]201else
202
203# If we're going to rename the final executable, determine the name now.
204
[16930]205        if [ x"$transformarg" = x ]
[15273]206        then
[16930]207                dstfile=`basename "$dst"`
[15273]208        else
[16930]209                dstfile=`basename "$dst" $transformbasename |
[15273]210                        sed $transformarg`$transformbasename
211        fi
212
213# don't allow the sed command to completely eliminate the filename
214
[16930]215        if [ x"$dstfile" = x ]
[15273]216        then
[16930]217                dstfile=`basename "$dst"`
[15273]218        else
219                true
220        fi
221
[16930]222# Make a couple of temp file names in the proper directory.
[15273]223
224        dsttmp=$dstdir/#inst.$$#
[16930]225        rmtmp=$dstdir/#rm.$$#
[15273]226
[16930]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
[15273]232# Move or copy the file name to the temp name
233
[16930]234        $doit $instcmd $src "$dsttmp" &&
[15273]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
[16930]242        if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp";else true;fi &&
243        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp";else true;fi &&
244        if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp";else true;fi &&
245        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp";else true;fi &&
[15273]246
[16930]247# Now remove or move 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 "install: cannot unlink or rename $dstdir/$dstfile" >&2
259                  (exit 1); exit
260                }
261        else
262                true
263        fi
264} &&
265
[15273]266# Now rename the file to the real destination.
267
[16930]268        $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
[15273]269
270fi &&
271
[16930]272# The final little trick to "correctly" pass the exit status to the exit trap.
[15273]273
[16930]274{
275        (exit 0); exit
276}
Note: See TracBrowser for help on using the repository browser.