xref: /freebsd-src/contrib/bmake/mk/install-sh (revision c59c3bf34db360695f07735bebc76a768cac5afc)
198875883SSimon J. Gerraty#!/bin/sh
298875883SSimon J. Gerraty
398875883SSimon J. Gerraty# NAME:
498875883SSimon J. Gerraty#	install.sh - portable version of install(1)
598875883SSimon J. Gerraty#
698875883SSimon J. Gerraty# SYNOPSIS:
798875883SSimon J. Gerraty#	install [-CNcs] [-f flags] [-i errs] [-o owner] [-g group] [-m mode] file1 file2 ...
898875883SSimon J. Gerraty#	install -d  [-i errs] [-o owner] [-g group] [-m mode] directory ...
998875883SSimon J. Gerraty#
1098875883SSimon J. Gerraty# DESCRIPTION:
1198875883SSimon J. Gerraty#	Compatible with BSD install(1).  Except that '-c' is always
1298875883SSimon J. Gerraty#	true and we always move an already installed target aside as
1398875883SSimon J. Gerraty#	this is important on many systems.  Recent BSD install(1)
1498875883SSimon J. Gerraty#	versions have a '-b' option for this.
1598875883SSimon J. Gerraty#
1698875883SSimon J. Gerraty#
1798875883SSimon J. Gerraty# OPTIONS:
1898875883SSimon J. Gerraty#	-b	move previous target file aside (always true).
1998875883SSimon J. Gerraty#
2098875883SSimon J. Gerraty#	-B "suffix"
2198875883SSimon J. Gerraty#		use "suffix" instead of .old for saving existing target.
2298875883SSimon J. Gerraty#
2398875883SSimon J. Gerraty#	-c	copy rather than move the file into place (always true).
2498875883SSimon J. Gerraty#
2598875883SSimon J. Gerraty#	-C	compare.  Only install if target is missing or
2698875883SSimon J. Gerraty#		different.
2798875883SSimon J. Gerraty#
2898875883SSimon J. Gerraty#	-N	newer. Only install if target is missing or older.
2998875883SSimon J. Gerraty#
3098875883SSimon J. Gerraty#	-s	strip target
3198875883SSimon J. Gerraty#
3298875883SSimon J. Gerraty#	-o "owner"
3398875883SSimon J. Gerraty#		make target owned by "owner"
3498875883SSimon J. Gerraty#
3598875883SSimon J. Gerraty#	-g "group"
3698875883SSimon J. Gerraty#		make target group owned by "group"
3798875883SSimon J. Gerraty#
3898875883SSimon J. Gerraty#	-m "mode"
3998875883SSimon J. Gerraty#		set permissions to "mode"
4098875883SSimon J. Gerraty#
4198875883SSimon J. Gerraty#	-f "flags"
4298875883SSimon J. Gerraty#		Pass "flags" onto chflags(1)
4398875883SSimon J. Gerraty#
4498875883SSimon J. Gerraty#	-i "errs"
4598875883SSimon J. Gerraty#		Ignore errors from steps indicated by "errs" (``s,o,g,m'').
4698875883SSimon J. Gerraty#
4798875883SSimon J. Gerraty# BUGS:
4898875883SSimon J. Gerraty#	The '-i' option is to save your sanity when 'bsd.prog.mk'
4998875883SSimon J. Gerraty#	insists on haveing a '-o' "owner" option which is doomed to
5098875883SSimon J. Gerraty#	fail on many systems.  We ignore '-b' and '-c' options.
5198875883SSimon J. Gerraty#
5298875883SSimon J. Gerraty# AUTHOR:
5398875883SSimon J. Gerraty#	Simon J. Gerraty <sjg@crufty.net>
5498875883SSimon J. Gerraty#
5598875883SSimon J. Gerraty
56*c59c3bf3SSimon J. Gerraty# SPDX-License-Identifier: BSD-2-Clause
57*c59c3bf3SSimon J. Gerraty#
5898875883SSimon J. Gerraty# RCSid:
59*c59c3bf3SSimon J. Gerraty#	$Id: install-sh,v 1.26 2024/02/17 17:26:57 sjg Exp $
6098875883SSimon J. Gerraty#
6198875883SSimon J. Gerraty#	@(#) Copyright (c) 1993-2023 Simon J. Gerraty
6298875883SSimon J. Gerraty#
6398875883SSimon J. Gerraty#	This file is provided in the hope that it will
6498875883SSimon J. Gerraty#	be of use.  There is absolutely NO WARRANTY.
6598875883SSimon J. Gerraty#	Permission to copy, redistribute or otherwise
6698875883SSimon J. Gerraty#	use this file is hereby granted provided that
6798875883SSimon J. Gerraty#	the above copyright notice and this notice are
6898875883SSimon J. Gerraty#	left intact.
6998875883SSimon J. Gerraty#
7098875883SSimon J. Gerraty#	Please send copies of changes and bug-fixes to:
7198875883SSimon J. Gerraty#	sjg@crufty.net
7298875883SSimon J. Gerraty#
7398875883SSimon J. Gerraty
7498875883SSimon J. Gerratyset -- `getopt B:bpxCNcsdo:g:m:i:f: $*`
7598875883SSimon J. Gerraty
7698875883SSimon J. GerratyMydir=`dirname $0`
7798875883SSimon J. Gerraty[ -s $Mydir/.installrc ] && . $Mydir/.installrc
7898875883SSimon J. Gerraty
7998875883SSimon J. GerratyOLD_EXT=.old
8098875883SSimon J. Gerratyowner=:
8198875883SSimon J. Gerratygroup=:
8298875883SSimon J. Gerratymode=:
8398875883SSimon J. GerratyMODE=0
8498875883SSimon J. Gerratystrip=:
8598875883SSimon J. Gerratymkdirs=
8698875883SSimon J. Gerratycompare=:
8798875883SSimon J. Gerratynewer=:
8898875883SSimon J. Gerratychflags=:
8998875883SSimon J. GerratyLS_1=
9098875883SSimon J. GerratyCP_p=
9198875883SSimon J. Gerraty
9298875883SSimon J. Gerratywhile :
9398875883SSimon J. Gerratydo
9498875883SSimon J. Gerraty	case "$1" in
9598875883SSimon J. Gerraty	--)	shift; break;;
9698875883SSimon J. Gerraty	-[bc])	;; # ignore
9798875883SSimon J. Gerraty	-p)	CP_p=-p;;
9898875883SSimon J. Gerraty	-x)	set -x;;
9998875883SSimon J. Gerraty	-B)	OLD_EXT=$2; shift;;
10098875883SSimon J. Gerraty	-C)	compare=Different;;
10198875883SSimon J. Gerraty	-N)	newer=Newer;
10298875883SSimon J. Gerraty		# check if /bin/ls supports -1
10398875883SSimon J. Gerraty		'ls' -1 $0 > /dev/null 2>&1 && LS_1=1
10498875883SSimon J. Gerraty		;;
10598875883SSimon J. Gerraty	-o)	owner="${CHOWN:-chown} $2 "; shift;;
10698875883SSimon J. Gerraty	-g)	group="${CHGRP:-chgrp} $2 "; shift;;
10798875883SSimon J. Gerraty	-m)	MODE=$2 mode="${CHMOD:-chmod} $2 "; shift;;
10898875883SSimon J. Gerraty	-s)	strip=${STRIP:-strip};;
10998875883SSimon J. Gerraty	-d)	mkdirs="mkdir -p";;
11098875883SSimon J. Gerraty	-i)	ignore_err="$ignore_err$2"; shift;;
11198875883SSimon J. Gerraty	-f)	chflags="${CHFLAGS:-chflags} $2 "; shift;;
11298875883SSimon J. Gerraty	*)	break;;
11398875883SSimon J. Gerraty	esac
11498875883SSimon J. Gerraty	shift
11598875883SSimon J. Gerratydone
11698875883SSimon J. Gerraty
11798875883SSimon J. GerratyNewer() {
11898875883SSimon J. Gerraty	n=`'ls' -t$LS_1 $* 2> /dev/null | head -1`
11998875883SSimon J. Gerraty	[ $1 = $n ]
12098875883SSimon J. Gerraty}
12198875883SSimon J. Gerraty
12298875883SSimon J. GerratyDifferent() {
12398875883SSimon J. Gerraty	cmp -s $*
12498875883SSimon J. Gerraty	[ $? != 0 ]
12598875883SSimon J. Gerraty}
12698875883SSimon J. Gerraty
12798875883SSimon J. GerratyErr() {
12898875883SSimon J. Gerraty	case "$ignore_err" in
12998875883SSimon J. Gerraty	*$1*)	;;
13098875883SSimon J. Gerraty	*)	exit 1;;
13198875883SSimon J. Gerraty	esac
13298875883SSimon J. Gerraty}
13398875883SSimon J. Gerraty
13498875883SSimon J. GerratySetem() {
13598875883SSimon J. Gerraty	# the order is important
13698875883SSimon J. Gerraty	if [ ! -d $1 ]; then
13798875883SSimon J. Gerraty		$strip $1 || Err s
13898875883SSimon J. Gerraty	fi
13998875883SSimon J. Gerraty	$group $1 || Err g
14098875883SSimon J. Gerraty	$owner $1 || Err o
14198875883SSimon J. Gerraty	$mode  $1 || Err m
14298875883SSimon J. Gerraty	$chflags $1 || Err f
14398875883SSimon J. Gerraty	return 0
14498875883SSimon J. Gerraty}
14598875883SSimon J. Gerraty
14698875883SSimon J. Gerraty# a bug in HP-UX's /bin/sh, means we need to re-set $*
14798875883SSimon J. Gerraty# after any calls to add_path()
14898875883SSimon J. Gerratyargs="$*"
14998875883SSimon J. Gerraty
15098875883SSimon J. Gerratyadd_path () {
15198875883SSimon J. Gerraty	test -d $1 || return
15298875883SSimon J. Gerraty	case ":$PATH:" in
15398875883SSimon J. Gerraty	*:$1:*) return;;
15498875883SSimon J. Gerraty	esac
15598875883SSimon J. Gerraty	PATH=$PATH:$1
15698875883SSimon J. Gerraty}
15798875883SSimon J. Gerraty
15898875883SSimon J. Gerratyadd_path /sbin
15998875883SSimon J. Gerratyadd_path /usr/sbin
16098875883SSimon J. Gerraty
16198875883SSimon J. Gerratycase "$owner" in
16298875883SSimon J. Gerraty:)	;;
16398875883SSimon J. Gerraty*)	# some systems put chown in odd places
16498875883SSimon J. Gerraty	add_path /etc
16598875883SSimon J. Gerraty	add_path /usr/etc
16698875883SSimon J. Gerraty	;;
16798875883SSimon J. Gerratyesac
16898875883SSimon J. Gerraty
16998875883SSimon J. Gerraty# restore saved $*
17098875883SSimon J. Gerratyset -- $args
17198875883SSimon J. Gerraty
17298875883SSimon J. Gerraty# make directories if needed
17398875883SSimon J. Gerraty# and ensure mode etc are as desired
17498875883SSimon J. Gerratyif [ "$mkdirs" ]; then
17598875883SSimon J. Gerraty	case "$MODE" in
17698875883SSimon J. Gerraty	[1-7]*)
17798875883SSimon J. Gerraty		# make sure umask is compatible
17898875883SSimon J. Gerraty		case "$MODE" in
17998875883SSimon J. Gerraty		????*) MODE=`echo $MODE | sed 's,.*\(...\)$,\1,'`;;
18098875883SSimon J. Gerraty		esac
18198875883SSimon J. Gerraty		umask `expr 0777 - 0$MODE |
18298875883SSimon J. Gerraty		sed 's,^,000,;s,^.*\(...\)$,\1,'`;;
18398875883SSimon J. Gerraty	esac
18498875883SSimon J. Gerraty	for d in $*
18598875883SSimon J. Gerraty	do
18698875883SSimon J. Gerraty		[ ! -d $d ] && $mkdirs $d
18798875883SSimon J. Gerraty		Setem $d
18898875883SSimon J. Gerraty	done
18998875883SSimon J. Gerraty	exit 0			# that's all we do
19098875883SSimon J. Gerratyfi
19198875883SSimon J. Gerraty
19298875883SSimon J. Gerraty# install files
19398875883SSimon J. Gerratyif [ $# -eq 1 ]; then
19498875883SSimon J. Gerraty	echo "what should I do with $*?" >&2
19598875883SSimon J. Gerraty	exit 1
19698875883SSimon J. Gerratyfi
19798875883SSimon J. Gerraty
19898875883SSimon J. Gerraty# get list of files
19998875883SSimon J. Gerratyfiles=
20098875883SSimon J. Gerratywhile [ $# -gt 1 ]
20198875883SSimon J. Gerratydo
20298875883SSimon J. Gerraty	test "x$files" = x || dest_dir=yes
20398875883SSimon J. Gerraty	files="$files $1"
20498875883SSimon J. Gerraty	shift
20598875883SSimon J. Gerratydone
20698875883SSimon J. Gerraty# last one is dest
20798875883SSimon J. Gerratydest=$1
20898875883SSimon J. Gerratyshift
20998875883SSimon J. Gerraty
21098875883SSimon J. Gerratyif [ "$dest_dir" = yes -a  ! -d $dest ]; then
21198875883SSimon J. Gerraty	echo "no directory $dest" >&2
21298875883SSimon J. Gerraty	exit 1
21398875883SSimon J. Gerratyfi
21498875883SSimon J. Gerraty
21598875883SSimon J. Gerratyfor f in $files
21698875883SSimon J. Gerratydo
21798875883SSimon J. Gerraty	b=`basename $f`
21898875883SSimon J. Gerraty	if [ -d $dest ]; then
21998875883SSimon J. Gerraty		t=$dest/$b
22098875883SSimon J. Gerraty	else
22198875883SSimon J. Gerraty		t=$dest
22298875883SSimon J. Gerraty	fi
22398875883SSimon J. Gerraty	$newer $f $t || continue
22498875883SSimon J. Gerraty	$compare $f $t || continue
22598875883SSimon J. Gerraty	[ -f $t ] && { mv -f $t $t$OLD_EXT || exit 1; }
22698875883SSimon J. Gerraty	{ cp $CP_p $f $t && Setem $t; } || exit 1
22798875883SSimon J. Gerratydone
22898875883SSimon J. Gerratyexit 0
229