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