summaryrefslogblamecommitdiffstats
path: root/tools/build/install-if-change.in
blob: b2f3cb04bbd0f82813d6ba2c9cb6a0281c5fcc41 (plain) (tree)













































































































































                                                                         
#!@KSH@ -p
#
# Either bash or ksh will be ok for this; requires (( )) arithmetic
#  (-p above just says to not parse $ENV file; makes it faster for
#   those of us who set $ENV)
#
# install files if they have changed by running 'cmp', then 'install'
#   as necessary.
#
#  Optionally, can append a suffix before last existing suffix (if any)
#
# NOTE
#   We avoid using typical install(1M) programs since they have
#   large variability across systems and we also need to support ou
#   -V option.
#   So we just copy and chmod by hand.
#
# $Id$
#

progname=`basename $0`
#progname=${0##*/}        # fast basename hack for ksh, bash

USAGE=\
"usage: $progname [ -vmV ] file [ file ... ] dest-directory-or-file
	-v	    -- verbose
        -V suffix   -- suffix to append to targets (before any . suffix)
                        eg: -V _g would change 'foo' to 'foo_g' and
                                               'libfoo.a' to 'libfoo_g.a'
        -m mode     -- mode for new file(s)"

fatal() {
    if [ "$1" ]
    then
        echo $* >&2
    fi
    echo "$USAGE" 1>&2
    exit 1
}

#
# process the options
#

verbose=""
suffix=""
mode=""

while getopts vm:V: OPT
do
    case "$OPT" in
	v)
	    verbose="yes";;
        V)
            eval suffix=$OPTARG;;
        m)
            mode="$OPTARG";;
        *)
            fatal
    esac
done

shiftcount=`expr $OPTIND - 1`
shift $shiftcount

args=$*

#
# Separate source file(s) from dest directory or file
#

files=""
dest=""
for d in $args
do
    files="$files $dest"
    dest=$d
done

if [ ! "$files" ] || [ ! "$dest" ]
then
    fatal "missing files or invalid destination"
fi

#
# Process the arguments
#

targets=""
for f in $files
do
    # leaf=`basename $f`
    leaf=${f##*/}        # fast basename hack for ksh, bash

    target=$dest
    if [ -d $dest ]
    then
        # if we were given a suffix, then add it as appropriate
        if [ "$suffix" ]
        then
            case $f in
                *.*)
                    # leaf=`echo $leaf |
                    #   /bin/sed "s/\([~\.]*\)\.\(.*\)$/\1$suffix.\2/"`
                    # ksh,bash hack for above sed script
                    leaf=${leaf%%.*}$suffix.${leaf#*.}

                    [ "$verbose" = "yes" ] &&
                      echo "$progname: $f will be installed as $leaf"
                    ;;
                *)
                    leaf=$leaf$suffix;;
            esac
        fi
        target=$target/$leaf
    fi

    [ ! -r $f ] && fatal "can not read $f"

    if cmp -s $f $target
    then
        [ "$verbose" = "yes" ] && echo "'$f' not newer than '$target'"
    else
        [ "$verbose" = "yes" ] && echo "rm -f $target"
        rm -f $target
        echo "cp -p $f $target"
        cp -p $f $target || exit 1
        targets="$targets $target"    # keep list for chmod below
    fi
done

if [ "$mode" -a "$targets" ]
then
     [ "$verbose" = "yes" ] && echo "chmod $mode $targets"
     chmod $mode $targets
fi

exit 0

# Local Variables: ***
# mode:ksh ***
# End: ***