]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bmake/mk/stage-install.sh
Update to bmake-20200902
[FreeBSD/FreeBSD.git] / contrib / bmake / mk / stage-install.sh
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 #       Before we run install(1), we check if "dest" needs to be a
32 #       directory (more than one file in "args") and create it
33 #       if necessary.
34 #
35 # SEE ALSO:
36 #       meta.stage.mk
37 #
38
39 # RCSid:
40 #       $Id: stage-install.sh,v 1.9 2020/08/28 01:04:13 sjg Exp $
41 #
42 #       @(#) Copyright (c) 2013-2020, Simon J. Gerraty
43 #
44 #       This file is provided in the hope that it will
45 #       be of use.  There is absolutely NO WARRANTY.
46 #       Permission to copy, redistribute or otherwise
47 #       use this file is hereby granted provided that
48 #       the above copyright notice and this notice are
49 #       left intact.
50 #
51 #       Please send copies of changes and bug-fixes to:
52 #       sjg@crufty.net
53 #
54
55 INSTALL=${REAL_INSTALL:-install}
56 OBJDIR=.
57
58 while :
59 do
60     case "$1" in
61     *=*) eval "$1"; shift;;
62     *) break;;
63     esac
64 done
65
66 # get last entry from "$@" without side effects
67 last_entry() {
68     while [ $# -gt 8 ]
69     do
70         shift 8
71     done
72     eval last=\$$#
73     echo $last
74 }
75
76 # mkdir $dest if needed (more than one file)
77 mkdir_if_needed() {
78     (
79         lf=
80         while [ $# -gt 8 ]
81         do
82             shift 4
83         done
84         for f in "$@"
85         do
86             [ -f $f ] || continue
87             [ $f = $dest ] && continue
88             if [ -n "$lf" ]; then
89                 # dest must be a directory
90                 mkdir -p $dest
91                 break
92             fi
93             lf=$f
94         done
95     )
96 }
97
98 args="$@"
99 dest=`last_entry "$@"`
100 case " $args " in
101 *" -d "*) ;;
102 *) [ -e $dest ] || mkdir_if_needed "$@";;
103 esac
104
105 # if .dirdep doesn't exist, just run install and be done
106 _DIRDEP=${_DIRDEP:-$OBJDIR/.dirdep}
107 [ -s $_DIRDEP ] && EXEC= || EXEC=exec
108 $EXEC $INSTALL "$@" || exit 1
109
110 # from meta.stage.mk
111 LnCp() {
112     rm -f $2 2> /dev/null
113     ln $1 $2 2> /dev/null || cp -p $1 $2
114 }
115
116 StageDirdep() {
117   t=$1
118   if [ -s $t.dirdep ]; then
119       cmp -s $_DIRDEP $t.dirdep && return
120       echo "ERROR: $t installed by `cat $t.dirdep` not `cat $_DIRDEP`" >&2
121       exit 1
122   fi
123   LnCp $_DIRDEP $t.dirdep || exit 1
124 }
125
126 if [ -f $dest ]; then
127     # a file, there can be only one .dirdep needed
128     StageDirdep $dest
129 elif [ -d $dest ]; then
130     for f in $args
131     do
132         test -f $f || continue
133         StageDirdep $dest/${f##*/}
134     done
135 fi