xref: /freebsd/contrib/ncurses/install-sh (revision 15589c42fa2774d2f8ee650f4f31eb8d3a861316)
10e3d5408SPeter Wemm#! /bin/sh
20e3d5408SPeter Wemm#
30e3d5408SPeter Wemm# install - install a program, script, or datafile
415589c42SPeter Wemm# This comes from X11R5 (mit/util/scripts/install.sh).
515589c42SPeter Wemm#
615589c42SPeter Wemm# Copyright 1991 by the Massachusetts Institute of Technology
715589c42SPeter Wemm#
815589c42SPeter Wemm# Permission to use, copy, modify, distribute, and sell this software and its
915589c42SPeter Wemm# documentation for any purpose is hereby granted without fee, provided that
1015589c42SPeter Wemm# the above copyright notice appear in all copies and that both that
1115589c42SPeter Wemm# copyright notice and this permission notice appear in supporting
1215589c42SPeter Wemm# documentation, and that the name of M.I.T. not be used in advertising or
1315589c42SPeter Wemm# publicity pertaining to distribution of the software without specific,
1415589c42SPeter Wemm# written prior permission.  M.I.T. makes no representations about the
1515589c42SPeter Wemm# suitability of this software for any purpose.  It is provided "as is"
1615589c42SPeter Wemm# without express or implied warranty.
170e3d5408SPeter Wemm#
180e3d5408SPeter Wemm# Calling this script install-sh is preferred over install.sh, to prevent
190e3d5408SPeter Wemm# `make' implicit rules from creating a file called install from it
200e3d5408SPeter Wemm# when there is no Makefile.
210e3d5408SPeter Wemm#
220e3d5408SPeter Wemm# This script is compatible with the BSD install script, but was written
2315589c42SPeter Wemm# from scratch.  It can only install one file at a time, a restriction
2415589c42SPeter Wemm# shared with many OS's install programs.
250e3d5408SPeter Wemm
260e3d5408SPeter Wemm
270e3d5408SPeter Wemm# set DOITPROG to echo to test this script
280e3d5408SPeter Wemm
290e3d5408SPeter Wemm# Don't use :- since 4.3BSD and earlier shells don't like it.
300e3d5408SPeter Wemmdoit="${DOITPROG-}"
310e3d5408SPeter Wemm
320e3d5408SPeter Wemm
330e3d5408SPeter Wemm# put in absolute paths if you don't have them in your path; or use env. vars.
340e3d5408SPeter Wemm
350e3d5408SPeter Wemmmvprog="${MVPROG-mv}"
360e3d5408SPeter Wemmcpprog="${CPPROG-cp}"
370e3d5408SPeter Wemmchmodprog="${CHMODPROG-chmod}"
380e3d5408SPeter Wemmchownprog="${CHOWNPROG-chown}"
390e3d5408SPeter Wemmchgrpprog="${CHGRPPROG-chgrp}"
400e3d5408SPeter Wemmstripprog="${STRIPPROG-strip}"
410e3d5408SPeter Wemmrmprog="${RMPROG-rm}"
420e3d5408SPeter Wemmmkdirprog="${MKDIRPROG-mkdir}"
430e3d5408SPeter Wemm
4415589c42SPeter Wemmtransformbasename=""
450e3d5408SPeter Wemmtransform_arg=""
460e3d5408SPeter Wemminstcmd="$mvprog"
470e3d5408SPeter Wemmchmodcmd="$chmodprog 0755"
480e3d5408SPeter Wemmchowncmd=""
490e3d5408SPeter Wemmchgrpcmd=""
500e3d5408SPeter Wemmstripcmd=""
510e3d5408SPeter Wemmrmcmd="$rmprog -f"
520e3d5408SPeter Wemmmvcmd="$mvprog"
530e3d5408SPeter Wemmsrc=""
540e3d5408SPeter Wemmdst=""
550e3d5408SPeter Wemmdir_arg=""
560e3d5408SPeter Wemm
570e3d5408SPeter Wemmwhile [ x"$1" != x ]; do
580e3d5408SPeter Wemm    case $1 in
590e3d5408SPeter Wemm	-c) instcmd="$cpprog"
600e3d5408SPeter Wemm	    shift
610e3d5408SPeter Wemm	    continue;;
620e3d5408SPeter Wemm
630e3d5408SPeter Wemm	-d) dir_arg=true
640e3d5408SPeter Wemm	    shift
650e3d5408SPeter Wemm	    continue;;
660e3d5408SPeter Wemm
670e3d5408SPeter Wemm	-m) chmodcmd="$chmodprog $2"
680e3d5408SPeter Wemm	    shift
690e3d5408SPeter Wemm	    shift
700e3d5408SPeter Wemm	    continue;;
710e3d5408SPeter Wemm
720e3d5408SPeter Wemm	-o) chowncmd="$chownprog $2"
730e3d5408SPeter Wemm	    shift
740e3d5408SPeter Wemm	    shift
750e3d5408SPeter Wemm	    continue;;
760e3d5408SPeter Wemm
770e3d5408SPeter Wemm	-g) chgrpcmd="$chgrpprog $2"
780e3d5408SPeter Wemm	    shift
790e3d5408SPeter Wemm	    shift
800e3d5408SPeter Wemm	    continue;;
810e3d5408SPeter Wemm
820e3d5408SPeter Wemm	-s) stripcmd="$stripprog"
830e3d5408SPeter Wemm	    shift
840e3d5408SPeter Wemm	    continue;;
850e3d5408SPeter Wemm
860e3d5408SPeter Wemm	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
870e3d5408SPeter Wemm	    shift
880e3d5408SPeter Wemm	    continue;;
890e3d5408SPeter Wemm
900e3d5408SPeter Wemm	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
910e3d5408SPeter Wemm	    shift
920e3d5408SPeter Wemm	    continue;;
930e3d5408SPeter Wemm
940e3d5408SPeter Wemm	*)  if [ x"$src" = x ]
950e3d5408SPeter Wemm	    then
960e3d5408SPeter Wemm		src=$1
970e3d5408SPeter Wemm	    else
980e3d5408SPeter Wemm		# this colon is to work around a 386BSD /bin/sh bug
990e3d5408SPeter Wemm		:
1000e3d5408SPeter Wemm		dst=$1
1010e3d5408SPeter Wemm	    fi
1020e3d5408SPeter Wemm	    shift
1030e3d5408SPeter Wemm	    continue;;
1040e3d5408SPeter Wemm    esac
1050e3d5408SPeter Wemmdone
1060e3d5408SPeter Wemm
1070e3d5408SPeter Wemmif [ x"$src" = x ]
1080e3d5408SPeter Wemmthen
1090e3d5408SPeter Wemm	echo "install:	no input file specified"
1100e3d5408SPeter Wemm	exit 1
1110e3d5408SPeter Wemmelse
1120e3d5408SPeter Wemm	true
1130e3d5408SPeter Wemmfi
1140e3d5408SPeter Wemm
1150e3d5408SPeter Wemmif [ x"$dir_arg" != x ]; then
1160e3d5408SPeter Wemm	dst=$src
1170e3d5408SPeter Wemm	src=""
1180e3d5408SPeter Wemm
1190e3d5408SPeter Wemm	if [ -d $dst ]; then
1200e3d5408SPeter Wemm		instcmd=:
1210e3d5408SPeter Wemm	else
1220e3d5408SPeter Wemm		instcmd=mkdir
1230e3d5408SPeter Wemm	fi
1240e3d5408SPeter Wemmelse
1250e3d5408SPeter Wemm
1260e3d5408SPeter Wemm# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
1270e3d5408SPeter Wemm# might cause directories to be created, which would be especially bad
1280e3d5408SPeter Wemm# if $src (and thus $dsttmp) contains '*'.
1290e3d5408SPeter Wemm
1300e3d5408SPeter Wemm	if [ -f $src -o -d $src ]
1310e3d5408SPeter Wemm	then
1320e3d5408SPeter Wemm		true
1330e3d5408SPeter Wemm	else
1340e3d5408SPeter Wemm		echo "install:  $src does not exist"
1350e3d5408SPeter Wemm		exit 1
1360e3d5408SPeter Wemm	fi
1370e3d5408SPeter Wemm
1380e3d5408SPeter Wemm	if [ x"$dst" = x ]
1390e3d5408SPeter Wemm	then
1400e3d5408SPeter Wemm		echo "install:	no destination specified"
1410e3d5408SPeter Wemm		exit 1
1420e3d5408SPeter Wemm	else
1430e3d5408SPeter Wemm		true
1440e3d5408SPeter Wemm	fi
1450e3d5408SPeter Wemm
1460e3d5408SPeter Wemm# If destination is a directory, append the input filename; if your system
1470e3d5408SPeter Wemm# does not like double slashes in filenames, you may need to add some logic
1480e3d5408SPeter Wemm
1490e3d5408SPeter Wemm	if [ -d $dst ]
1500e3d5408SPeter Wemm	then
1510e3d5408SPeter Wemm		dst="$dst"/`basename $src`
1520e3d5408SPeter Wemm	else
1530e3d5408SPeter Wemm		true
1540e3d5408SPeter Wemm	fi
1550e3d5408SPeter Wemmfi
1560e3d5408SPeter Wemm
1570e3d5408SPeter Wemm## this sed command emulates the dirname command
1580e3d5408SPeter Wemmdstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
1590e3d5408SPeter Wemm
1600e3d5408SPeter Wemm# Make sure that the destination directory exists.
1610e3d5408SPeter Wemm#  this part is taken from Noah Friedman's mkinstalldirs script
1620e3d5408SPeter Wemm
1630e3d5408SPeter Wemm# Skip lots of stat calls in the usual case.
1640e3d5408SPeter Wemmif [ ! -d "$dstdir" ]; then
1650e3d5408SPeter WemmdefaultIFS='
1660e3d5408SPeter Wemm'
1670e3d5408SPeter WemmIFS="${IFS-${defaultIFS}}"
1680e3d5408SPeter Wemm
1690e3d5408SPeter WemmoIFS="${IFS}"
1700e3d5408SPeter Wemm# Some sh's can't handle IFS=/ for some reason.
1710e3d5408SPeter WemmIFS='%'
1720e3d5408SPeter Wemmset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
1730e3d5408SPeter WemmIFS="${oIFS}"
1740e3d5408SPeter Wemm
1750e3d5408SPeter Wemmpathcomp=''
1760e3d5408SPeter Wemm
1770e3d5408SPeter Wemmwhile [ $# -ne 0 ] ; do
1780e3d5408SPeter Wemm	pathcomp="${pathcomp}${1}"
1790e3d5408SPeter Wemm	shift
1800e3d5408SPeter Wemm
1810e3d5408SPeter Wemm	if [ ! -d "${pathcomp}" ] ;
1820e3d5408SPeter Wemm        then
1830e3d5408SPeter Wemm		$mkdirprog "${pathcomp}"
1840e3d5408SPeter Wemm	else
1850e3d5408SPeter Wemm		true
1860e3d5408SPeter Wemm	fi
1870e3d5408SPeter Wemm
1880e3d5408SPeter Wemm	pathcomp="${pathcomp}/"
1890e3d5408SPeter Wemmdone
1900e3d5408SPeter Wemmfi
1910e3d5408SPeter Wemm
1920e3d5408SPeter Wemmif [ x"$dir_arg" != x ]
1930e3d5408SPeter Wemmthen
1940e3d5408SPeter Wemm	$doit $instcmd $dst &&
1950e3d5408SPeter Wemm
1960e3d5408SPeter Wemm	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
1970e3d5408SPeter Wemm	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
1980e3d5408SPeter Wemm	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
1990e3d5408SPeter Wemm	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
2000e3d5408SPeter Wemmelse
2010e3d5408SPeter Wemm
2020e3d5408SPeter Wemm# If we're going to rename the final executable, determine the name now.
2030e3d5408SPeter Wemm
2040e3d5408SPeter Wemm	if [ x"$transformarg" = x ]
2050e3d5408SPeter Wemm	then
2060e3d5408SPeter Wemm		dstfile=`basename $dst`
2070e3d5408SPeter Wemm	else
2080e3d5408SPeter Wemm		dstfile=`basename $dst $transformbasename |
2090e3d5408SPeter Wemm			sed $transformarg`$transformbasename
2100e3d5408SPeter Wemm	fi
2110e3d5408SPeter Wemm
2120e3d5408SPeter Wemm# don't allow the sed command to completely eliminate the filename
2130e3d5408SPeter Wemm
2140e3d5408SPeter Wemm	if [ x"$dstfile" = x ]
2150e3d5408SPeter Wemm	then
2160e3d5408SPeter Wemm		dstfile=`basename $dst`
2170e3d5408SPeter Wemm	else
2180e3d5408SPeter Wemm		true
2190e3d5408SPeter Wemm	fi
2200e3d5408SPeter Wemm
2210e3d5408SPeter Wemm# Make a temp file name in the proper directory.
2220e3d5408SPeter Wemm
2230e3d5408SPeter Wemm	dsttmp=$dstdir/#inst.$$#
2240e3d5408SPeter Wemm
2250e3d5408SPeter Wemm# Move or copy the file name to the temp name
2260e3d5408SPeter Wemm
2270e3d5408SPeter Wemm	$doit $instcmd $src $dsttmp &&
2280e3d5408SPeter Wemm
2290e3d5408SPeter Wemm	trap "rm -f ${dsttmp}" 0 &&
2300e3d5408SPeter Wemm
2310e3d5408SPeter Wemm# and set any options; do chmod last to preserve setuid bits
2320e3d5408SPeter Wemm
2330e3d5408SPeter Wemm# If any of these fail, we abort the whole thing.  If we want to
2340e3d5408SPeter Wemm# ignore errors from any of these, just make sure not to ignore
2350e3d5408SPeter Wemm# errors from the above "$doit $instcmd $src $dsttmp" command.
2360e3d5408SPeter Wemm
2370e3d5408SPeter Wemm	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
2380e3d5408SPeter Wemm	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
2390e3d5408SPeter Wemm	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
2400e3d5408SPeter Wemm	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
2410e3d5408SPeter Wemm
2420e3d5408SPeter Wemm# Now rename the file to the real destination.
2430e3d5408SPeter Wemm
2440e3d5408SPeter Wemm	$doit $rmcmd -f $dstdir/$dstfile &&
2450e3d5408SPeter Wemm	$doit $mvcmd $dsttmp $dstdir/$dstfile
2460e3d5408SPeter Wemm
2470e3d5408SPeter Wemmfi &&
2480e3d5408SPeter Wemm
2490e3d5408SPeter Wemm
2500e3d5408SPeter Wemmexit 0
251