tools/picctldisplaytest/install-sh
author slime@unimatrix01.gamma-quadrant.de
Tue, 29 Jan 2008 22:31:52 +0100
changeset 2 2f55e5dd591d
permissions -rwxr-xr-x
inital checkin
slime@2
     1
#!/bin/sh
slime@2
     2
#
slime@2
     3
# install - install a program, script, or datafile
slime@2
     4
# This comes from X11R5 (mit/util/scripts/install.sh).
slime@2
     5
#
slime@2
     6
# Copyright 1991 by the Massachusetts Institute of Technology
slime@2
     7
#
slime@2
     8
# Permission to use, copy, modify, distribute, and sell this software and its
slime@2
     9
# documentation for any purpose is hereby granted without fee, provided that
slime@2
    10
# the above copyright notice appear in all copies and that both that
slime@2
    11
# copyright notice and this permission notice appear in supporting
slime@2
    12
# documentation, and that the name of M.I.T. not be used in advertising or
slime@2
    13
# publicity pertaining to distribution of the software without specific,
slime@2
    14
# written prior permission.  M.I.T. makes no representations about the
slime@2
    15
# suitability of this software for any purpose.  It is provided "as is"
slime@2
    16
# without express or implied warranty.
slime@2
    17
#
slime@2
    18
# Calling this script install-sh is preferred over install.sh, to prevent
slime@2
    19
# `make' implicit rules from creating a file called install from it
slime@2
    20
# when there is no Makefile.
slime@2
    21
#
slime@2
    22
# This script is compatible with the BSD install script, but was written
slime@2
    23
# from scratch.  It can only install one file at a time, a restriction
slime@2
    24
# shared with many OS's install programs.
slime@2
    25
slime@2
    26
slime@2
    27
# set DOITPROG to echo to test this script
slime@2
    28
slime@2
    29
# Don't use :- since 4.3BSD and earlier shells don't like it.
slime@2
    30
doit="${DOITPROG-}"
slime@2
    31
slime@2
    32
slime@2
    33
# put in absolute paths if you don't have them in your path; or use env. vars.
slime@2
    34
slime@2
    35
mvprog="${MVPROG-mv}"
slime@2
    36
cpprog="${CPPROG-cp}"
slime@2
    37
chmodprog="${CHMODPROG-chmod}"
slime@2
    38
chownprog="${CHOWNPROG-chown}"
slime@2
    39
chgrpprog="${CHGRPPROG-chgrp}"
slime@2
    40
stripprog="${STRIPPROG-strip}"
slime@2
    41
rmprog="${RMPROG-rm}"
slime@2
    42
mkdirprog="${MKDIRPROG-mkdir}"
slime@2
    43
slime@2
    44
transformbasename=""
slime@2
    45
transform_arg=""
slime@2
    46
instcmd="$mvprog"
slime@2
    47
chmodcmd="$chmodprog 0755"
slime@2
    48
chowncmd=""
slime@2
    49
chgrpcmd=""
slime@2
    50
stripcmd=""
slime@2
    51
rmcmd="$rmprog -f"
slime@2
    52
mvcmd="$mvprog"
slime@2
    53
src=""
slime@2
    54
dst=""
slime@2
    55
dir_arg=""
slime@2
    56
slime@2
    57
while [ x"$1" != x ]; do
slime@2
    58
    case $1 in
slime@2
    59
	-c) instcmd=$cpprog
slime@2
    60
	    shift
slime@2
    61
	    continue;;
slime@2
    62
slime@2
    63
	-d) dir_arg=true
slime@2
    64
	    shift
slime@2
    65
	    continue;;
slime@2
    66
slime@2
    67
	-m) chmodcmd="$chmodprog $2"
slime@2
    68
	    shift
slime@2
    69
	    shift
slime@2
    70
	    continue;;
slime@2
    71
slime@2
    72
	-o) chowncmd="$chownprog $2"
slime@2
    73
	    shift
slime@2
    74
	    shift
slime@2
    75
	    continue;;
slime@2
    76
slime@2
    77
	-g) chgrpcmd="$chgrpprog $2"
slime@2
    78
	    shift
slime@2
    79
	    shift
slime@2
    80
	    continue;;
slime@2
    81
slime@2
    82
	-s) stripcmd=$stripprog
slime@2
    83
	    shift
slime@2
    84
	    continue;;
slime@2
    85
slime@2
    86
	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
slime@2
    87
	    shift
slime@2
    88
	    continue;;
slime@2
    89
slime@2
    90
	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
slime@2
    91
	    shift
slime@2
    92
	    continue;;
slime@2
    93
slime@2
    94
	*)  if [ x"$src" = x ]
slime@2
    95
	    then
slime@2
    96
		src=$1
slime@2
    97
	    else
slime@2
    98
		# this colon is to work around a 386BSD /bin/sh bug
slime@2
    99
		:
slime@2
   100
		dst=$1
slime@2
   101
	    fi
slime@2
   102
	    shift
slime@2
   103
	    continue;;
slime@2
   104
    esac
slime@2
   105
done
slime@2
   106
slime@2
   107
if [ x"$src" = x ]
slime@2
   108
then
slime@2
   109
	echo "$0: no input file specified" >&2
slime@2
   110
	exit 1
slime@2
   111
else
slime@2
   112
	:
slime@2
   113
fi
slime@2
   114
slime@2
   115
if [ x"$dir_arg" != x ]; then
slime@2
   116
	dst=$src
slime@2
   117
	src=""
slime@2
   118
slime@2
   119
	if [ -d "$dst" ]; then
slime@2
   120
		instcmd=:
slime@2
   121
		chmodcmd=""
slime@2
   122
	else
slime@2
   123
		instcmd=$mkdirprog
slime@2
   124
	fi
slime@2
   125
else
slime@2
   126
slime@2
   127
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
slime@2
   128
# might cause directories to be created, which would be especially bad
slime@2
   129
# if $src (and thus $dsttmp) contains '*'.
slime@2
   130
slime@2
   131
	if [ -f "$src" ] || [ -d "$src" ]
slime@2
   132
	then
slime@2
   133
		:
slime@2
   134
	else
slime@2
   135
		echo "$0: $src does not exist" >&2
slime@2
   136
		exit 1
slime@2
   137
	fi
slime@2
   138
slime@2
   139
	if [ x"$dst" = x ]
slime@2
   140
	then
slime@2
   141
		echo "$0: no destination specified" >&2
slime@2
   142
		exit 1
slime@2
   143
	else
slime@2
   144
		:
slime@2
   145
	fi
slime@2
   146
slime@2
   147
# If destination is a directory, append the input filename; if your system
slime@2
   148
# does not like double slashes in filenames, you may need to add some logic
slime@2
   149
slime@2
   150
	if [ -d "$dst" ]
slime@2
   151
	then
slime@2
   152
		dst=$dst/`basename "$src"`
slime@2
   153
	else
slime@2
   154
		:
slime@2
   155
	fi
slime@2
   156
fi
slime@2
   157
slime@2
   158
## this sed command emulates the dirname command
slime@2
   159
dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
slime@2
   160
slime@2
   161
# Make sure that the destination directory exists.
slime@2
   162
#  this part is taken from Noah Friedman's mkinstalldirs script
slime@2
   163
slime@2
   164
# Skip lots of stat calls in the usual case.
slime@2
   165
if [ ! -d "$dstdir" ]; then
slime@2
   166
defaultIFS='
slime@2
   167
	'
slime@2
   168
IFS="${IFS-$defaultIFS}"
slime@2
   169
slime@2
   170
oIFS=$IFS
slime@2
   171
# Some sh's can't handle IFS=/ for some reason.
slime@2
   172
IFS='%'
slime@2
   173
set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
slime@2
   174
IFS=$oIFS
slime@2
   175
slime@2
   176
pathcomp=''
slime@2
   177
slime@2
   178
while [ $# -ne 0 ] ; do
slime@2
   179
	pathcomp=$pathcomp$1
slime@2
   180
	shift
slime@2
   181
slime@2
   182
	if [ ! -d "$pathcomp" ] ;
slime@2
   183
        then
slime@2
   184
		$mkdirprog "$pathcomp"
slime@2
   185
	else
slime@2
   186
		:
slime@2
   187
	fi
slime@2
   188
slime@2
   189
	pathcomp=$pathcomp/
slime@2
   190
done
slime@2
   191
fi
slime@2
   192
slime@2
   193
if [ x"$dir_arg" != x ]
slime@2
   194
then
slime@2
   195
	$doit $instcmd "$dst" &&
slime@2
   196
slime@2
   197
	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
slime@2
   198
	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
slime@2
   199
	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
slime@2
   200
	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
slime@2
   201
else
slime@2
   202
slime@2
   203
# If we're going to rename the final executable, determine the name now.
slime@2
   204
slime@2
   205
	if [ x"$transformarg" = x ]
slime@2
   206
	then
slime@2
   207
		dstfile=`basename "$dst"`
slime@2
   208
	else
slime@2
   209
		dstfile=`basename "$dst" $transformbasename |
slime@2
   210
			sed $transformarg`$transformbasename
slime@2
   211
	fi
slime@2
   212
slime@2
   213
# don't allow the sed command to completely eliminate the filename
slime@2
   214
slime@2
   215
	if [ x"$dstfile" = x ]
slime@2
   216
	then
slime@2
   217
		dstfile=`basename "$dst"`
slime@2
   218
	else
slime@2
   219
		:
slime@2
   220
	fi
slime@2
   221
slime@2
   222
# Make a couple of temp file names in the proper directory.
slime@2
   223
slime@2
   224
	dsttmp=$dstdir/#inst.$$#
slime@2
   225
	rmtmp=$dstdir/#rm.$$#
slime@2
   226
slime@2
   227
# Trap to clean up temp files at exit.
slime@2
   228
slime@2
   229
	trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
slime@2
   230
	trap '(exit $?); exit' 1 2 13 15
slime@2
   231
slime@2
   232
# Move or copy the file name to the temp name
slime@2
   233
slime@2
   234
	$doit $instcmd "$src" "$dsttmp" &&
slime@2
   235
slime@2
   236
# and set any options; do chmod last to preserve setuid bits
slime@2
   237
slime@2
   238
# If any of these fail, we abort the whole thing.  If we want to
slime@2
   239
# ignore errors from any of these, just make sure not to ignore
slime@2
   240
# errors from the above "$doit $instcmd $src $dsttmp" command.
slime@2
   241
slime@2
   242
	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
slime@2
   243
	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
slime@2
   244
	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
slime@2
   245
	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
slime@2
   246
slime@2
   247
# Now remove or move aside any old file at destination location.  We try this
slime@2
   248
# two ways since rm can't unlink itself on some systems and the destination
slime@2
   249
# file might be busy for other reasons.  In this case, the final cleanup
slime@2
   250
# might fail but the new file should still install successfully.
slime@2
   251
slime@2
   252
{
slime@2
   253
	if [ -f "$dstdir/$dstfile" ]
slime@2
   254
	then
slime@2
   255
		$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
slime@2
   256
		$doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
slime@2
   257
		{
slime@2
   258
		  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
slime@2
   259
		  (exit 1); exit
slime@2
   260
		}
slime@2
   261
	else
slime@2
   262
		:
slime@2
   263
	fi
slime@2
   264
} &&
slime@2
   265
slime@2
   266
# Now rename the file to the real destination.
slime@2
   267
slime@2
   268
	$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
slime@2
   269
slime@2
   270
fi &&
slime@2
   271
slime@2
   272
# The final little trick to "correctly" pass the exit status to the exit trap.
slime@2
   273
slime@2
   274
{
slime@2
   275
	(exit 0); exit
slime@2
   276
}