This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Reorganize contrib/egcs_update
- To: Gerald Pfeifer <pfeifer at dbai dot tuwien dot ac dot at>
- Subject: Re: Reorganize contrib/egcs_update
- From: Alexandre Oliva <oliva at dcc dot unicamp dot br>
- Date: 13 Jul 1999 06:17:46 -0300
- Cc: egcs-patches at egcs dot cygnus dot com, Jeffrey A Law <law at cygnus dot com>, Jerry Quinn <jquinn at nortelnetworks dot com>
- References: <Pine.GSO.4.10.9907051856020.8877-100000@markab.dbai.tuwien.ac.at>
On Jul 5, 1999, Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at> wrote:
> * egcs_update (touch_files, apply_patch): New functions.
> Use them. New command-line option --patch. Split test of local
> tree into two parts. Add comments.
I seem to recall someone had requested separation of update and patch.
Furthermore, it has always annoyed me that running contrib/egcs_update
while building would wreak havoc in the build, because several files
would be gratuitously touched, causing needless rebuilds and, often,
compare failures. So I've come up with this patch. Ok to install?
--
Alexandre Oliva http://www.dcc.unicamp.br/~oliva IC-Unicamp, Bra[sz]il
oliva@{dcc.unicamp.br,guarana.{org,com}} aoliva@{acm.org,computer.org}
oliva@{gnu.org,kaffe.org,{egcs,sourceware}.cygnus.com,samba.org}
** I may forward mail about projects to mailing lists; please use them
Index: contrib/ChangeLog
from Alexandre Oliva <oliva@dcc.unicamp.br>
* egcs_update (files_and_dependencies): New function, with
complete list of files to be updated, as well as their
dependencies.
(touch_files): Check the timestamp of each generated file against
its dependencies'; handle lightly unsynchronized clocks and report
failures to make files up-to-date.
(main): New flags --touch, --list and --help. Remove the
pre-update step.
Index: contrib/egcs_update
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/contrib/egcs_update,v
retrieving revision 1.15
diff -u -r1.15 egcs_update
--- contrib/egcs_update 1999/07/05 10:22:15 1.15
+++ contrib/egcs_update 1999/07/13 09:16:38
@@ -12,12 +12,21 @@
# 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.
+#
# Examples:
#
# contrib/egcs_update -r egcs_latest_snapshot
# contrib/egcs_update -A
# contrib/egcs_update --nostdflags -P -r egcs_1_1_branch gcc/testsuite
# contrib/egcs_update --patch some-patch
+# contrib/egcs_update --touch
+# contrib/egcs_update --list
#
#
# (C) 1998-1999 Free Software Foundation
@@ -35,41 +44,75 @@
# Add -A to reset any sticky tags, dates, or `-k' options.
+# 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/c-stamp-h.in: gcc/configure.in gcc/acconfig.h
+gcc/c-parse.y: gcc/c-parse.in
+gcc/c-parse.c: gcc/c-parse.y
+gcc/c-parse.h: gcc/c-parse.c
+gcc/c-gperf.h: gcc/c-parse.gperf
+gcc/cexp.c: gcc/cexp.y
+gcc/fixinc/fixincl.x: gcc/fixinc/fixincl.tpl gcc/fixinc/inclhack.def
+gcc/fixinc/inclhack.sh: gcc/fixinc/inclhack.def gcc/fixinc/inclhack.tpl gcc/fixinc/hackshell.tpl
+gcc/fixinc/fixincl.sh: gcc/fixinc/inclhack.def gcc/fixinc/inclhack.tpl
+# And then, language-specific files
+gcc/cp/parse.c: gcc/cp/parse.y
+gcc/cp/parse.h: gcc/cp/parse.c
+gcc/objc/objc-parse.y: gcc/c-parse.in
+gcc/objc/objc-parse.c: gcc/objc/objc-parse.y
+gcc/java/parse.h: gcc/java/parse.y
+gcc/java/parse.c: gcc/java/parse.y gcc/java/lex.c gcc/java/parse.h gcc/java/lex.h
+gcc/java/parse-scan.c: gcc/java/parse-scan.y gcc/java/lex.c gcc/java/parse.h gcc/java/lex.h
+# 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/libU77/configure: libf2c/libU77/configure.in
+libf2c/libU77/stamp-h.in: libf2c/libU77/configure.in libf2c/libU77/acconfig.h
+libobjc/configure: libobjc/configure.in
+EOF
+}
+
+
# This function touches generated files such that the ``end'' user does
# not have to rebuild them.
-#
-# Please also update the FAQ accordingly if you change the list of
-# files below. Note that generated files should be touched only
-# after the corresponding *.y files.
touch_files()
{
- touch `find . -name configure -print`
- touch `find texinfo -name Makefile.in -print`
- touch `find texinfo -name \*.pot -print`
- touch `find texinfo -name \*.gmo -print`
- for f in gcc/c-parse.y \
- gcc/c-parse.h \
- gcc/c-parse.c \
- gcc/cstamp-h.in \
- gcc/c-gperf.h \
- gcc/cexp.c \
- gcc/cp/parse.c \
- gcc/cp/parse.h \
- gcc/objc/objc-parse.y \
- gcc/objc/objc-parse.c \
- gcc/java/parse.h \
- gcc/java/parse.c \
- gcc/java/parse-scan.c \
- libf2c/libU77/stamp-h.in \
- contrib/fixinc/fixincl.x \
- contrib/fixinc/inclhack.sh \
- contrib/fixinc/fixincl.sh \
- gcc/fixinc/fixincl.x \
- gcc/fixinc/inclhack.sh \
- gcc/fixinc/fixincl.sh
- do
- if [ -f $f ]; then
+ files_and_dependencies | while read f deps; do
+ if test -f $f &&
+ test "`ls -1t $f $deps | sed 1q`" != "$f"; then
+ echo Touching "$f"...
touch $f
+ if test "`ls -1t $f $deps | sed 1q`" != "$f"; then
+ # Hmm, it may have got the same timestamp as one of
+ # its touched dependencies. Wait a second and retry
+ sleep 1
+ touch $f
+ if test "`ls -1t $f $deps | sed 1q`" != "$f"; then
+ sleep 15 # Maybe one second is not enough...
+ touch $f
+ if test "`ls -1t $f $deps | sed 1q`" != "$f"; then
+ # Something is wrong, tell the user and proceed...
+ echo "Could not get $f up-to-date, clock out of sync?"
+ fi
+ fi
+ fi
fi
done
}
@@ -87,25 +130,56 @@
cat $1 | patch -p1 ;;
esac
fi
- echo "Updating file timestamps"
+ echo "Adjusting file timestamps"
touch_files
}
-
-# This is where the actual processing starts.
-echo "Current directory is `pwd`."
-
# Check whether this indeed looks like a local tree.
if [ ! -f gcc/version.c ]; then
echo "This does not seem to be an egcs tree!"
exit
fi
+case "$1" in
# First of all, check whether we are going to process a patch.
-if [ x"${1}"x = x"--patch"x ]; then
- apply_patch ${2}
- exit 0
-fi
+-patch|--patch)
+ if test "$#" != 2; then
+ echo "$1" expects only one argument >&2
+ exit 1
+ fi
+ apply_patch "${2}"
+ exit $?
+ ;;
+
+-touch|--touch)
+ if test "$#" != 1; then
+ echo "$1" does not expect any argument >&2
+ exit 1
+ fi
+ touch_files
+ exit $?
+ ;;
+
+-list|--list)
+ if test "$#" != 1; then
+ echo "$1" does not expect any argument >&2
+ exit 1
+ fi
+ files_and_dependencies | sed 's/ /: /'
+ exit $?
+ ;;
+
+-h|-help|--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
@@ -120,29 +194,13 @@
set -- $UPDATE_OPTIONS ${1+"$@"}
fi
-
-echo "Pass 1: Updating autoconf and bison generated files"
-# Do a CVS update on those files that exist in CVS directories. libg++
-# makes sense to drop into the tree, but it isn't CVS-controlled.
-X=`for i in \`find . -name configure.in -o -name '*.y'\`
-do
- D=\`dirname $i\`/CVS
- if [ -f $i -a -d $D ]; then
- echo $i
- fi
-done`
-cvs -q update $X
-if [ $? -ne 0 ]; then
- echo "CVS update of generated files failed." >&2
- exit 1
-fi
-echo "Pass 2: Updating full tree"
+echo "Updating CVS tree"
cvs -q update ${1+"$@"}
if [ $? -ne 0 ]; then
echo "CVS update of full tree failed." >&2
exit 1
fi
-echo "Pass 3: Fixing local tree"
+echo "Adjusting file timestamps"
touch_files