1#! /bin/sh 2# 3# Update a local CVS tree from the GCC repository, with an emphasis 4# on treating generated files correctly, so that autoconf, gperf et 5# al are not required for the ``end'' user. 6# 7# By default all command-line options are passed to `cvs update` in 8# addition to $UPDATE_OPTIONS (defined below). If the first parameter 9# reads --nostdflags, $UPDATE_OPTIONS as well as this parameter itself 10# are omitted. 11# 12# If the first parameter reads --patch, the second parameter is considered 13# a patch file. 14# 15# If the first parameter is --touch, no cvs operation will be performed, 16# only generated files that appear to be out of date in the local tree 17# will be touched. 18# 19# If the first parameter is --list, a list of the generated files and 20# their dependencies will be printed; --help prints this message. 21# 22# Examples: 23# 24# contrib/gcc_update -r gcc_latest_snapshot 25# contrib/gcc_update -A 26# contrib/gcc_update --nostdflags -P -r gcc-2_95-branch gcc/testsuite 27# contrib/gcc_update --patch some-patch 28# contrib/gcc_update --touch 29# contrib/gcc_update --list 30# 31# 32# (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation 33# Originally by Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>, August 1998. 34# 35# This script is Free Software, and it can be copied, distributed and 36# modified as defined in the GNU General Public License. A copy of 37# its license can be downloaded from http://www.gnu.org/copyleft/gpl.html 38 39 40# Default options used when updating via CVS. 41UPDATE_OPTIONS=-Pd 42# Use -P to prune empty directories. 43# Use -d to create any directories that exist in the repository but not 44# locally. 45# Use -A to reset any sticky tags, dates, or `-k' options. 46 47######## Anything below shouldn't be changed by regular users. 48 49# Arrange for the value of $0 to be available for functions 50self=$0 51 52# This function prints a list of all generated files, along with their 53# dependencies. Note that only one target is supported per line: the 54# colon is stripped from the output. 55files_and_dependencies () { 56 sed -e 's/ *#.*//' -e '/^$/d' -e 's/://' <<\EOF 57# All automake dependencies within texinfo 58# In fact, not all, since we do not care about sub-directories that 59# we do not build. In particular, *.po and *.gmo are not touched. 60texinfo/aclocal.m4: texinfo/configure.in texinfo/acinclude.m4 61texinfo/Makefile.in: texinfo/Makefile.am texinfo/configure.in texinfo/aclocal.m4 62texinfo/configure: texinfo/configure.in texinfo/aclocal.m4 63texinfo/stamp-h.in: texinfo/configure.in texinfo/aclocal.m4 texinfo/acconfig.h 64texinfo/lib/Makefile.in: texinfo/lib/Makefile.am texinfo/configure.in texinfo/aclocal.m4 65texinfo/makeinfo/Makefile.in: texinfo/makeinfo/Makefile.am texinfo/configure.in texinfo/aclocal.m4 66texinfo/util/Makefile.in: texinfo/util/Makefile.am texinfo/configure.in texinfo/aclocal.m4 67# Now, proceed to gcc automatically generated files 68gcc/configure: gcc/configure.in 69gcc/cstamp-h.in: gcc/configure.in gcc/acconfig.h 70gcc/config.in: gcc/cstamp-h.in 71gcc/fixinc/fixincl.x: gcc/fixinc/fixincl.tpl gcc/fixinc/inclhack.def 72gcc/intl/plural.c: gcc/intl/plural.y 73# And then, language-specific files 74gcc/f/intdoc.texi: gcc/f/intdoc.in gcc/f/intdoc.c gcc/f/intrin.h gcc/f/intrin.def 75gcc/cp/cfns.h: gcc/cp/cfns.gperf 76gcc/java/keyword.h: gcc/java/keyword.gperf 77gcc/ada/treeprs.ads: gcc/ada/treeprs.adt gcc/ada/sinfo.ads gcc/ada/xtreeprs.adb 78gcc/ada/einfo.h: gcc/ada/einfo.ads gcc/ada/einfo.adb gcc/ada/xeinfo.adb 79gcc/ada/sinfo.h: gcc/ada/sinfo.ads gcc/ada/xsinfo.adb 80gcc/ada/nmake.adb: gcc/ada/sinfo.ads gcc/ada/nmake.adt gcc/ada/xnmake.adb 81gcc/ada/nmake.ads: gcc/ada/sinfo.ads gcc/ada/nmake.adt gcc/ada/xnmake.adb 82gcc/ada/gnat_ug_unx.texi: gcc/ada/gnat_ug.texi gcc/ada/xgnatug.adb gcc/ada/ug_words 83gcc/ada/gnat_ug_vms.texi: gcc/ada/gnat_ug.texi gcc/ada/xgnatug.adb gcc/ada/ug_words 84gcc/ada/gnat_ug_vxw.texi: gcc/ada/gnat_ug.texi gcc/ada/xgnatug.adb gcc/ada/ug_words 85gcc/ada/gnat_ug_wnt.texi: gcc/ada/gnat_ug.texi gcc/ada/xgnatug.adb gcc/ada/ug_words 86# testsuite 87# Without this, _Pragma3.c can have a false negative. 88gcc/testsuite/gcc.dg/cpp/_Pragma3.c: gcc/testsuite/gcc.dg/cpp/mi1c.h 89# And libraries, at last 90libf2c/configure: libf2c/configure.in 91libf2c/libF77/configure: libf2c/libF77/configure.in 92libf2c/libI77/configure: libf2c/libI77/configure.in 93libf2c/libI77/stamp-h.in: libf2c/libI77/configure.in 94libf2c/libI77/config.h.in: libf2c/libI77/configure.in libf2c/libI77/stamp-h.in 95libf2c/libU77/configure: libf2c/libU77/configure.in 96libf2c/libU77/stamp-h.in: libf2c/libU77/configure.in libf2c/libU77/acconfig.h 97libobjc/configure: libobjc/configure.in 98# fastjar 99fastjar/aclocal.m4: fastjar/configure.in 100fastjar/Makefile.in: fastjar/Makefile.am fastjar/configure.in fastjar/aclocal.m4 101fastjar/configure: fastjar/configure.in fastjar/aclocal.m4 102fastjar/stamp-h.in: fastjar/configure.in fastjar/aclocal.m4 103boehm-gc/aclocal.m4: boehm-gc/configure.in boehm-gc/acinclude.m4 104boehm-gc/Makefile.in: boehm-gc/Makefile.am boehm-gc/configure.in boehm-gc/aclocal.m4 105boehm-gc/configure: boehm-gc/configure.in boehm-gc/aclocal.m4 106libjava/aclocal.m4: libjava/configure.in libjava/acinclude.m4 107libjava/Makefile.in: libjava/Makefile.am libjava/configure.in libjava/aclocal.m4 108libjava/configure: libjava/configure.in libjava/aclocal.m4 109libjava/libltdl/aclocal.m4: libjava/libltdl/configure.in libjava/libltdl/acinclude.m4 110libjava/libltdl/Makefile.in: libjava/libltdl/Makefile.am libjava/libltdl/configure.in libjava/libltdl/aclocal.m4 111libjava/libltdl/configure: libjava/libltdl/configure.in libjava/libltdl/aclocal.m4 112libjava/libltdl/stamp-h.in: libjava/libltdl/configure.in libjava/libltdl/aclocal.m4 libjava/libltdl/acconfig.h 113# Top level 114Makefile.in: Makefile.tpl Makefile.def 115EOF 116} 117 118 119# This function touches generated files such that the ``end'' user does 120# not have to rebuild them. 121touch_files () { 122 rm -f Makefile.$$ 123 echo 'all: \' > Makefile.$$ 124 files_and_dependencies | sed 's, .*, \\,' >> Makefile.$$ 125 echo '; @true' >> Makefile.$$ 126 files_and_dependencies | sed 's, ,: ,' >> Makefile.$$ 127 files_and_dependencies | sed 's, .*, \\,' >> Makefile.$$ 128 echo ':' >> Makefile.$$ 129 echo ' @for f in $? $@; do test -f $$f || exit 0; done; \' >> Makefile.$$ 130 echo ' echo Touching $@...; \' >> Makefile.$$ 131 echo ' echo Touching $@... 1>&2; \' >> Makefile.$$ 132 echo ' touch $@' >> Makefile.$$ 133 files_and_dependencies | sed 's,[^ ]* ,,;s,$, :,' >> Makefile.$$ 134 while ${MAKE-make} -s -f Makefile.$$ all | grep . > /dev/null; do 135 sleep 1 136 done 2>&1 137 rm -f Makefile.$$ 138} 139 140 141# Whenever we update the tree or install a patch, we may be modifying 142# this script. By re-execing it, we ensure that the appropriate 143# dependencies and rules will be used. 144touch_files_reexec () { 145 echo "Adjusting file timestamps" 146 exec ${CONFIG_SHELL-/bin/sh} $self --touch 147} 148 149# This functions applies a patch to an existing tree. 150apply_patch () { 151 if [ -f $1 ]; then 152 echo "Applying patch file $1" 153 case "$1" in 154 *gz) 155 gzip -d -c $1 | patch -p1 ;; 156 *bz2) 157 bzip2 -d -c $1 | patch -p1 ;; 158 *) 159 cat $1 | patch -p1 ;; 160 esac 161 fi 162 touch_files_reexec 163} 164 165# Check whether this indeed looks like a local tree. 166if [ ! -f gcc/version.c ]; then 167 echo "This does not seem to be a GCC tree!" 168 exit 169fi 170 171case "$1" in 172# First of all, check whether we are going to process a patch. 173--patch) 174 if test "$#" != 2; then 175 echo "$1" expects only one argument >&2 176 exit 1 177 fi 178 apply_patch "${2}" 179 exit $? 180 ;; 181 182--touch) 183 if test "$#" != 1; then 184 echo "$1" does not expect any argument >&2 185 exit 1 186 fi 187 touch_files 188 exit $? 189 ;; 190 191--list) 192 if test "$#" != 1; then 193 echo "$1" does not expect any argument >&2 194 exit 1 195 fi 196 files_and_dependencies | sed 's/ /: /' 197 exit $? 198 ;; 199 200--help) 201 sed -e '1,2d' -e '/^UPDATE_OPTIONS=/{i\ 202\ 203 204p 205}' \ 206 -e '/^$/,$d' -e 's/#//' -e 's/^ //' < $0 207 exit $? 208 ;; 209 210esac 211 212# Check whether this indeed looks like a local CVS tree. 213if [ ! -d CVS ]; then 214 echo "This does not seem to be a GCC CVS tree!" 215 exit 216fi 217 218# Check command-line options 219if [ x"${1}"x = x"--nostdflags"x ]; then 220 shift 221else 222 set -- $UPDATE_OPTIONS ${1+"$@"} 223fi 224 225echo "Updating CVS tree" 226cvs -q update ${1+"$@"} 227if [ $? -ne 0 ]; then 228 (touch_files_reexec) 229 echo "CVS update of full tree failed." >&2 230 exit 1 231fi 232 233{ 234 date 235 TZ=UTC date 236} > LAST_UPDATED 237touch_files_reexec 238