aboutsummaryrefslogtreecommitdiff
path: root/contrib/gcc_update
blob: 7eb839dc687cbbd0ca21cbe27ec706f31b5187f4 (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
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
#! /bin/sh
#
# Update a local Subversion 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.
#
# (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 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
#
#
# By default all command-line options are passed to `svn 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 svn 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.
#
# If the first parameter is --silent, this script prints nothing other
# than error messages; the second parameter is then interpreted as above.
#
# Examples:
#
# contrib/gcc_update -r 8712
# contrib/gcc_update --patch some-patch
# contrib/gcc_update --touch
# contrib/gcc_update --list


# SVN command
GCC_SVN=${GCC_SVN-${SVN-svn}}
# Default options used when updating via SVN (none).
UPDATE_OPTIONS=""

######## Anything below shouldn't be changed by regular users.

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

# This function prints its arguments to standard output unless
# "silent" is set.
unset silent
chat () {
    if [ -z "$silent" ]; then
        echo "$@"
    fi
}

# 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
# fixincludes
fixincludes/configure: fixincludes/configure.ac fixincludes/aclocal.m4
fixincludes/config.h.in: fixincludes/configure.ac fixincludes/aclocal.m4
# intl library
intl/plural.c: intl/plural.y
intl/configure: intl/configure.ac intl/aclocal.m4
intl/config.h.in: intl/configure.ac intl/aclocal.m4
# Now, proceed to gcc automatically generated files
gcc/configure: gcc/configure.ac
gcc/cstamp-h.in: gcc/configure.ac
gcc/config.in: gcc/cstamp-h.in
gcc/fixinc/fixincl.x: gcc/fixinc/fixincl.tpl gcc/fixinc/inclhack.def
gcc/config/arm/arm-tune.md: gcc/config/arm/arm-cores.def gcc/config/arm/gentune.sh
# And then, language-specific files
gcc/cp/cfns.h: gcc/cp/cfns.gperf
gcc/java/keyword.h: gcc/java/keyword.gperf
# testsuite
# Without this, _Pragma3.c can have a false negative.
gcc/testsuite/gcc.dg/cpp/_Pragma3.c: gcc/testsuite/gcc.dg/cpp/mi1c.h
# Similarly, without this, you will see:
# direct2s.c:35: warning: current file is older than direct2.c
gcc/testsuite/gcc.dg/cpp/direct2s.c: gcc/testsuite/gcc.dg/cpp/direct2.c
# And libraries, at last
libbanshee/configure: libbanshee/configure.ac
libmudflap/configure: libmudflap/configure.ac
libobjc/configure: libobjc/configure.ac
zlib/aclocal.m4: zlib/configure.ac zlib/acinclude.m4
zlib/Makefile.in: zlib/Makefile.am zlib/configure.ac zlib/aclocal.m4
zlib/configure: zlib/configure.ac zlib/aclocal.m4
fastjar/aclocal.m4: fastjar/configure.ac
fastjar/Makefile.in: fastjar/Makefile.am fastjar/configure.ac fastjar/aclocal.m4
fastjar/configure: fastjar/configure.ac fastjar/aclocal.m4
boehm-gc/aclocal.m4: boehm-gc/configure.ac
boehm-gc/Makefile.in: boehm-gc/Makefile.am boehm-gc/configure.ac boehm-gc/aclocal.m4
boehm-gc/configure: boehm-gc/configure.ac boehm-gc/aclocal.m4
libada/configure: libada/configure.ac
libffi/aclocal.m4: libffi/configure.ac libffi/acinclude.m4
libffi/Makefile.in: libffi/Makefile.am libffi/configure.ac libffi/aclocal.m4
libffi/configure: libffi/configure.ac libffi/aclocal.m4
libffi/fficonfig.h.in: libffi/configure.ac libffi/aclocal.m4
libgfortran/aclocal.m4: libgfortran/configure.ac libgfortran/acinclude.m4
libgfortran/Makefile.in: libgfortran/Makefile.am libgfortran/configure.ac libgfortran/aclocal.m4
libgfortran/configure: libgfortran/configure.ac libgfortran/aclocal.m4
libjava/aclocal.m4: libjava/configure.ac
libjava/Makefile.in: libjava/Makefile.am libjava/configure.ac libjava/aclocal.m4
libjava/configure: libjava/configure.ac libjava/aclocal.m4
libjava/libltdl/aclocal.m4: libjava/libltdl/configure.ac libjava/libltdl/acinclude.m4
libjava/libltdl/Makefile.in: libjava/libltdl/Makefile.am libjava/libltdl/configure.ac libjava/libltdl/aclocal.m4
libjava/libltdl/configure: libjava/libltdl/configure.ac libjava/libltdl/aclocal.m4
libjava/libltdl/config-h.in: libjava/libltdl/configure.ac libjava/libltdl/aclocal.m4
libcpp/aclocal.m4: libcpp/configure.ac
libcpp/Makefile.in: libcpp/configure.ac libcpp/aclocal.m4
libcpp/configure: libcpp/configure.ac libcpp/aclocal.m4
libgomp/aclocal.m4: libgomp/configure.ac libgomp/acinclude.m4
libgomp/Makefile.in: libgomp/Makefile.am libgomp/aclocal.m4
libgomp/testsuite/Makefile.in: libgomp/Makefile.am libgomp/aclocal.m4
libgomp/configure: libgomp/configure.ac libgomp/aclocal.m4
libgomp/config.h.in: libgomp/configure.ac libgomp/aclocal.m4
# Top level
Makefile.in: Makefile.tpl Makefile.def
configure: configure.ac config/acx.m4
EOF
}


# This function touches generated files such that the ``end'' user does
# not have to rebuild them.
touch_files () {
    rm -f Makefile.$$
    echo 'all: \' > Makefile.$$
    files_and_dependencies | sed 's, .*, \\,' >> Makefile.$$
    echo '; @true' >> Makefile.$$
    files_and_dependencies | sed 's, ,: ,' >> Makefile.$$
    files_and_dependencies | sed 's, .*, \\,' >> Makefile.$$
    echo ':' >> Makefile.$$
    echo '	@for f in $? $@; do test -f $$f || exit 0; done; \' >> Makefile.$$
    echo '	echo Touching $@...; \' >> Makefile.$$
    chat '	echo Touching $@... 1>&2; \' >> Makefile.$$
    echo '	touch $@' >> Makefile.$$
    files_and_dependencies | sed 's,[^ ]* ,,;s,$, :,' >> Makefile.$$

    # We would have to explicitly shut off the "Entering... Leaving..."
    # messages through "--no-print-directory" to handle the case when
    # we were called from a recursive invocation (i.e. "$(MAKE)" in a
    # Makefile, not just make).  Passing only "-s" doesn't help then,
    # because make has helpfully added "-w" to MAKEFLAGS automatically.
    # Unfortunately we do not require GNU make other than for building
    # and testing, so let's just grep known text explicitly echoed by
    # the rule.
    while ${MAKE-make} -s -f Makefile.$$ all | grep Touching > /dev/null; do
      sleep 1
    done 2>&1
    rm -f Makefile.$$
}


# 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 () {
    chat "Adjusting file timestamps"
    exec ${CONFIG_SHELL-/bin/sh} $self ${silent+"--silent"} --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 ;;
	*)
	    patch -p1 < "$1";;
	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
--silent)
    silent=t
    shift
    ;;
esac

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 SVN tree.
if [ ! -d .svn ]; then
    echo "This does not seem to be a GCC SVN tree!"
    exit
fi

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

chat "Updating SVN tree"

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

rm -f LAST_UPDATED gcc/REVISION

revision=`svn info | awk '/Revision:/ { print $2 }'`
branch=`svn info | sed -ne "/URL:/ {
s,.*/gcc/,,g
s,branches/,,
p
}"`
{
  date
  echo "`TZ=UTC date` (revision $revision)"
} > LAST_UPDATED

echo "[$branch revision $revision]" > gcc/REVISION

touch_files_reexec