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: 27 Jul 1999 00:14:32 -0300
- Cc: Jerry Quinn <jquinn at nortelnetworks dot com>, Jason Merrill <jason at cygnus dot com>, egcs-patches at egcs dot cygnus dot com, Jeffrey A Law <law at cygnus dot com>
- References: <Pine.GSO.4.10.9907231659540.2511-100000@markab.dbai.tuwien.ac.at>
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