locate(1): Bring in some updates/fixes from FreeBSD
[dragonfly.git] / contrib / bmake / install-sh
bloba2473298efcb58baaf7b9ed24ec0b04a9cf406d5
2 # NAME:
3 #       install.sh - portable version of install(1)
5 # SYNOPSIS:
6 #       install [-CNcs] [-f flags] [-i errs] [-o owner] [-g group] [-m mode] file1 file2 ...
7 #       install -d  [-i errs] [-o owner] [-g group] [-m mode] directory ...
9 # DESCRIPTION:
10 #       Compatible with BSD install(1).  Except that '-c' is always
11 #       true and we always move an already installed target aside as
12 #       this is important on many systems.  Recent BSD install(1)
13 #       versions have a '-b' option for this.
14 #       
16 # OPTIONS:
17 #       -b      move previous target file aside (always true).
19 #       -B "suffix"
20 #               use "suffix" instead of .old for saving existing target.
21 #       
22 #       -c      copy rather than move the file into place (always true).
24 #       -C      compare.  Only install if target is missing or
25 #               different.
27 #       -N      newer. Only install if target is missing or older.
28 #       
29 #       -s      strip target
31 #       -o "owner"
32 #               make target owned by "owner"
34 #       -g "group"
35 #               make target group owned by "group"
37 #       -m "mode"
38 #               set permissions to "mode"
40 #       -f "flags"
41 #               Pass "flags" onto chflags(1)
42 #               
43 #       -i "errs"
44 #               Ignore errors from steps indicated by "errs" (``s,o,g,m'').
46 # BUGS:
47 #       The '-i' option is to save your sanity when 'bsd.prog.mk'
48 #       insists on haveing a '-o' "owner" option which is doomed to
49 #       fail on many systems.  We ignore '-b', '-B' and '-c' options.
50 #       
51 # AUTHOR:
52 #       Simon J. Gerraty <sjg@quick.com.au>
55 # RCSid:
56 #       $Id: install-sh,v 1.18 2001/03/16 17:33:02 sjg Exp $
58 #       @(#) Copyright (c) 1993 Simon J. Gerraty
60 #       This file is provided in the hope that it will
61 #       be of use.  There is absolutely NO WARRANTY.
62 #       Permission to copy, redistribute or otherwise
63 #       use this file is hereby granted provided that 
64 #       the above copyright notice and this notice are
65 #       left intact. 
66 #      
67 #       Please send copies of changes and bug-fixes to:
68 #       sjg@quick.com.au
71 set -- `getopt B:bpxCNcsdo:g:m:i:f: $*`
73 Mydir=`dirname $0`
74 [ -s $Mydir/.installrc ] && . $Mydir/.installrc
76 owner=:
77 group=:
78 mode=:
79 strip=:
80 mkdirs=
81 compare=:
82 newer=:
83 chflags=:
84 LS1=
85 CP_P=
87 while [ $# -gt 1 ]
89         case $1 in
90         --)     shift; break;;
91         -p)     CP_P=-p;;
92         -x)     set -x;;
93         -B)     OLD_EXT=$2; shift;;
94         -C)     compare=Different;;
95         -N)     newer=Newer;
96                 # check if /bin/ls supports -1
97                 /bin/ls -1 $0 >/dev/null 2>&1 && LS1=1
98                 ;;
99         -o)     owner="${CHOWN:-chown} $2 "; shift;;
100         -g)     group="${CHGRP:-chgrp} $2 "; shift;;
101         -m)     mode="${CHMOD:-chmod} $2 "; shift;;
102         -s)     strip=${STRIP:-strip};;
103         -d)     mkdirs="mkdir -p";;
104         -i)     ignore_err="$ignore_err$2"; shift;;
105         -f)     chflags="${CHFLAGS:-chflags} $2 "; shift;;
106         esac
107         shift
108 done
110 Newer() {
111         n=`/bin/ls -t$LS1 $* 2>/dev/null | head -1`
112         [ $1 = $n ]
115 Different() {
116         cmp -s $*
117         [ $? != 0 ]
120 Err() {
121         case "$ignore_err" in
122         *$1*)   ;;
123         *)      exit 1;;
124         esac
127 Setem() {
128         # the order is important
129         if [ ! -d $1 ]; then
130                 $strip $1 || Err s
131         fi
132         $group $1 || Err g
133         $owner $1 || Err o
134         $mode  $1 || Err m
135         $chflags  $1 || Err f
136         return 0
139 # a bug in HP-UX's /bin/sh, means we need to re-set $*
140 # after any calls to add_path()
141 args="$*"
143 # all this just for chown!
144 add_path () { [ -d $1 ] && eval ${2:-PATH}="\$${2:-PATH}:$1"; }
145 add_path /etc
146 add_path /usr/etc
147 add_path /sbin
148 add_path /usr/sbin
150 # restore saved $*
151 set -- $args
153 # make directories if needed
154 # and ensure mode etc are as desired
155 if [ "$mkdirs" ]; then
156         for d in $*
157         do
158                 [ ! -d $d ] && $mkdirs $d
159                 Setem $d
160         done
161         exit 0                  # that's all we do
164 # install files
165 if [ $# -gt 2 ]; then
166         dest_dir=yes
167 elif [ $# -eq 1 ]; then
168         echo "what should I do with $*?" >&2
169         exit 1
172 # get list of files
173 while [ $# -gt 1 ]
175         files="$files $1"
176         shift
177 done
178 # last one is dest
179 dest=$1
180 shift
183 if [ "$dest_dir" = yes -a  ! -d $dest ]; then
184         echo "no directory $dest" >&2
185         exit 1
188 for f in $files
190         b=`basename $f`
191         if [ -d $dest ]; then
192                 t=$dest/$b
193         else
194                 t=$dest
195         fi
196         $newer $f $t || continue
197         $compare $f $t || continue
198         [ -f $t ] && { mv -f $t $t.old || exit 1; }
199         { cp $CP_P $f $t && Setem $t; } || exit 1
200 done
201 exit 0