1#! /bin/sh 2# 3# Update a local Subversion, Git or Mercurial tree from the GCC 4# repository, with an emphasis on treating generated files correctly, so 5# that autoconf, gperf et al are not required for the ``end'' user. 6# 7# (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 8# 2010, 2011, 2012, 2013, 2014, 2015, 2017 Free Software Foundation 9# Originally by Gerald Pfeifer <gerald@pfeifer.com>, August 1998. 10# 11# This script is Free Software, and it can be copied, distributed and 12# modified as defined in the GNU General Public License. A copy of 13# its license can be downloaded from http://www.gnu.org/copyleft/gpl.html 14# 15# 16# By default all command-line options are passed to `svn update` or `hg/git 17# pull` in addition to $UPDATE_OPTIONS (defined below). If the first parameter 18# reads --nostdflags, $UPDATE_OPTIONS as well as this parameter itself 19# are omitted. 20# 21# If the first parameter reads --patch, the second parameter is considered 22# a patch file. 23# 24# If the first parameter is --touch, no svn operation will be performed, 25# only generated files that appear to be out of date in the local tree 26# will be touched. 27# 28# If the first parameter is --list, a list of the generated files and 29# their dependencies will be printed; --help prints this message. 30# 31# If the first parameter is --silent, this script prints nothing other 32# than error messages; the second parameter is then interpreted as above. 33# 34# Examples: 35# 36# contrib/gcc_update -r 8712 37# contrib/gcc_update --patch some-patch 38# contrib/gcc_update --touch 39# contrib/gcc_update --list 40 41 42# Default options used when updating (none). 43UPDATE_OPTIONS="" 44 45# Set the locale to C to make this script work for users with foreign 46# locale like e.g. French UTF-8. 47LANG=C 48LC_ALL=C 49export LANG LC_ALL 50 51######## Anything below shouldn't be changed by regular users. 52 53# Arrange for the value of $0 to be available for functions 54self=$0 55 56# This function prints its arguments to standard output unless 57# "silent" is set. 58unset silent 59chat () { 60 if [ -z "$silent" ]; then 61 echo "$@" 62 fi 63} 64 65# This function prints a list of all generated files, along with their 66# dependencies. Note that only one target is supported per line: the 67# colon is stripped from the output. 68files_and_dependencies () { 69 sed -e 's/ *#.*//' -e '/^$/d' -e 's/://' <<\EOF 70# fixincludes 71fixincludes/configure: fixincludes/configure.ac fixincludes/aclocal.m4 72fixincludes/config.h.in: fixincludes/configure.ac fixincludes/aclocal.m4 73# intl library 74intl/plural.c: intl/plural.y 75intl/configure: intl/configure.ac intl/aclocal.m4 76intl/config.h.in: intl/configure.ac intl/aclocal.m4 77# Now, proceed to gcc automatically generated files 78gcc/configure: gcc/configure.ac 79gcc/cstamp-h.in: gcc/configure.ac 80gcc/config.in: gcc/cstamp-h.in 81gcc/fixinc/fixincl.x: gcc/fixinc/fixincl.tpl gcc/fixinc/inclhack.def 82gcc/config/aarch64/aarch64-tune.md: gcc/config/aarch64/aarch64-cores.def gcc/config/aarch64/gentune.sh 83gcc/config/arm/arm-tune.md: gcc/config/arm/arm-cpus.in gcc/config/arm/parsecpu.awk 84gcc/config/arm/arm-tables.opt: gcc/config/arm/arm-cpus.in gcc/config/arm/parsecpu.awk 85gcc/config/avr/t-multilib: gcc/config/avr/avr-mcus.def gcc/config/avr/genmultilib.awk 86gcc/config/c6x/c6x-tables.opt: gcc/config/c6x/c6x-isas.def gcc/config/c6x/genopt.sh 87gcc/config/c6x/c6x-sched.md: gcc/config/c6x/c6x-sched.md.in gcc/config/c6x/gensched.sh 88gcc/config/c6x/c6x-mult.md: gcc/config/c6x/c6x-mult.md.in gcc/config/c6x/genmult.sh 89gcc/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 90gcc/config/mips/mips-tables.opt: gcc/config/mips/mips-cpus.def gcc/config/mips/genopt.sh 91gcc/config/rs6000/rs6000-tables.opt: gcc/config/rs6000/rs6000-cpus.def gcc/config/rs6000/genopt.sh 92gcc/config/tilegx/mul-tables.c: gcc/config/tilepro/gen-mul-tables.cc 93gcc/config/tilepro/mul-tables.c: gcc/config/tilepro/gen-mul-tables.cc 94# And then, language-specific files 95gcc/cp/cfns.h: gcc/cp/cfns.gperf 96# testsuite 97# Without this, _Pragma3.c can have a false negative. 98gcc/testsuite/gcc.dg/cpp/_Pragma3.c: gcc/testsuite/gcc.dg/cpp/mi1c.h 99# Similarly, without this, you will see: 100# direct2s.c:35: warning: current file is older than direct2.c 101gcc/testsuite/gcc.dg/cpp/direct2s.c: gcc/testsuite/gcc.dg/cpp/direct2.c 102# lto-plugin 103lto-plugin/configure: lto-plugin/configure.ac lto-plugin/aclocal.m4 104lto-plugin/Makefile.in: lto-plugin/Makefile.am lto-plugin/aclocal.m4 105# And libraries, at last 106libbanshee/configure: libbanshee/configure.ac 107libmudflap/configure: libmudflap/configure.ac 108libobjc/configure: libobjc/configure.ac 109zlib/aclocal.m4: zlib/configure.ac zlib/acinclude.m4 110zlib/Makefile.in: zlib/Makefile.am zlib/configure.ac zlib/aclocal.m4 111zlib/configure: zlib/configure.ac zlib/aclocal.m4 112fastjar/aclocal.m4: fastjar/configure.ac 113fastjar/Makefile.in: fastjar/Makefile.am fastjar/configure.ac fastjar/aclocal.m4 114fastjar/configure: fastjar/configure.ac fastjar/aclocal.m4 115boehm-gc/aclocal.m4: boehm-gc/configure.ac 116boehm-gc/Makefile.in: boehm-gc/Makefile.am boehm-gc/configure.ac boehm-gc/aclocal.m4 117boehm-gc/configure: boehm-gc/configure.ac boehm-gc/aclocal.m4 118libada/configure: libada/configure.ac 119libffi/aclocal.m4: libffi/configure.ac libffi/acinclude.m4 120libffi/Makefile.in: libffi/Makefile.am libffi/configure.ac libffi/aclocal.m4 121libffi/configure: libffi/configure.ac libffi/aclocal.m4 122libffi/fficonfig.h.in: libffi/configure.ac libffi/aclocal.m4 123libgfortran/aclocal.m4: libgfortran/configure.ac libgfortran/acinclude.m4 124libgfortran/Makefile.in: libgfortran/Makefile.am libgfortran/configure.ac libgfortran/aclocal.m4 125libquadmath/configure: libquadmath/configure.ac libquadmath/aclocal.m4 126libquadmath/aclocal.m4: libquadmath/configure.ac libquadmath/acinclude.m4 127libquadmath/Makefile.in: libquadmath/Makefile.am libquadmath/configure.ac libgfortran/aclocal.m4 128libgfortran/configure: libgfortran/configure.ac libgfortran/aclocal.m4 129libcpp/aclocal.m4: libcpp/configure.ac 130libcpp/Makefile.in: libcpp/configure.ac libcpp/aclocal.m4 131libcpp/configure: libcpp/configure.ac libcpp/aclocal.m4 132libgomp/aclocal.m4: libgomp/configure.ac libgomp/acinclude.m4 133libgomp/Makefile.am: libgomp/plugin/Makefrag.am 134libgomp/Makefile.in: libgomp/Makefile.am libgomp/aclocal.m4 135libgomp/testsuite/Makefile.in: libgomp/testsuite/Makefile.am libgomp/aclocal.m4 136libgomp/configure.ac: libgomp/plugin/configfrag.ac 137libgomp/configure: libgomp/configure.ac libgomp/aclocal.m4 138libgomp/config.h.in: libgomp/configure.ac libgomp/aclocal.m4 139libhsail-rt/aclocal.m4: libhsail-rt/configure.ac 140libhsail-rt/Makefile.in: libhsail-rt/Makefile.am libhsail-rt/aclocal.m4 141libhsail-rt/configure: libhsail-rt/configure.ac libhsail-rt/aclocal.m4 142libhsail-rt/target-config.h.in: libhsail-rt/configure.ac libhsail-rt/aclocal.m4 143libitm/aclocal.m4: libitm/configure.ac libitm/acinclude.m4 144libitm/Makefile.in: libitm/Makefile.am libitm/aclocal.m4 145libitm/testsuite/Makefile.in: libitm/testsuite/Makefile.am libitm/aclocal.m4 146libitm/configure: libitm/configure.ac libitm/aclocal.m4 147libitm/config.h.in: libitm/configure.ac libitm/aclocal.m4 148libatomic/aclocal.m4: libatomic/configure.ac libatomic/acinclude.m4 149libatomic/Makefile.in: libatomic/Makefile.am libatomic/aclocal.m4 150libatomic/testsuite/Makefile.in: libatomic/testsuite/Makefile.am libatomic/aclocal.m4 151libatomic/configure: libatomic/configure.ac libatomic/aclocal.m4 152libatomic/auto-config.h.in: libatomic/configure.ac libatomic/aclocal.m4 153libsanitizer/aclocal.m4: libsanitizer/configure.ac libsanitizer/acinclude.m4 154libsanitizer/Makefile.in: libsanitizer/Makefile.am libsanitizer/aclocal.m4 155libsanitizer/configure: libsanitizer/configure.ac libsanitizer/aclocal.m4 156libsanitizer/asan/Makefile.in: libsanitizer/asan/Makefile.am libsanitizer/aclocal.m4 157libsanitizer/interception/Makefile.in: libsanitizer/interception/Makefile.am libsanitizer/aclocal.m4 158libsanitizer/sanitizer_common/Makefile.in: libsanitizer/sanitizer_common/Makefile.am libsanitizer/aclocal.m4 159libvtv/aclocal.m4: libvtv/configure.ac libvtv/acinclude.m4 160libvtv/Makefile.in: libvtv/Makefile.am libvtv/aclocal.m4 161libvtv/configure: libvtv/configure.ac libvtv/aclocal.m4 162liboffloadmic/aclocal.m4: liboffloadmic/configure.ac 163liboffloadmic/Makefile.in: liboffloadmic/Makefile.am 164liboffloadmic/configure: liboffloadmic/configure.ac 165liboffloadmic/plugin/aclocal.m4: liboffloadmic/plugin/configure.ac 166liboffloadmic/plugin/Makefile.in: liboffloadmic/plugin/Makefile.am 167liboffloadmic/plugin/configure: liboffloadmic/plugin/configure.ac 168libbacktrace/aclocal.m4: libbacktrace/configure.ac 169libbacktrace/Makefile.in: libbacktrace/Makefile.am libbacktrace/aclocal.m4 170libbacktrace/configure: libbacktrace/configure.ac libbacktrace/aclocal.m4 171libbacktrace/config.h.in: libbacktrace/configure.ac libbacktrace/aclocal.m4 172# Top level 173Makefile.in: Makefile.tpl Makefile.def 174configure: configure.ac config/acx.m4 175EOF 176} 177 178 179# This function touches generated files such that the ``end'' user does 180# not have to rebuild them. 181touch_files () { 182 rm -f Makefile.$$ 183 echo 'all: \' > Makefile.$$ 184 files_and_dependencies | sed 's, .*, \\,' >> Makefile.$$ 185 echo '; @true' >> Makefile.$$ 186 files_and_dependencies | sed 's, ,: ,' >> Makefile.$$ 187 files_and_dependencies | sed 's, .*, \\,' >> Makefile.$$ 188 echo ':' >> Makefile.$$ 189 echo ' @for f in $? $@; do test -f $$f || exit 0; done; \' >> Makefile.$$ 190 echo ' echo Touching $@...; \' >> Makefile.$$ 191 chat ' echo Touching $@... 1>&2; \' >> Makefile.$$ 192 echo ' touch $@' >> Makefile.$$ 193 files_and_dependencies | sed 's,[^ ]* ,,;s,$, :,' >> Makefile.$$ 194 195 # We would have to explicitly shut off the "Entering... Leaving..." 196 # messages through "--no-print-directory" to handle the case when 197 # we were called from a recursive invocation (i.e. "$(MAKE)" in a 198 # Makefile, not just make). Passing only "-s" doesn't help then, 199 # because make has helpfully added "-w" to MAKEFLAGS automatically. 200 # Unfortunately we do not require GNU make other than for building 201 # and testing, so let's just grep known text explicitly echoed by 202 # the rule. 203 while ${MAKE-make} -s -f Makefile.$$ all | grep Touching > /dev/null; do 204 sleep 1 205 done 2>&1 206 rm -f Makefile.$$ 207} 208 209 210# Whenever we update the tree or install a patch, we may be modifying 211# this script. By re-execing it, we ensure that the appropriate 212# dependencies and rules will be used. 213touch_files_reexec () { 214 chat "Adjusting file timestamps" 215 exec ${CONFIG_SHELL-/bin/sh} $self ${silent+"--silent"} --touch 216} 217 218# This functions applies a patch to an existing tree. 219apply_patch () { 220 if [ -f "$1" ]; then 221 echo "Applying patch file $1" 222 case $1 in 223 *gz) 224 gzip -d -c "$1" | patch -p1 ;; 225 *bz2) 226 bzip2 -d -c "$1" | patch -p1 ;; 227 *) 228 patch -p1 < "$1";; 229 esac 230 fi 231 touch_files_reexec 232} 233 234# Check whether this indeed looks like a local tree. 235if [ ! -f gcc/version.c ]; then 236 echo "This does not seem to be a GCC tree!" 237 exit 238fi 239 240case "$1" in 241--silent) 242 silent=t 243 shift 244 ;; 245esac 246 247case "$1" in 248# First of all, check whether we are going to process a patch. 249--patch) 250 if test "$#" != 2; then 251 echo "$1" expects only one argument >&2 252 exit 1 253 fi 254 apply_patch "${2}" 255 exit $? 256 ;; 257 258--touch) 259 if test "$#" != 1; then 260 echo "$1" does not expect any argument >&2 261 exit 1 262 fi 263 touch_files 264 exit $? 265 ;; 266 267--list) 268 if test "$#" != 1; then 269 echo "$1" does not expect any argument >&2 270 exit 1 271 fi 272 files_and_dependencies | sed 's/ /: /' 273 exit $? 274 ;; 275 276--help) 277 sed -e '1,2d' -e '/^UPDATE_OPTIONS=/{i\ 278\ 279 280p 281}' \ 282 -e '/^$/,$d' -e 's/#//' -e 's/^ //' < $0 283 exit $? 284 ;; 285 286esac 287 288# Check for known version control systems. 289if [ -d .git ] || [ -f .git ]; then 290 GCC_GIT=${GCC_GIT-${GIT-git}} 291 vcs_type="git" 292elif [ -d .hg ]; then 293 GCC_HG=${GCC_HG-${HG-hg}} 294 vcs_type="hg" 295elif [ -d .svn ]; then 296 GCC_SVN=${GCC_SVN-${SVN-svn}} 297 vcs_type="svn" 298else 299 echo "This does not seem to be a GCC GIT/HG/SVN tree!" 300 exit 301fi 302 303# Check command-line options 304if [ x"${1}"x = x"--nostdflags"x ]; then 305 shift 306else 307 set -- $UPDATE_OPTIONS ${1+"$@"} 308fi 309 310case $vcs_type in 311 git) 312 chat "Updating GIT tree" 313 314 $GCC_GIT diff --quiet --exit-code HEAD 315 if [ $? -ne 0 ]; then 316 echo "Attempting to update a dirty git tree!" >&2 317 echo "Commit or stash your changes first and retry." >&2 318 exit 1 319 fi 320 321 $GCC_GIT pull ${silent+-q} --rebase ${1+"$@"} 322 if [ $? -ne 0 ]; then 323 (touch_files_reexec) 324 echo "git pull of full tree failed." >&2 325 exit 1 326 fi 327 328 revision=`$GCC_GIT log -n1 --pretty=%p:%t:%H` 329 branch=`$GCC_GIT name-rev --name-only HEAD || :` 330 ;; 331 332 hg) 333 chat "Updating HG tree" 334 335 # Add -q so untracked files aren't listed. 336 if [ `$GCC_HG status -q | wc -l` -gt 0 ]; then 337 echo "Attempting to update a dirty hg tree!" >&2 338 echo "Commit or revert your changes first and retry." >&2 339 exit 1 340 fi 341 342 # Check for mq extension. mq patches must be popped so tip has 343 # been converted from the SVN tree. 344 if [ -d .hg/patches ] && [ `$GCC_HG qapplied | wc -l` -gt 0 ]; then 345 # FIXME: Perhaps pop queue instead? We could do that since we 346 # know the tree is clean. 347 echo "Attempting to update hg tree with mq patches applied!" >&2 348 echo "Pop your patches first and retry." >&2 349 exit 1 350 fi 351 352 # Update tree, but make sure to only pull the default branch. 353 # Otherwise all branches in the upstream repo are added, even if 354 # only a single one has been cloned. 355 $GCC_HG pull ${silent+-q} -r`$GCC_HG branch` ${1+"$@"} 356 if [ $? -ne 0 ]; then 357 (touch_files_reexec) 358 echo "hg pull of full tree failed." >&2 359 exit 1 360 fi 361 362 # Update tree. Needs to be done separately from pull so 363 # gcc_update -rREV works. 364 $GCC_HG update ${silent+-q} ${1+"$@"} 365 if [ $? -ne 0 ]; then 366 (touch_files_reexec) 367 echo "hg update of full tree failed." >&2 368 exit 1 369 fi 370 371 # Extract SVN revision corresponding to parents, as stored by 372 # hg convert. Before hg 1.4.3, there's no template keyword 373 # corresponding to the extra: tag, so need to use hg log --debug 374 # to extract the info. 375 parents=`$GCC_HG parents --template '{rev}'` 376 convert_revision=`$GCC_HG log --debug -r$parents | \ 377 sed -ne "/^extra:.*convert_revision=svn:/ { 378 s%^[^/]*/%% 379 p 380 }"` 381 revision=`echo $convert_revision | sed -e 's/.*@//'` 382 branch=`echo $convert_revision | sed -e 's%branches/%%' -e 's/@.*//'` 383 ;; 384 385 svn) 386 chat "Updating SVN tree" 387 388 $GCC_SVN ${silent+-q} --non-interactive update ${1+"$@"} 389 if [ $? -ne 0 ]; then 390 (touch_files_reexec) 391 echo "SVN update of full tree failed." >&2 392 exit 1 393 fi 394 395 revision=`$GCC_SVN info | awk '/Revision:/ { print $2 }'` 396 branch=`$GCC_SVN info | sed -ne "/^URL:/ { 397 s,.*/trunk,trunk, 398 s,.*/branches/,, 399 s,.*/tags/,, 400 p 401 }"` 402 ;; 403esac 404 405rm -f LAST_UPDATED gcc/REVISION 406{ 407 date 408 echo "`TZ=UTC date` (revision $revision)" 409} > LAST_UPDATED 410echo "[$branch revision $revision]" > gcc/REVISION 411 412touch_files_reexec 413