#! @SHELL@
# @configure_input@

# Make sure sorting is done the same on all configurations
# Note the use of sort -r below. This is done explicitly to work around
# a gcj bug (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21418)
LC_ALL=C; export LC_ALL
LANG=C; export LANG

echo "Adding java source files from srcdir '@top_srcdir@'."
# 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 sun -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 @top_srcdir@/external/relaxngDatatype; 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'`
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 sun; do
      if test -d $subdir; then
	 @FIND@ $subdir -name '*.java' -print
      fi
   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}'."
  # Currently the only generated files are in gnu.*.
  (cd ${top_builddir}; @FIND@ gnu -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


cat $1.omit vm.omit > tmp.omit
for dir in $vm_dirlist; do
   if test -f $dir/$1.omit; then
      cat $dir/$1.omit >> tmp.omit
   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.tmp
   mv ${top_builddir}/lib/classes.tmp ${top_builddir}/lib/classes.1
done


for dir in $vm_dirlist; do
   if test -f $dir/$1.omit; then
      for filexp in `cat $dir/$1.omit`; do
	 grep -v $filexp < vm.add > vm.add.1
	 mv vm.add.1 vm.add
      done
   fi
done
cat vm.add >> classes.1

rm vm.omit
rm vm.add
rm tmp.omit

new=
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"
  fi
else
  new="true"
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
  done
fi

exit 0
