summaryrefslogtreecommitdiffstats
path: root/tools/build/install-if-change.in
blob: b2f3cb04bbd0f82813d6ba2c9cb6a0281c5fcc41 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!@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: ***