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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch: FYI: really update gen-classlist


I reverted the previous gen-classlist due to a bug.

This patch does work and I'm checking it in on the 4.1 branch.
A trunk commit will follow once the build completes.

Tom

Index: ChangeLog.gcj
from  Tom Tromey  <tromey@redhat.com>

	* lib/gen-classlist.sh.in: Correct handle generated files.

2006-04-04  Mark Wielaard  <mark@klomp.org>

	* lib/gen-classlist.sh.in: Use classes.tmp, not classes.2
	as temporary file name.

2006-04-04  Tom Tromey  <tromey@redhat.com>

	* lib/split-for-gcj.sh: Updated for multi-field format.
	* lib/Makefile.am (CLEANFILES): Added classes.2.
	* lib/gen-classlist.sh.in (GCJ): Removed.  Create classes.1 and
	classes.2 using multiple fields.

Index: lib/gen-classlist.sh.in
===================================================================
--- lib/gen-classlist.sh.in	(revision 112665)
+++ lib/gen-classlist.sh.in	(working copy)
@@ -7,39 +7,62 @@
 LC_ALL=C; export LC_ALL
 LANG=C; export LANG
 
-# We use this to decide whether we need to invoke the split script.
-GCJ="@GCJ@"
-
 echo "Adding java source files from srcdir '@top_srcdir@'."
-@FIND@ @top_srcdir@/java @top_srcdir@/javax @top_srcdir@/gnu \
-       @top_srcdir@/org \
-       @top_srcdir@/external/w3c_dom @top_srcdir@/external/sax \
-       -follow -type f -print | sort -r | grep '\.java$' \
-       > ${top_builddir}/lib/classes.1
+# We construct 'classes.1' as a series of lines.  Each line
+# has three fields, which are separated by spaces.  The first
+# field is the package of this class (separated by "/"s).
+# The second field is the name of the top-level directory for
+# this file, relative to the build directory.  E.g., it might
+# look like "../../classpath/vm/reference".
+# The third field is the file name, like "java/lang/Object.java".
+# We do this because it makes splitting for the gcj build much
+# cheaper.
+(cd @top_srcdir@
+ @FIND@ java javax gnu org -follow -name '*.java' -print |
+ sort -r | sed -e 's,/\([^/]*\)$, \1,' |
+ while read pkg file; do
+    echo $pkg @top_srcdir@ $pkg/$file
+ done) > ${top_builddir}/lib/classes.1
 
+# The same, but for the external code.
+# Right now all external code is in org/.
+for dir in @top_srcdir@/external/w3c_dom \
+   @top_srcdir@/external/sax; do
+  (cd $dir
+  @FIND@ org -follow -name '*.java' -print |
+  sort -r | sed -e 's,/\([^/]*\)$, \1,' |
+  while read pkg file; do
+     echo $pkg $dir $pkg/$file
+  done)
+done >> ${top_builddir}/lib/classes.1
+
 # Generate files for the VM classes.
 : > vm.omit
 : > vm.add
 vm_dirlist=`echo "@vm_classes@" | sed -e 's/:/ /g'`
-echo "Adding java source files from VM directory $vm_dirlist"
 for dir in $vm_dirlist; do
+   echo "Adding java source files from VM directory $dir"
    (cd $dir
    for subdir in java javax gnu org com; do
       if test -d $subdir; then
 	 @FIND@ $subdir -name '*.java' -print
       fi
-   done) |
-   while read f; do
-      echo $dir/$f >> vm.add
-      echo $f >> vm.omit
+   done) | sed -e 's,/\([^/]*\)$, \1,' |
+   while read pkg file; do
+      echo $pkg $dir $pkg/$file >> vm.add
+      echo $pkg/$file >> vm.omit
    done
 done
 
 # Only include generated files once.
 if test ! "${top_builddir}" -ef "@top_srcdir@"; then
   echo "Adding generated files in builddir '${top_builddir}'."
-  @FIND@ ${top_builddir}/gnu ${top_builddir}/java -follow -type f -print \
-  | sort | grep '\.java$' >> ${top_builddir}/lib/classes.1
+  # Currently the only generated files are in gnu and java.
+  (cd ${top_builddir}; @FIND@ gnu java -follow -name '*.java' -print) |
+  sort | sed -e 's,/\([^/]*\)$, \1,' |
+  while read pkg file; do
+     echo $pkg $top_builddir $pkg/$file
+  done >> ${top_builddir}/lib/classes.1
 fi
 
 
@@ -50,9 +73,10 @@
    fi
 done
 
+# FIXME: could be more efficient by constructing a series of greps.
 for filexp in `cat tmp.omit`; do
-   grep -v ${filexp} < ${top_builddir}/lib/classes.1 > ${top_builddir}/lib/classes.2
-   mv ${top_builddir}/lib/classes.2 ${top_builddir}/lib/classes.1
+   grep -v ${filexp} < ${top_builddir}/lib/classes.1 > ${top_builddir}/lib/classes.tmp
+   mv ${top_builddir}/lib/classes.tmp ${top_builddir}/lib/classes.1
 done
 
 
@@ -71,18 +95,20 @@
 rm tmp.omit
 
 new=
-if test -e ${top_builddir}/lib/classes; then
-  p=`diff ${top_builddir}/lib/classes ${top_builddir}/lib/classes.1`
+if test -e ${top_builddir}/lib/classes.2; then
+  p=`diff ${top_builddir}/lib/classes.2 ${top_builddir}/lib/classes.1`
   if test "$p" != ""; then
     new="true"
-    cp ${top_builddir}/lib/classes.1 ${top_builddir}/lib/classes
   fi
 else
   new="true"
-  cp ${top_builddir}/lib/classes.1 ${top_builddir}/lib/classes
 fi
 
 if test "$new" = "true"; then
+  cp ${top_builddir}/lib/classes.1 ${top_builddir}/lib/classes.2
+  # Strip the package part.
+  sed -e 's/^[^ ]* //' -e 's, ,/,' < ${top_builddir}/lib/classes.1 \
+     > ${top_builddir}/lib/classes
   echo "JAVA_SRCS = \\" > ${top_builddir}/lib/java.dep
   for i in `cat ${top_builddir}/lib/classes` ; do
     echo $i "\\" >> ${top_builddir}/lib/java.dep
Index: lib/Makefile.am
===================================================================
--- lib/Makefile.am	(revision 112665)
+++ lib/Makefile.am	(working copy)
@@ -141,7 +141,7 @@
 
 EXTRA_DIST = standard.omit mkcollections.pl.in Makefile.gcj split-for-gcj.sh
 CLEANFILES = compile-classes resources classes \
-	glibj.zip classes.1 \
+	glibj.zip classes.1 classes.2 \
 	$(top_builddir)/java/util/LocaleData.java \
 	$(JAVA_DEPEND)
 
Index: lib/split-for-gcj.sh
===================================================================
--- lib/split-for-gcj.sh	(revision 112665)
+++ lib/split-for-gcj.sh	(working copy)
@@ -22,22 +22,24 @@
 # java/awt/BitwiseXORComposite.class: lists/java-awt.stamp
 # lists/java-awt.list: /home/aph/gcc/gcc/libjava/classpath/gnu/java/awt/BitwiseXORComposite.java
 
-# This uses a somewhat hacky procedure for finding the package of a
-# given file.
-
 echo "Splitting for gcj"
 rm -f Makefile.dtmp > /dev/null 2>&1
 test -d lists || mkdir lists
-for dir in java javax gnu org; do
-   fgrep /$dir/ classes | while read file; do
-      pkg=`echo "$file " | sed -n -e "s,^.*/\($dir/.*\)/[^/]*$,\1,p"`
-      list=lists/`echo $pkg | sed -e 's,/,-,g' | cut -f1-3 -d-`
-      echo "$file" >> ${list}.list.1
-      f2=`echo "$file" | sed -n -e "s,^.*/\($dir/.*\)$,\1,p"`
-      f2=`echo "$f2" | sed -e 's/.java$//'`.class
-      echo "$f2: ${list}.stamp" >> Makefile.dtmp
-      echo "${list}.list: $file" >> Makefile.dtmp
-   done
+# Much more efficient to do processing outside the loop...
+# The first expression computes the .class file name.
+# We only want the first three package components, and
+# we want them separated by '-'; this is the remaining expressions.
+sed -e 's, \(.*\)[.]java$, \1.java \1.class,' \
+   -e 's,^\([^/ ]*\)/\([^/ ]*\) ,\1-\2 ,' \
+   -e 's,^\([^/ ]*\)/\([^/ ]*\)/\([^/ ]*\) ,\1-\2-\3 ,' \
+   -e 's,^\([^/ ]*\)/\([^/ ]*\)/\([^/ ]*\)/[^ ]* ,\1-\2-\3 ,' \
+   classes.2 |
+while read pkg dir file f2; do
+   list=lists/$pkg
+   echo "$dir/$file" >> ${list}.list.1
+
+   echo "$f2: ${list}.stamp" >> Makefile.dtmp
+   echo "${list}.list: $dir/$file" >> Makefile.dtmp
 done
 
 # Only update a .list file if it changed.


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