xref: /freebsd/share/mk/stage-install.sh (revision 4928135658a9d0eaee37003df6137ab363fcb0b4)
1#!/bin/sh
2
3# NAME:
4#	stage-install.sh - wrapper around install
5#
6# SYNOPSIS:
7#	stage-install.sh [variable="value"] "args" "dest"
8#
9# DESCRIPTION:
10#	This script is a wrapper around the normal install(1).
11#	Its role is to add '.dirdep' files to the destination.
12#	The variables we might use are:
13#
14#	INSTALL
15#		Path to actual install(1), default is
16#		$REAL_INSTALL
17#
18#	OBJDIR
19#		Path to the dir where '.dirdep' was generated,
20#		default is '.'
21#
22#	_DIRDEP
23#		Path to actual '.dirdep' file, default is
24#		$OBJDIR/.dirdep
25#
26#	The "args" and "dest" are passed as is to install(1), and if a
27#	'.dirdep' file exists it will be linked or copied to each
28#	"file".dirdep placed in "dest" or "dest".dirdep if it happed
29#	to be a file rather than a directory.
30#
31# SEE ALSO:
32#	meta.stage.mk
33#
34
35# RCSid:
36# 	$FreeBSD$
37#	$Id: stage-install.sh,v 1.5 2013/04/19 16:32:24 sjg Exp $
38#
39#	@(#) Copyright (c) 2013, Simon J. Gerraty
40#
41#	This file is provided in the hope that it will
42#	be of use.  There is absolutely NO WARRANTY.
43#	Permission to copy, redistribute or otherwise
44#	use this file is hereby granted provided that
45#	the above copyright notice and this notice are
46#	left intact.
47#
48#	Please send copies of changes and bug-fixes to:
49#	sjg@crufty.net
50#
51
52INSTALL=${REAL_INSTALL:-install}
53OBJDIR=.
54
55while :
56do
57    case "$1" in
58    *=*) eval "$1"; shift;;
59    *) break;;
60    esac
61done
62
63# if .dirdep doesn't exist, just run install and be done
64_DIRDEP=${_DIRDEP:-$OBJDIR/.dirdep}
65[ -s $_DIRDEP ] && EXEC= || EXEC=exec
66$EXEC $INSTALL "$@" || exit 1
67
68# from meta.stage.mk
69LnCp() {
70    rm -f $2 2> /dev/null
71    ln $1 $2 2> /dev/null || cp -p $1 $2
72}
73
74StageDirdep() {
75  t=$1
76  if [ -s $t.dirdep ]; then
77      cmp -s $_DIRDEP $t.dirdep && return
78      echo "ERROR: $t installed by `cat $t.dirdep` not `cat $_DIRDEP`" >&2
79      exit 1
80  fi
81  LnCp $_DIRDEP $t.dirdep || exit 1
82}
83
84args="$@"
85while [ $# -gt 8 ]
86do
87    shift 8
88done
89eval dest=\$$#
90if [ -f $dest ]; then
91    # a file, there can be only one .dirdep needed
92    StageDirdep $dest
93elif [ -d $dest ]; then
94    for f in $args
95    do
96        test -f $f || continue
97        StageDirdep $dest/${f##*/}
98    done
99fi
100