xref: /freebsd/contrib/bmake/install-sh (revision c59c3bf34db360695f07735bebc76a768cac5afc)
198875883SSimon J. Gerraty#!/bin/sh
298875883SSimon J. Gerraty
33955d011SMarcel Moolenaar# NAME:
43955d011SMarcel Moolenaar#	install.sh - portable version of install(1)
53955d011SMarcel Moolenaar#
63955d011SMarcel Moolenaar# SYNOPSIS:
73955d011SMarcel Moolenaar#	install [-CNcs] [-f flags] [-i errs] [-o owner] [-g group] [-m mode] file1 file2 ...
83955d011SMarcel Moolenaar#	install -d  [-i errs] [-o owner] [-g group] [-m mode] directory ...
93955d011SMarcel Moolenaar#
103955d011SMarcel Moolenaar# DESCRIPTION:
113955d011SMarcel Moolenaar#	Compatible with BSD install(1).  Except that '-c' is always
123955d011SMarcel Moolenaar#	true and we always move an already installed target aside as
133955d011SMarcel Moolenaar#	this is important on many systems.  Recent BSD install(1)
143955d011SMarcel Moolenaar#	versions have a '-b' option for this.
153955d011SMarcel Moolenaar#
163955d011SMarcel Moolenaar#
173955d011SMarcel Moolenaar# OPTIONS:
183955d011SMarcel Moolenaar#	-b	move previous target file aside (always true).
193955d011SMarcel Moolenaar#
203955d011SMarcel Moolenaar#	-B "suffix"
213955d011SMarcel Moolenaar#		use "suffix" instead of .old for saving existing target.
223955d011SMarcel Moolenaar#
233955d011SMarcel Moolenaar#	-c	copy rather than move the file into place (always true).
243955d011SMarcel Moolenaar#
253955d011SMarcel Moolenaar#	-C	compare.  Only install if target is missing or
263955d011SMarcel Moolenaar#		different.
273955d011SMarcel Moolenaar#
283955d011SMarcel Moolenaar#	-N	newer. Only install if target is missing or older.
293955d011SMarcel Moolenaar#
303955d011SMarcel Moolenaar#	-s	strip target
313955d011SMarcel Moolenaar#
323955d011SMarcel Moolenaar#	-o "owner"
333955d011SMarcel Moolenaar#		make target owned by "owner"
343955d011SMarcel Moolenaar#
353955d011SMarcel Moolenaar#	-g "group"
363955d011SMarcel Moolenaar#		make target group owned by "group"
373955d011SMarcel Moolenaar#
383955d011SMarcel Moolenaar#	-m "mode"
393955d011SMarcel Moolenaar#		set permissions to "mode"
403955d011SMarcel Moolenaar#
413955d011SMarcel Moolenaar#	-f "flags"
423955d011SMarcel Moolenaar#		Pass "flags" onto chflags(1)
433955d011SMarcel Moolenaar#
443955d011SMarcel Moolenaar#	-i "errs"
453955d011SMarcel Moolenaar#		Ignore errors from steps indicated by "errs" (``s,o,g,m'').
463955d011SMarcel Moolenaar#
473955d011SMarcel Moolenaar# BUGS:
483955d011SMarcel Moolenaar#	The '-i' option is to save your sanity when 'bsd.prog.mk'
493955d011SMarcel Moolenaar#	insists on haveing a '-o' "owner" option which is doomed to
5098875883SSimon J. Gerraty#	fail on many systems.  We ignore '-b' and '-c' options.
513955d011SMarcel Moolenaar#
523955d011SMarcel Moolenaar# AUTHOR:
53dc1b8c9aSSimon J. Gerraty#	Simon J. Gerraty <sjg@crufty.net>
543955d011SMarcel Moolenaar#
553955d011SMarcel Moolenaar
56*c59c3bf3SSimon J. Gerraty# SPDX-License-Identifier: BSD-2-Clause
57*c59c3bf3SSimon J. Gerraty#
583955d011SMarcel Moolenaar# RCSid:
59*c59c3bf3SSimon J. Gerraty#	$Id: install-sh,v 1.26 2024/02/17 17:26:57 sjg Exp $
603955d011SMarcel Moolenaar#
61dc1b8c9aSSimon J. Gerraty#	@(#) Copyright (c) 1993-2023 Simon J. Gerraty
623955d011SMarcel Moolenaar#
633955d011SMarcel Moolenaar#	This file is provided in the hope that it will
643955d011SMarcel Moolenaar#	be of use.  There is absolutely NO WARRANTY.
653955d011SMarcel Moolenaar#	Permission to copy, redistribute or otherwise
663955d011SMarcel Moolenaar#	use this file is hereby granted provided that
673955d011SMarcel Moolenaar#	the above copyright notice and this notice are
683955d011SMarcel Moolenaar#	left intact.
693955d011SMarcel Moolenaar#
703955d011SMarcel Moolenaar#	Please send copies of changes and bug-fixes to:
71dc1b8c9aSSimon J. Gerraty#	sjg@crufty.net
723955d011SMarcel Moolenaar#
733955d011SMarcel Moolenaar
743955d011SMarcel Moolenaarset -- `getopt B:bpxCNcsdo:g:m:i:f: $*`
753955d011SMarcel Moolenaar
763955d011SMarcel MoolenaarMydir=`dirname $0`
773955d011SMarcel Moolenaar[ -s $Mydir/.installrc ] && . $Mydir/.installrc
783955d011SMarcel Moolenaar
7998875883SSimon J. GerratyOLD_EXT=.old
803955d011SMarcel Moolenaarowner=:
813955d011SMarcel Moolenaargroup=:
823955d011SMarcel Moolenaarmode=:
83dc1b8c9aSSimon J. GerratyMODE=0
843955d011SMarcel Moolenaarstrip=:
853955d011SMarcel Moolenaarmkdirs=
863955d011SMarcel Moolenaarcompare=:
873955d011SMarcel Moolenaarnewer=:
883955d011SMarcel Moolenaarchflags=:
89dc1b8c9aSSimon J. GerratyLS_1=
90dc1b8c9aSSimon J. GerratyCP_p=
913955d011SMarcel Moolenaar
92dc1b8c9aSSimon J. Gerratywhile :
933955d011SMarcel Moolenaardo
94dc1b8c9aSSimon J. Gerraty	case "$1" in
953955d011SMarcel Moolenaar	--)	shift; break;;
9698875883SSimon J. Gerraty	-[bc])	;; # ignore
97dc1b8c9aSSimon J. Gerraty	-p)	CP_p=-p;;
983955d011SMarcel Moolenaar	-x)	set -x;;
993955d011SMarcel Moolenaar	-B)	OLD_EXT=$2; shift;;
1003955d011SMarcel Moolenaar	-C)	compare=Different;;
1013955d011SMarcel Moolenaar	-N)	newer=Newer;
1023955d011SMarcel Moolenaar		# check if /bin/ls supports -1
103dc1b8c9aSSimon J. Gerraty		'ls' -1 $0 > /dev/null 2>&1 && LS_1=1
1043955d011SMarcel Moolenaar		;;
1053955d011SMarcel Moolenaar	-o)	owner="${CHOWN:-chown} $2 "; shift;;
1063955d011SMarcel Moolenaar	-g)	group="${CHGRP:-chgrp} $2 "; shift;;
107dc1b8c9aSSimon J. Gerraty	-m)	MODE=$2 mode="${CHMOD:-chmod} $2 "; shift;;
1083955d011SMarcel Moolenaar	-s)	strip=${STRIP:-strip};;
1093955d011SMarcel Moolenaar	-d)	mkdirs="mkdir -p";;
1103955d011SMarcel Moolenaar	-i)	ignore_err="$ignore_err$2"; shift;;
1113955d011SMarcel Moolenaar	-f)	chflags="${CHFLAGS:-chflags} $2 "; shift;;
112dc1b8c9aSSimon J. Gerraty	*)	break;;
1133955d011SMarcel Moolenaar	esac
1143955d011SMarcel Moolenaar	shift
1153955d011SMarcel Moolenaardone
1163955d011SMarcel Moolenaar
1173955d011SMarcel MoolenaarNewer() {
118dc1b8c9aSSimon J. Gerraty	n=`'ls' -t$LS_1 $* 2> /dev/null | head -1`
1193955d011SMarcel Moolenaar	[ $1 = $n ]
1203955d011SMarcel Moolenaar}
1213955d011SMarcel Moolenaar
1223955d011SMarcel MoolenaarDifferent() {
1233955d011SMarcel Moolenaar	cmp -s $*
1243955d011SMarcel Moolenaar	[ $? != 0 ]
1253955d011SMarcel Moolenaar}
1263955d011SMarcel Moolenaar
1273955d011SMarcel MoolenaarErr() {
1283955d011SMarcel Moolenaar	case "$ignore_err" in
1293955d011SMarcel Moolenaar	*$1*)	;;
1303955d011SMarcel Moolenaar	*)	exit 1;;
1313955d011SMarcel Moolenaar	esac
1323955d011SMarcel Moolenaar}
1333955d011SMarcel Moolenaar
1343955d011SMarcel MoolenaarSetem() {
1353955d011SMarcel Moolenaar	# the order is important
1363955d011SMarcel Moolenaar	if [ ! -d $1 ]; then
1373955d011SMarcel Moolenaar		$strip $1 || Err s
1383955d011SMarcel Moolenaar	fi
1393955d011SMarcel Moolenaar	$group $1 || Err g
1403955d011SMarcel Moolenaar	$owner $1 || Err o
1413955d011SMarcel Moolenaar	$mode  $1 || Err m
1423955d011SMarcel Moolenaar	$chflags $1 || Err f
1433955d011SMarcel Moolenaar	return 0
1443955d011SMarcel Moolenaar}
1453955d011SMarcel Moolenaar
1463955d011SMarcel Moolenaar# a bug in HP-UX's /bin/sh, means we need to re-set $*
1473955d011SMarcel Moolenaar# after any calls to add_path()
1483955d011SMarcel Moolenaarargs="$*"
1493955d011SMarcel Moolenaar
150dc1b8c9aSSimon J. Gerratyadd_path () {
151dc1b8c9aSSimon J. Gerraty	test -d $1 || return
152dc1b8c9aSSimon J. Gerraty	case ":$PATH:" in
153dc1b8c9aSSimon J. Gerraty	*:$1:*) return;;
154dc1b8c9aSSimon J. Gerraty	esac
155dc1b8c9aSSimon J. Gerraty	PATH=$PATH:$1
156dc1b8c9aSSimon J. Gerraty}
157dc1b8c9aSSimon J. Gerraty
1583955d011SMarcel Moolenaaradd_path /sbin
1593955d011SMarcel Moolenaaradd_path /usr/sbin
1603955d011SMarcel Moolenaar
161dc1b8c9aSSimon J. Gerratycase "$owner" in
162dc1b8c9aSSimon J. Gerraty:)	;;
16398875883SSimon J. Gerraty*)	# some systems put chown in odd places
164dc1b8c9aSSimon J. Gerraty	add_path /etc
165dc1b8c9aSSimon J. Gerraty	add_path /usr/etc
166dc1b8c9aSSimon J. Gerraty	;;
167dc1b8c9aSSimon J. Gerratyesac
168dc1b8c9aSSimon J. Gerraty
1693955d011SMarcel Moolenaar# restore saved $*
1703955d011SMarcel Moolenaarset -- $args
1713955d011SMarcel Moolenaar
1723955d011SMarcel Moolenaar# make directories if needed
1733955d011SMarcel Moolenaar# and ensure mode etc are as desired
1743955d011SMarcel Moolenaarif [ "$mkdirs" ]; then
175dc1b8c9aSSimon J. Gerraty	case "$MODE" in
176dc1b8c9aSSimon J. Gerraty	[1-7]*)
177dc1b8c9aSSimon J. Gerraty		# make sure umask is compatible
178dc1b8c9aSSimon J. Gerraty		case "$MODE" in
179dc1b8c9aSSimon J. Gerraty		????*) MODE=`echo $MODE | sed 's,.*\(...\)$,\1,'`;;
180dc1b8c9aSSimon J. Gerraty		esac
181dc1b8c9aSSimon J. Gerraty		umask `expr 0777 - 0$MODE |
182dc1b8c9aSSimon J. Gerraty		sed 's,^,000,;s,^.*\(...\)$,\1,'`;;
183dc1b8c9aSSimon J. Gerraty	esac
1843955d011SMarcel Moolenaar	for d in $*
1853955d011SMarcel Moolenaar	do
1863955d011SMarcel Moolenaar		[ ! -d $d ] && $mkdirs $d
1873955d011SMarcel Moolenaar		Setem $d
1883955d011SMarcel Moolenaar	done
1893955d011SMarcel Moolenaar	exit 0			# that's all we do
1903955d011SMarcel Moolenaarfi
1913955d011SMarcel Moolenaar
1923955d011SMarcel Moolenaar# install files
19398875883SSimon J. Gerratyif [ $# -eq 1 ]; then
1943955d011SMarcel Moolenaar	echo "what should I do with $*?" >&2
1953955d011SMarcel Moolenaar	exit 1
1963955d011SMarcel Moolenaarfi
1973955d011SMarcel Moolenaar
1983955d011SMarcel Moolenaar# get list of files
19998875883SSimon J. Gerratyfiles=
2003955d011SMarcel Moolenaarwhile [ $# -gt 1 ]
2013955d011SMarcel Moolenaardo
20298875883SSimon J. Gerraty	test "x$files" = x || dest_dir=yes
2033955d011SMarcel Moolenaar	files="$files $1"
2043955d011SMarcel Moolenaar	shift
2053955d011SMarcel Moolenaardone
2063955d011SMarcel Moolenaar# last one is dest
2073955d011SMarcel Moolenaardest=$1
2083955d011SMarcel Moolenaarshift
2093955d011SMarcel Moolenaar
2103955d011SMarcel Moolenaarif [ "$dest_dir" = yes -a  ! -d $dest ]; then
2113955d011SMarcel Moolenaar	echo "no directory $dest" >&2
2123955d011SMarcel Moolenaar	exit 1
2133955d011SMarcel Moolenaarfi
2143955d011SMarcel Moolenaar
2153955d011SMarcel Moolenaarfor f in $files
2163955d011SMarcel Moolenaardo
2173955d011SMarcel Moolenaar	b=`basename $f`
2183955d011SMarcel Moolenaar	if [ -d $dest ]; then
2193955d011SMarcel Moolenaar		t=$dest/$b
2203955d011SMarcel Moolenaar	else
2213955d011SMarcel Moolenaar		t=$dest
2223955d011SMarcel Moolenaar	fi
2233955d011SMarcel Moolenaar	$newer $f $t || continue
2243955d011SMarcel Moolenaar	$compare $f $t || continue
22598875883SSimon J. Gerraty	[ -f $t ] && { mv -f $t $t$OLD_EXT || exit 1; }
226dc1b8c9aSSimon J. Gerraty	{ cp $CP_p $f $t && Setem $t; } || exit 1
2273955d011SMarcel Moolenaardone
2283955d011SMarcel Moolenaarexit 0
229