This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Reorganize contrib/egcs_update


On Jul 23, 1999, Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at> wrote:

> On 22 Jul 1999, Alexandre Oliva wrote:
>> Another good reason to install the patch.  So, may I go ahead and
>> install it in mainline?

> How about my comments at 
>   http://egcs.cygnus.com/ml/gcc-patches/1999-07/msg00393.html

Duh!  I had marked that message for later reply, but I somehow managed 
to unmark it and it got lost :-(

You had written:

>> I'm not really sure whether the involved `touch`ìng is indeed necessary.

It is, in case cvs update was run before contrib/egcs_update, for
example.

>> Have you experienced problems without this?

Yup; I have a top-level `src' directory with various CVS check-outs,
that I regularly cvs-update.  Thus, I usually get files updated before 
running contrib/egcs_update.  Of course I could try to get used to run 
contrib/egcs_update in the three separate gcc trees I've got checked
out before running the global cvs update, but I'd rather have some way 
to fix a checked-out tree.

>> (If so, I guess it must have been on NFS without synchronized
>> clocks, right?)

Nope, it just occurred to me that someone might face problems because
of unsynchronized clocks.  Anyway, it's probably not worth the
trouble, so, for the sake of simplicity, the attached patch won't
handle this situation.

>> I would prefer just a single form of each option (i.e, --list and
>> not both -list and --list). Especially -h seems dangerous, and
>> might be used by future CVS versions.

Agreed; it's gone now.

>> Note that sometimes you indent by 3 columns instead of 4.

I could only find one such case: it was an `if' condition
continuation, so I guess it was right.  But it's gone now, because of
the next suggestion:

>> The four lines of 
>> test "`ls -1t $f $deps | sed 1q`" != "$f";
>> seem  warrant introducing a function with that functionality.

Even though it appears only twice now, it's better to factor it out
into a function, at least for documentation purposes.


So, is this one ok to install?

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'.
	(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/27 02:52:25
@@ -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; --help prints this message.
+#
 # 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,49 +44,79 @@
 # 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 checks whether its first argument is newer than all
+# the other arguments.  It returns success (0) otherwise.
+is_out_of_date () {
+  test `ls -1dt ${1+"$@"} | sed 1q` != "$1"
+}
+
+
 # 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
+touch_files () {
+    files_and_dependencies | while read f deps; do
+	if test -f $f && is_out_of_date "$f" $deps; then
+	    echo Touching "$f"...
 	    touch $f
+	    if is_out_of_date "$f" $deps; then
+		# Hmm, it may have got the same timestamp as one of
+		# its touched dependencies.  Wait a second and retry
+		sleep 1
+		touch $f
+	    fi
 	fi
     done
 }
 
 
 # This functions applies a patch to an existing tree.
-apply_patch()
-{
+apply_patch () {
     if [ -f $1 ]; then
 	echo "Applying patch file $1"
 	case "$1" in
@@ -87,25 +126,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) 
+    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
@@ -119,30 +189,13 @@
 else
     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


We should probably also rename it from egcs_update to either
gcc_update or cvs_update.  Should we take a vote on its new name?

-- 
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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]