xref: /dflybsd-src/contrib/bmake/mk/stage-install.sh (revision 9e7ae5a0527a977cab412aede3a532cfe2903bbb)
15f1e34d9SAlexandre Perrin#!/bin/sh
25f1e34d9SAlexandre Perrin
35f1e34d9SAlexandre Perrin# NAME:
45f1e34d9SAlexandre Perrin#	stage-install.sh - wrapper around install
55f1e34d9SAlexandre Perrin#
65f1e34d9SAlexandre Perrin# SYNOPSIS:
75f1e34d9SAlexandre Perrin#	stage-install.sh [variable="value"] "args" "dest"
85f1e34d9SAlexandre Perrin#
95f1e34d9SAlexandre Perrin# DESCRIPTION:
105f1e34d9SAlexandre Perrin#	This script is a wrapper around the normal install(1).
115f1e34d9SAlexandre Perrin#	Its role is to add '.dirdep' files to the destination.
125f1e34d9SAlexandre Perrin#	The variables we might use are:
135f1e34d9SAlexandre Perrin#
145f1e34d9SAlexandre Perrin#	INSTALL
155f1e34d9SAlexandre Perrin#		Path to actual install(1), default is
165f1e34d9SAlexandre Perrin#		$REAL_INSTALL
175f1e34d9SAlexandre Perrin#
185f1e34d9SAlexandre Perrin#	OBJDIR
195f1e34d9SAlexandre Perrin#		Path to the dir where '.dirdep' was generated,
205f1e34d9SAlexandre Perrin#		default is '.'
215f1e34d9SAlexandre Perrin#
225f1e34d9SAlexandre Perrin#	_DIRDEP
235f1e34d9SAlexandre Perrin#		Path to actual '.dirdep' file, default is
245f1e34d9SAlexandre Perrin#		$OBJDIR/.dirdep
255f1e34d9SAlexandre Perrin#
265f1e34d9SAlexandre Perrin#	The "args" and "dest" are passed as is to install(1), and if a
275f1e34d9SAlexandre Perrin#	'.dirdep' file exists it will be linked or copied to each
285f1e34d9SAlexandre Perrin#	"file".dirdep placed in "dest" or "dest".dirdep if it happed
295f1e34d9SAlexandre Perrin#	to be a file rather than a directory.
305f1e34d9SAlexandre Perrin#
31a34d5fb1SAntonio Huete Jimenez#	Before we run install(1), we check if "dest" needs to be a
32a34d5fb1SAntonio Huete Jimenez#	directory (more than one file in "args") and create it
33a34d5fb1SAntonio Huete Jimenez#	if necessary.
34a34d5fb1SAntonio Huete Jimenez#
355f1e34d9SAlexandre Perrin# SEE ALSO:
365f1e34d9SAlexandre Perrin#	meta.stage.mk
375f1e34d9SAlexandre Perrin#
385f1e34d9SAlexandre Perrin
395f1e34d9SAlexandre Perrin# RCSid:
40*6eef5f0cSAntonio Huete Jimenez#	$Id: stage-install.sh,v 1.10 2021/11/17 07:06:31 sjg Exp $
415f1e34d9SAlexandre Perrin#
42a34d5fb1SAntonio Huete Jimenez#	@(#) Copyright (c) 2013-2020, Simon J. Gerraty
435f1e34d9SAlexandre Perrin#
445f1e34d9SAlexandre Perrin#	This file is provided in the hope that it will
455f1e34d9SAlexandre Perrin#	be of use.  There is absolutely NO WARRANTY.
465f1e34d9SAlexandre Perrin#	Permission to copy, redistribute or otherwise
475f1e34d9SAlexandre Perrin#	use this file is hereby granted provided that
485f1e34d9SAlexandre Perrin#	the above copyright notice and this notice are
495f1e34d9SAlexandre Perrin#	left intact.
505f1e34d9SAlexandre Perrin#
515f1e34d9SAlexandre Perrin#	Please send copies of changes and bug-fixes to:
525f1e34d9SAlexandre Perrin#	sjg@crufty.net
535f1e34d9SAlexandre Perrin#
545f1e34d9SAlexandre Perrin
555f1e34d9SAlexandre PerrinINSTALL=${REAL_INSTALL:-install}
565f1e34d9SAlexandre PerrinOBJDIR=.
575f1e34d9SAlexandre Perrin
585f1e34d9SAlexandre Perrinwhile :
595f1e34d9SAlexandre Perrindo
605f1e34d9SAlexandre Perrin    case "$1" in
615f1e34d9SAlexandre Perrin    *=*) eval "$1"; shift;;
625f1e34d9SAlexandre Perrin    *) break;;
635f1e34d9SAlexandre Perrin    esac
645f1e34d9SAlexandre Perrindone
655f1e34d9SAlexandre Perrin
66a34d5fb1SAntonio Huete Jimenez# get last entry from "$@" without side effects
67a34d5fb1SAntonio Huete Jimenezlast_entry() {
68a34d5fb1SAntonio Huete Jimenez    while [ $# -gt 8 ]
69a34d5fb1SAntonio Huete Jimenez    do
70a34d5fb1SAntonio Huete Jimenez        shift 8
71a34d5fb1SAntonio Huete Jimenez    done
72a34d5fb1SAntonio Huete Jimenez    eval last=\$$#
73a34d5fb1SAntonio Huete Jimenez    echo $last
74a34d5fb1SAntonio Huete Jimenez}
75a34d5fb1SAntonio Huete Jimenez
76a34d5fb1SAntonio Huete Jimenez# mkdir $dest if needed (more than one file)
77a34d5fb1SAntonio Huete Jimenezmkdir_if_needed() {
78a34d5fb1SAntonio Huete Jimenez    (
79a34d5fb1SAntonio Huete Jimenez        lf=
80a34d5fb1SAntonio Huete Jimenez        while [ $# -gt 8 ]
81a34d5fb1SAntonio Huete Jimenez        do
82a34d5fb1SAntonio Huete Jimenez            shift 4
83a34d5fb1SAntonio Huete Jimenez        done
84a34d5fb1SAntonio Huete Jimenez        for f in "$@"
85a34d5fb1SAntonio Huete Jimenez        do
86a34d5fb1SAntonio Huete Jimenez            [ -f $f ] || continue
87a34d5fb1SAntonio Huete Jimenez            [ $f = $dest ] && continue
88a34d5fb1SAntonio Huete Jimenez            if [ -n "$lf" ]; then
89a34d5fb1SAntonio Huete Jimenez                # dest must be a directory
90a34d5fb1SAntonio Huete Jimenez                mkdir -p $dest
91a34d5fb1SAntonio Huete Jimenez                break
92a34d5fb1SAntonio Huete Jimenez            fi
93a34d5fb1SAntonio Huete Jimenez            lf=$f
94a34d5fb1SAntonio Huete Jimenez        done
95a34d5fb1SAntonio Huete Jimenez    )
96a34d5fb1SAntonio Huete Jimenez}
97a34d5fb1SAntonio Huete Jimenez
98a34d5fb1SAntonio Huete Jimenezargs="$@"
99a34d5fb1SAntonio Huete Jimenezdest=`last_entry "$@"`
100a34d5fb1SAntonio Huete Jimenezcase " $args " in
101a34d5fb1SAntonio Huete Jimenez*" -d "*) ;;
102a34d5fb1SAntonio Huete Jimenez*) [ -e $dest ] || mkdir_if_needed "$@";;
103a34d5fb1SAntonio Huete Jimenezesac
104a34d5fb1SAntonio Huete Jimenez
1055f1e34d9SAlexandre Perrin# if .dirdep doesn't exist, just run install and be done
1065f1e34d9SAlexandre Perrin_DIRDEP=${_DIRDEP:-$OBJDIR/.dirdep}
1075f1e34d9SAlexandre Perrin[ -s $_DIRDEP ] && EXEC= || EXEC=exec
1085f1e34d9SAlexandre Perrin$EXEC $INSTALL "$@" || exit 1
1095f1e34d9SAlexandre Perrin
1105f1e34d9SAlexandre Perrin# from meta.stage.mk
1115f1e34d9SAlexandre PerrinLnCp() {
1125f1e34d9SAlexandre Perrin    rm -f $2 2> /dev/null
1135f1e34d9SAlexandre Perrin    ln $1 $2 2> /dev/null || cp -p $1 $2
1145f1e34d9SAlexandre Perrin}
1155f1e34d9SAlexandre Perrin
1165f1e34d9SAlexandre PerrinStageDirdep() {
1175f1e34d9SAlexandre Perrin  t=$1
1185f1e34d9SAlexandre Perrin  if [ -s $t.dirdep ]; then
1195f1e34d9SAlexandre Perrin      cmp -s $_DIRDEP $t.dirdep && return
120*6eef5f0cSAntonio Huete Jimenez      case "${STAGE_CONFLICT:-error}" in
121*6eef5f0cSAntonio Huete Jimenez      [Ee]*) STAGE_CONFLICT=ERROR action=exit;;
122*6eef5f0cSAntonio Huete Jimenez      *) STAGE_CONFLICT=WARNING action=: ;;
123*6eef5f0cSAntonio Huete Jimenez      esac
124*6eef5f0cSAntonio Huete Jimenez      echo "$STAGE_CONFLICT: $t installed by `cat $t.dirdep` not `cat $_DIRDEP`" >&2
125*6eef5f0cSAntonio Huete Jimenez      $action 1
1265f1e34d9SAlexandre Perrin  fi
1275f1e34d9SAlexandre Perrin  LnCp $_DIRDEP $t.dirdep || exit 1
1285f1e34d9SAlexandre Perrin}
1295f1e34d9SAlexandre Perrin
1305f1e34d9SAlexandre Perrinif [ -f $dest ]; then
1315f1e34d9SAlexandre Perrin    # a file, there can be only one .dirdep needed
1325f1e34d9SAlexandre Perrin    StageDirdep $dest
1335f1e34d9SAlexandre Perrinelif [ -d $dest ]; then
1345f1e34d9SAlexandre Perrin    for f in $args
1355f1e34d9SAlexandre Perrin    do
1365f1e34d9SAlexandre Perrin        test -f $f || continue
1375f1e34d9SAlexandre Perrin        StageDirdep $dest/${f##*/}
1385f1e34d9SAlexandre Perrin    done
1395f1e34d9SAlexandre Perrinfi
140