summaryrefslogtreecommitdiff
path: root/contrib/gcc_update
blob: c7195023c79c3b7d822644f6abdb5a5b9d8cf4f5 (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
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
#! /bin/sh
#
# Update a local Subversion, Git or Mercurial 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, 2006, 2007, 2009, 2010,
# 2011 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` or `hg/git
# pull` 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


# Default options used when updating (none).
UPDATE_OPTIONS=""

# Set the locale to C to make this script work for users with foreign
# locale like e.g. French UTF-8.
LANG=C
LC_ALL=C
export LANG LC_ALL

######## 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
gcc/config/arm/arm-tables.opt: gcc/config/arm/arm-arches.def gcc/config/arm/arm-cores.def gcc/config/arm/arm-fpus.def gcc/config/arm/genopt.sh
gcc/config/avr/avr-tables.opt: gcc/config/avr/avr-mcus.def gcc/config/avr/genopt.sh
gcc/config/c6x/c6x-tables.opt: gcc/config/c6x/c6x-isas.def gcc/config/c6x/genopt.sh
gcc/config/c6x/c6x-sched.md: gcc/config/c6x/c6x-sched.md.in gcc/config/c6x/gensched.sh
gcc/config/c6x/c6x-mult.md: gcc/config/c6x/c6x-mult.md.in gcc/config/c6x/genmult.sh
gcc/config/m68k/m68k-tables.opt: gcc/config/m68k/m68k-devices.def gcc/config/m68k/m68k-isas.def gcc/config/m68k/m68k-microarchs.def gcc/config/m68k/genopt.sh
gcc/config/mips/mips-tables.opt: gcc/config/mips/mips-cpus.def gcc/config/mips/genopt.sh
gcc/config/rs6000/rs6000-tables.opt: gcc/config/rs6000/rs6000-cpus.def gcc/config/rs6000/genopt.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
# lto-plugin
lto-plugin/configure: lto-plugin/configure.ac lto-plugin/aclocal.m4
lto-plugin/Makefile.in: lto-plugin/Makefile.am lto-plugin/aclocal.m4
# 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 for known version control systems.
if [ -d .git ]; then
    GCC_GIT=${GCC_GIT-${GIT-git}}
    vcs_type="git"
elif [ -d .hg ]; then
    GCC_HG=${GCC_HG-${HG-hg}}
    vcs_type="hg"
elif [ -d .svn ]; then
    GCC_SVN=${GCC_SVN-${SVN-svn}}
    vcs_type="svn"
else
    echo "This does not seem to be a GCC GIT/HG/SVN tree!"
    exit
fi

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

case $vcs_type in
    git)
	chat "Updating GIT tree"

	$GCC_GIT diff --quiet --exit-code HEAD
	if [ $? -ne 0 ]; then
            echo "Attempting to update a dirty git tree!" >&2
            echo "Commit or stash your changes first and retry." >&2
            exit 1
	fi

	$GCC_GIT pull ${silent+-q} --rebase ${1+"$@"}
	if [ $? -ne 0 ]; then
            (touch_files_reexec)
            echo "git pull of full tree failed." >&2
            exit 1
	fi

	revision=`$GCC_GIT log -n1 --pretty=%p:%t:%H`
	branch=`$GCC_GIT name-rev --name-only HEAD || :`
	;;    

    hg)
	chat "Updating HG tree"

	# Add -q so untracked files aren't listed.
	if [ `$GCC_HG status -q | wc -l` -gt 0 ]; then
            echo "Attempting to update a dirty hg tree!" >&2
            echo "Commit or revert your changes first and retry." >&2
            exit 1
	fi

	# Check for mq extension.  mq patches must be popped so tip has
	# been converted from the SVN tree.
	if [ -d .hg/patches ] && [ `$GCC_HG qapplied | wc -l` -gt 0 ]; then
	    # FIXME: Perhaps pop queue instead?  We could do that since we
	    # know the tree is clean.
	    echo "Attempting to update hg tree with mq patches applied!" >&2
	    echo "Pop your patches first and retry." >&2
	    exit 1
	fi

	# Update tree, but make sure to only pull the default branch.
	# Otherwise all branches in the upstream repo are added, even if
	# only a single one has been cloned.
	$GCC_HG pull ${silent+-q} -r`$GCC_HG branch` ${1+"$@"}
	if [ $? -ne 0 ]; then
            (touch_files_reexec)
            echo "hg pull of full tree failed." >&2
            exit 1
	fi

	# Update tree.  Needs to be done separately from pull so
	# gcc_update -rREV works.
	$GCC_HG update ${silent+-q} ${1+"$@"}
	if [ $? -ne 0 ]; then
            (touch_files_reexec)
            echo "hg update of full tree failed." >&2
            exit 1
	fi

	# Extract SVN revision corresponding to parents, as stored by
	# hg convert.  Before hg 1.4.3, there's no template keyword
	# corresponding to the extra: tag, so need to use hg log --debug
	# to extract the info.
	parents=`$GCC_HG parents --template '{rev}'`
	convert_revision=`$GCC_HG log --debug -r$parents | \
	    sed -ne "/^extra:.*convert_revision=svn:/ {
	        s%^[^/]*/%%
		p
	    }"`
	revision=`echo $convert_revision | sed -e 's/.*@//'`
	branch=`echo $convert_revision | sed -e 's%branches/%%' -e 's/@.*//'`
	;;

    svn)
	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

	revision=`svn info | awk '/Revision:/ { print $2 }'`
	branch=`svn info | sed -ne "/URL:/ {
	    s,.*/trunk,trunk,
	    s,.*/branches/,,
	    s,.*/tags/,,
	    p
	}"`
	;;
esac

rm -f LAST_UPDATED gcc/REVISION
{
    date
    echo "`TZ=UTC date` (revision $revision)"
} > LAST_UPDATED
echo "[$branch revision $revision]" > gcc/REVISION

touch_files_reexec