aboutsummaryrefslogtreecommitdiff
path: root/contrib/gcc_update
blob: 245af7cde02b8bffc3ee1a18d50ee693dbf2a524 (plain)
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
#! /bin/sh
#
# Update a local CVS tree from the GCC repository, with an emphasis
# on treating generated files correctly, so that autoconf, gperf et
# al are not required for the ``end'' user.
#
# By default all command-line options are passed to `cvs update` in
# addition to $UPDATE_OPTIONS (defined below). If the first parameter
# reads --nostdflags, $UPDATE_OPTIONS as well as this parameter itself
# are omitted.
#
# If the first parameter reads --patch, the second parameter is considered
# a patch file.
#
# If the first parameter is --touch, no cvs operation will be performed,
# only generated files that appear to be out of date in the local tree
# will be touched.
#
# If the first parameter is --list, a list of the generated files and
# their dependencies will be printed; --help prints this message.
#
# Examples:
#
# contrib/gcc_update -r gcc_latest_snapshot
# contrib/gcc_update -A
# contrib/gcc_update --nostdflags -P -r gcc-2_95-branch gcc/testsuite
# contrib/gcc_update --patch some-patch
# contrib/gcc_update --touch
# contrib/gcc_update --list
#
#
# (C) 1998-2000 Free Software Foundation
# Originally by Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>, August 1998.
#
# This script is Free Software, and it can be copied, distributed and
# modified as defined in the GNU General Public License.  A copy of
# its license can be downloaded from http://www.gnu.org/copyleft/gpl.html


# Default options used when updating via CVS.
UPDATE_OPTIONS=-P
# Add -d to create any directories that exist in the repository but not
#        locally.
# Add -A to reset any sticky tags, dates, or `-k' options.

# Arrange for the value of $0 to be available for functions
self=$0

# This function prints a list of all generated files, along with their
# dependencies.  Note that only one target is supported per line: the
# colon is stripped from the output.
files_and_dependencies () {
    sed -e 's/ *#.*//' -e '/^$/d' -e 's/://' <<\EOF
# All automake dependencies within texinfo
# In fact, not all, since we do not care about sub-directories that
# we do not build.  In particular, *.po and *.gmo are not touched.
texinfo/aclocal.m4: texinfo/configure.in texinfo/acinclude.m4
texinfo/Makefile.in: texinfo/Makefile.am texinfo/configure.in texinfo/aclocal.m4
texinfo/configure: texinfo/configure.in texinfo/aclocal.m4
texinfo/stamp-h.in: texinfo/configure.in texinfo/aclocal.m4 texinfo/acconfig.h
texinfo/lib/Makefile.in: texinfo/lib/Makefile.am texinfo/configure.in texinfo/aclocal.m4
texinfo/makeinfo/Makefile.in: texinfo/makeinfo/Makefile.am texinfo/configure.in texinfo/aclocal.m4
texinfo/util/Makefile.in: texinfo/util/Makefile.am texinfo/configure.in texinfo/aclocal.m4
# Now, proceed to gcc automatically generated files
gcc/configure: gcc/configure.in
gcc/cstamp-h.in: gcc/configure.in gcc/acconfig.h
gcc/config.in: gcc/cstamp-h.in
gcc/fixinc/fixincl.x: gcc/fixinc/fixincl.tpl gcc/fixinc/inclhack.def
gcc/gcov.1: gcc/gcov.texi
# And then, language-specific files
# (None at present.)
# And libraries, at last
libchill/configure: libchill/configure.in
libf2c/configure: libf2c/configure.in
libf2c/libF77/configure: libf2c/libF77/configure.in
libf2c/libI77/configure: libf2c/libI77/configure.in
libf2c/libU77/configure: libf2c/libU77/configure.in
libf2c/libU77/stamp-h.in: libf2c/libU77/configure.in libf2c/libU77/acconfig.h
libobjc/configure: libobjc/configure.in
# fastjar
fastjar/aclocal.m4: fastjar/configure.in
fastjar/Makefile.in: fastjar/Makefile.am fastjar/configure.in fastjar/aclocal.m4
fastjar/configure: fastjar/configure.in fastjar/aclocal.m4
fastjar/stamp-h.in: fastjar/configure.in fastjar/aclocal.m4
boehm-gc/aclocal.m4: boehm-gc/configure.in boehm-gc/acinclude.m4
boehm-gc/Makefile.in: boehm-gc/Makefile.am boehm-gc/configure.in boehm-gc/aclocal.m4
boehm-gc/configure: boehm-gc/configure.in boehm-gc/aclocal.m4
libjava/aclocal.m4: libjava/configure.in libjava/acinclude.m4
libjava/Makefile.in: libjava/Makefile.am libjava/configure.in libjava/aclocal.m4
libjava/configure: libjava/configure.in libjava/aclocal.m4
libjava/libltdl/aclocal.m4: libjava/libltdl/configure.in libjava/libltdl/acinclude.m4
libjava/libltdl/Makefile.in: libjava/libltdl/Makefile.am libjava/libltdl/configure.in libjava/libltdl/aclocal.m4
libjava/libltdl/configure: libjava/libltdl/configure.in libjava/libltdl/aclocal.m4
libjava/libltdl/stamp-h.in: libjava/libltdl/configure.in libjava/libltdl/aclocal.m4 libjava/libltdl/acconfig.h
EOF
}


# This function checks whether its first argument is newer than all
# the other arguments.  It returns success (0) otherwise.
is_out_of_date () {
  test `ls -1dt ${1+"$@"} | sed 1q` != "$1"
}


# This function touches generated files such that the ``end'' user does
# not have to rebuild them.
touch_files () {
    files_and_dependencies | while read f deps; do
	if test -f $f && is_out_of_date "$f" $deps; then
	    echo Touching "$f"...
	    touch $f
	    if is_out_of_date "$f" $deps; then
		# Hmm, it may have got the same timestamp as one of
		# its touched dependencies.  Wait a second and retry.
		sleep 1
		echo Touching "$f" once more...
		touch $f
	    fi
	fi
    done
}

# Whenever we update the tree or install a patch, we may be modifying
# this script.  By re-execing it, we ensure that the appropriate
# dependencies and rules will be used.
touch_files_reexec () {
    echo "Adjusting file timestamps"
    exec ${CONFIG_SHELL-/bin/sh} $self --touch
}

# This functions applies a patch to an existing tree.
apply_patch () {
    if [ -f $1 ]; then
	echo "Applying patch file $1"
	case "$1" in
	*gz)
	    gzip -d -c $1 | patch -p1 ;;
	*bz2)
	    bzip2 -d -c $1 | patch -p1 ;;
	*)
	    cat $1 | patch -p1 ;;
	esac
    fi
    touch_files_reexec
}

# Check whether this indeed looks like a local tree.
if [ ! -f gcc/version.c ]; then
    echo "This does not seem to be a GCC tree!"
    exit
fi

case "$1" in
# First of all, check whether we are going to process a patch.
--patch)
    if test "$#" != 2; then
        echo "$1" expects only one argument >&2
	exit 1
    fi
    apply_patch "${2}"
    exit $?
    ;;

--touch)
    if test "$#" != 1; then
        echo "$1" does not expect any argument >&2
	exit 1
    fi
    touch_files
    exit $?
    ;;

--list)
    if test "$#" != 1; then
        echo "$1" does not expect any argument >&2
	exit 1
    fi
    files_and_dependencies | sed 's/ /: /'
    exit $?
    ;;

--help)
    sed -e '1,2d' -e '/^UPDATE_OPTIONS=/{i\
\

p
}' \
	-e '/^$/,$d' -e 's/#//' -e 's/^ //' < $0
    exit $?
    ;;

esac

# Check whether this indeed looks like a local CVS tree.
if [ ! -d CVS ]; then
    echo "This does not seem to be a GCC CVS tree!"
    exit
fi

# Check command-line options
if [ x"${1}"x = x"--nostdflags"x ]; then
    shift
else
    set -- $UPDATE_OPTIONS ${1+"$@"}
fi

echo "Updating CVS tree"
cvs -q update ${1+"$@"}
if [ $? -ne 0 ]; then
    (touch_files_reexec)
    echo "CVS update of full tree failed." >&2
    exit 1
fi

touch_files_reexec