xref: /freebsd/contrib/bmake/mk/install-sh (revision 988758838533b24f5893b36514fe2c68a3f911a2)
1*98875883SSimon J. Gerraty#!/bin/sh
2*98875883SSimon J. Gerraty
3*98875883SSimon J. Gerraty# NAME:
4*98875883SSimon J. Gerraty#	install.sh - portable version of install(1)
5*98875883SSimon J. Gerraty#
6*98875883SSimon J. Gerraty# SYNOPSIS:
7*98875883SSimon J. Gerraty#	install [-CNcs] [-f flags] [-i errs] [-o owner] [-g group] [-m mode] file1 file2 ...
8*98875883SSimon J. Gerraty#	install -d  [-i errs] [-o owner] [-g group] [-m mode] directory ...
9*98875883SSimon J. Gerraty#
10*98875883SSimon J. Gerraty# DESCRIPTION:
11*98875883SSimon J. Gerraty#	Compatible with BSD install(1).  Except that '-c' is always
12*98875883SSimon J. Gerraty#	true and we always move an already installed target aside as
13*98875883SSimon J. Gerraty#	this is important on many systems.  Recent BSD install(1)
14*98875883SSimon J. Gerraty#	versions have a '-b' option for this.
15*98875883SSimon J. Gerraty#
16*98875883SSimon J. Gerraty#
17*98875883SSimon J. Gerraty# OPTIONS:
18*98875883SSimon J. Gerraty#	-b	move previous target file aside (always true).
19*98875883SSimon J. Gerraty#
20*98875883SSimon J. Gerraty#	-B "suffix"
21*98875883SSimon J. Gerraty#		use "suffix" instead of .old for saving existing target.
22*98875883SSimon J. Gerraty#
23*98875883SSimon J. Gerraty#	-c	copy rather than move the file into place (always true).
24*98875883SSimon J. Gerraty#
25*98875883SSimon J. Gerraty#	-C	compare.  Only install if target is missing or
26*98875883SSimon J. Gerraty#		different.
27*98875883SSimon J. Gerraty#
28*98875883SSimon J. Gerraty#	-N	newer. Only install if target is missing or older.
29*98875883SSimon J. Gerraty#
30*98875883SSimon J. Gerraty#	-s	strip target
31*98875883SSimon J. Gerraty#
32*98875883SSimon J. Gerraty#	-o "owner"
33*98875883SSimon J. Gerraty#		make target owned by "owner"
34*98875883SSimon J. Gerraty#
35*98875883SSimon J. Gerraty#	-g "group"
36*98875883SSimon J. Gerraty#		make target group owned by "group"
37*98875883SSimon J. Gerraty#
38*98875883SSimon J. Gerraty#	-m "mode"
39*98875883SSimon J. Gerraty#		set permissions to "mode"
40*98875883SSimon J. Gerraty#
41*98875883SSimon J. Gerraty#	-f "flags"
42*98875883SSimon J. Gerraty#		Pass "flags" onto chflags(1)
43*98875883SSimon J. Gerraty#
44*98875883SSimon J. Gerraty#	-i "errs"
45*98875883SSimon J. Gerraty#		Ignore errors from steps indicated by "errs" (``s,o,g,m'').
46*98875883SSimon J. Gerraty#
47*98875883SSimon J. Gerraty# BUGS:
48*98875883SSimon J. Gerraty#	The '-i' option is to save your sanity when 'bsd.prog.mk'
49*98875883SSimon J. Gerraty#	insists on haveing a '-o' "owner" option which is doomed to
50*98875883SSimon J. Gerraty#	fail on many systems.  We ignore '-b' and '-c' options.
51*98875883SSimon J. Gerraty#
52*98875883SSimon J. Gerraty# AUTHOR:
53*98875883SSimon J. Gerraty#	Simon J. Gerraty <sjg@crufty.net>
54*98875883SSimon J. Gerraty#
55*98875883SSimon J. Gerraty
56*98875883SSimon J. Gerraty# RCSid:
57*98875883SSimon J. Gerraty#	$Id: install-sh,v 1.25 2023/07/15 05:33:38 sjg Exp $
58*98875883SSimon J. Gerraty#
59*98875883SSimon J. Gerraty#	@(#) Copyright (c) 1993-2023 Simon J. Gerraty
60*98875883SSimon J. Gerraty#
61*98875883SSimon J. Gerraty#	This file is provided in the hope that it will
62*98875883SSimon J. Gerraty#	be of use.  There is absolutely NO WARRANTY.
63*98875883SSimon J. Gerraty#	Permission to copy, redistribute or otherwise
64*98875883SSimon J. Gerraty#	use this file is hereby granted provided that
65*98875883SSimon J. Gerraty#	the above copyright notice and this notice are
66*98875883SSimon J. Gerraty#	left intact.
67*98875883SSimon J. Gerraty#
68*98875883SSimon J. Gerraty#	Please send copies of changes and bug-fixes to:
69*98875883SSimon J. Gerraty#	sjg@crufty.net
70*98875883SSimon J. Gerraty#
71*98875883SSimon J. Gerraty
72*98875883SSimon J. Gerratyset -- `getopt B:bpxCNcsdo:g:m:i:f: $*`
73*98875883SSimon J. Gerraty
74*98875883SSimon J. GerratyMydir=`dirname $0`
75*98875883SSimon J. Gerraty[ -s $Mydir/.installrc ] && . $Mydir/.installrc
76*98875883SSimon J. Gerraty
77*98875883SSimon J. GerratyOLD_EXT=.old
78*98875883SSimon J. Gerratyowner=:
79*98875883SSimon J. Gerratygroup=:
80*98875883SSimon J. Gerratymode=:
81*98875883SSimon J. GerratyMODE=0
82*98875883SSimon J. Gerratystrip=:
83*98875883SSimon J. Gerratymkdirs=
84*98875883SSimon J. Gerratycompare=:
85*98875883SSimon J. Gerratynewer=:
86*98875883SSimon J. Gerratychflags=:
87*98875883SSimon J. GerratyLS_1=
88*98875883SSimon J. GerratyCP_p=
89*98875883SSimon J. Gerraty
90*98875883SSimon J. Gerratywhile :
91*98875883SSimon J. Gerratydo
92*98875883SSimon J. Gerraty	case "$1" in
93*98875883SSimon J. Gerraty	--)	shift; break;;
94*98875883SSimon J. Gerraty	-[bc])	;; # ignore
95*98875883SSimon J. Gerraty	-p)	CP_p=-p;;
96*98875883SSimon J. Gerraty	-x)	set -x;;
97*98875883SSimon J. Gerraty	-B)	OLD_EXT=$2; shift;;
98*98875883SSimon J. Gerraty	-C)	compare=Different;;
99*98875883SSimon J. Gerraty	-N)	newer=Newer;
100*98875883SSimon J. Gerraty		# check if /bin/ls supports -1
101*98875883SSimon J. Gerraty		'ls' -1 $0 > /dev/null 2>&1 && LS_1=1
102*98875883SSimon J. Gerraty		;;
103*98875883SSimon J. Gerraty	-o)	owner="${CHOWN:-chown} $2 "; shift;;
104*98875883SSimon J. Gerraty	-g)	group="${CHGRP:-chgrp} $2 "; shift;;
105*98875883SSimon J. Gerraty	-m)	MODE=$2 mode="${CHMOD:-chmod} $2 "; shift;;
106*98875883SSimon J. Gerraty	-s)	strip=${STRIP:-strip};;
107*98875883SSimon J. Gerraty	-d)	mkdirs="mkdir -p";;
108*98875883SSimon J. Gerraty	-i)	ignore_err="$ignore_err$2"; shift;;
109*98875883SSimon J. Gerraty	-f)	chflags="${CHFLAGS:-chflags} $2 "; shift;;
110*98875883SSimon J. Gerraty	*)	break;;
111*98875883SSimon J. Gerraty	esac
112*98875883SSimon J. Gerraty	shift
113*98875883SSimon J. Gerratydone
114*98875883SSimon J. Gerraty
115*98875883SSimon J. GerratyNewer() {
116*98875883SSimon J. Gerraty	n=`'ls' -t$LS_1 $* 2> /dev/null | head -1`
117*98875883SSimon J. Gerraty	[ $1 = $n ]
118*98875883SSimon J. Gerraty}
119*98875883SSimon J. Gerraty
120*98875883SSimon J. GerratyDifferent() {
121*98875883SSimon J. Gerraty	cmp -s $*
122*98875883SSimon J. Gerraty	[ $? != 0 ]
123*98875883SSimon J. Gerraty}
124*98875883SSimon J. Gerraty
125*98875883SSimon J. GerratyErr() {
126*98875883SSimon J. Gerraty	case "$ignore_err" in
127*98875883SSimon J. Gerraty	*$1*)	;;
128*98875883SSimon J. Gerraty	*)	exit 1;;
129*98875883SSimon J. Gerraty	esac
130*98875883SSimon J. Gerraty}
131*98875883SSimon J. Gerraty
132*98875883SSimon J. GerratySetem() {
133*98875883SSimon J. Gerraty	# the order is important
134*98875883SSimon J. Gerraty	if [ ! -d $1 ]; then
135*98875883SSimon J. Gerraty		$strip $1 || Err s
136*98875883SSimon J. Gerraty	fi
137*98875883SSimon J. Gerraty	$group $1 || Err g
138*98875883SSimon J. Gerraty	$owner $1 || Err o
139*98875883SSimon J. Gerraty	$mode  $1 || Err m
140*98875883SSimon J. Gerraty	$chflags $1 || Err f
141*98875883SSimon J. Gerraty	return 0
142*98875883SSimon J. Gerraty}
143*98875883SSimon J. Gerraty
144*98875883SSimon J. Gerraty# a bug in HP-UX's /bin/sh, means we need to re-set $*
145*98875883SSimon J. Gerraty# after any calls to add_path()
146*98875883SSimon J. Gerratyargs="$*"
147*98875883SSimon J. Gerraty
148*98875883SSimon J. Gerratyadd_path () {
149*98875883SSimon J. Gerraty	test -d $1 || return
150*98875883SSimon J. Gerraty	case ":$PATH:" in
151*98875883SSimon J. Gerraty	*:$1:*) return;;
152*98875883SSimon J. Gerraty	esac
153*98875883SSimon J. Gerraty	PATH=$PATH:$1
154*98875883SSimon J. Gerraty}
155*98875883SSimon J. Gerraty
156*98875883SSimon J. Gerratyadd_path /sbin
157*98875883SSimon J. Gerratyadd_path /usr/sbin
158*98875883SSimon J. Gerraty
159*98875883SSimon J. Gerratycase "$owner" in
160*98875883SSimon J. Gerraty:)	;;
161*98875883SSimon J. Gerraty*)	# some systems put chown in odd places
162*98875883SSimon J. Gerraty	add_path /etc
163*98875883SSimon J. Gerraty	add_path /usr/etc
164*98875883SSimon J. Gerraty	;;
165*98875883SSimon J. Gerratyesac
166*98875883SSimon J. Gerraty
167*98875883SSimon J. Gerraty# restore saved $*
168*98875883SSimon J. Gerratyset -- $args
169*98875883SSimon J. Gerraty
170*98875883SSimon J. Gerraty# make directories if needed
171*98875883SSimon J. Gerraty# and ensure mode etc are as desired
172*98875883SSimon J. Gerratyif [ "$mkdirs" ]; then
173*98875883SSimon J. Gerraty	case "$MODE" in
174*98875883SSimon J. Gerraty	[1-7]*)
175*98875883SSimon J. Gerraty		# make sure umask is compatible
176*98875883SSimon J. Gerraty		case "$MODE" in
177*98875883SSimon J. Gerraty		????*) MODE=`echo $MODE | sed 's,.*\(...\)$,\1,'`;;
178*98875883SSimon J. Gerraty		esac
179*98875883SSimon J. Gerraty		umask `expr 0777 - 0$MODE |
180*98875883SSimon J. Gerraty		sed 's,^,000,;s,^.*\(...\)$,\1,'`;;
181*98875883SSimon J. Gerraty	esac
182*98875883SSimon J. Gerraty	for d in $*
183*98875883SSimon J. Gerraty	do
184*98875883SSimon J. Gerraty		[ ! -d $d ] && $mkdirs $d
185*98875883SSimon J. Gerraty		Setem $d
186*98875883SSimon J. Gerraty	done
187*98875883SSimon J. Gerraty	exit 0			# that's all we do
188*98875883SSimon J. Gerratyfi
189*98875883SSimon J. Gerraty
190*98875883SSimon J. Gerraty# install files
191*98875883SSimon J. Gerratyif [ $# -eq 1 ]; then
192*98875883SSimon J. Gerraty	echo "what should I do with $*?" >&2
193*98875883SSimon J. Gerraty	exit 1
194*98875883SSimon J. Gerratyfi
195*98875883SSimon J. Gerraty
196*98875883SSimon J. Gerraty# get list of files
197*98875883SSimon J. Gerratyfiles=
198*98875883SSimon J. Gerratywhile [ $# -gt 1 ]
199*98875883SSimon J. Gerratydo
200*98875883SSimon J. Gerraty	test "x$files" = x || dest_dir=yes
201*98875883SSimon J. Gerraty	files="$files $1"
202*98875883SSimon J. Gerraty	shift
203*98875883SSimon J. Gerratydone
204*98875883SSimon J. Gerraty# last one is dest
205*98875883SSimon J. Gerratydest=$1
206*98875883SSimon J. Gerratyshift
207*98875883SSimon J. Gerraty
208*98875883SSimon J. Gerratyif [ "$dest_dir" = yes -a  ! -d $dest ]; then
209*98875883SSimon J. Gerraty	echo "no directory $dest" >&2
210*98875883SSimon J. Gerraty	exit 1
211*98875883SSimon J. Gerratyfi
212*98875883SSimon J. Gerraty
213*98875883SSimon J. Gerratyfor f in $files
214*98875883SSimon J. Gerratydo
215*98875883SSimon J. Gerraty	b=`basename $f`
216*98875883SSimon J. Gerraty	if [ -d $dest ]; then
217*98875883SSimon J. Gerraty		t=$dest/$b
218*98875883SSimon J. Gerraty	else
219*98875883SSimon J. Gerraty		t=$dest
220*98875883SSimon J. Gerraty	fi
221*98875883SSimon J. Gerraty	$newer $f $t || continue
222*98875883SSimon J. Gerraty	$compare $f $t || continue
223*98875883SSimon J. Gerraty	[ -f $t ] && { mv -f $t $t$OLD_EXT || exit 1; }
224*98875883SSimon J. Gerraty	{ cp $CP_p $f $t && Setem $t; } || exit 1
225*98875883SSimon J. Gerratydone
226*98875883SSimon J. Gerratyexit 0
227