#! /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, 1999, 2000, 2001 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=-Pd
# Use -P to prune empty directories.
# Use -d to create any directories that exist in the repository but not
#           locally.
# Use -A to reset any sticky tags, dates, or `-k' 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 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
# And then, language-specific files
gcc/f/intdoc.texi: gcc/f/intdoc.in gcc/f/intdoc.c gcc/f/intrin.h gcc/f/intrin.def
gcc/ada/treeprs.ads: gcc/ada/treeprs.adt gcc/ada/sinfo.ads gcc/ada/xtreeprs.adb
gcc/ada/einfo.h: gcc/ada/einfo.ads gcc/ada/einfo.adb gcc/ada/xeinfo.adb
gcc/ada/sinfo.h: gcc/ada/sinfo.ads gcc/ada/xsinfo.adb
gcc/ada/nmake.adb: gcc/ada/sinfo.ads gcc/ada/nmake.adt gcc/ada/xnmake.adb
gcc/ada/nmake.ads: gcc/ada/sinfo.ads gcc/ada/nmake.adt gcc/ada/xnmake.adb
# 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/libI77/stamp-h.in: libf2c/libI77/configure.in
libf2c/libI77/config.h.in: libf2c/libI77/configure.in libf2c/libI77/stamp-h.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 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.$$
    echo '	echo Touching $@... 1>&2; \' >> Makefile.$$
    echo '	touch $@' >> Makefile.$$
    files_and_dependencies | sed 's,[^ ]* ,,;s,$, :,' >> Makefile.$$
    while ${MAKE-make} -f Makefile.$$ all | grep . > /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 () {
    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

{
  date
  TZ=UTC date
} > LAST_UPDATED
touch_files_reexec
