diff options
Diffstat (limited to 'libjava/classpath/lib/gen-classlist.sh.in')
-rwxr-xr-x | libjava/classpath/lib/gen-classlist.sh.in | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/libjava/classpath/lib/gen-classlist.sh.in b/libjava/classpath/lib/gen-classlist.sh.in new file mode 100755 index 000000000..a0971ff63 --- /dev/null +++ b/libjava/classpath/lib/gen-classlist.sh.in @@ -0,0 +1,151 @@ +#! @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 + +abs_top_builddir=`cd "${top_builddir}"; pwd` +abs_top_srcdir=`cd "@top_srcdir@"; pwd` + +echo "Adding java source files from srcdir '${abs_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 absolute pathname of the top-level directory +# for this file. E.g., it might look like +# "/home/jezebel/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 ${abs_top_srcdir} $pkg/$file + done) > ${top_builddir}/lib/classes.1 + +# The same, but for the external code. +for dir in \ + ${abs_top_srcdir}/external/w3c_dom \ + ${abs_top_srcdir}/external/sax \ + ${abs_top_srcdir}/external/relaxngDatatype \ + ${abs_top_srcdir}/external/jsr166 \ + ; do + (cd $dir + for subdir in java javax gnu org sun; do + if test -d $subdir; then + @FIND@ $subdir -follow -name '*.java' -print | + sort -r | sed -e 's,/\([^/]*\)$, \1,' | + while read pkg file; do + echo $pkg $dir $pkg/$file + done + fi + 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 "$abs_top_builddir" != "$abs_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 + +# Mangle the omit expressions into a script suitable for old awk. +# Exploit the fact that many omissions are not regular expressions: +# assume a single file is listed if it does not contain '*', '$', +# and ends in '.java'. +sed_omit_hash=' +1i\ + BEGIN {\ + omit[""] = 1 +$a\ + } +/[*$]/d +/\.java$/!d +s|^| omit["| +s|$|"] = 1|' +sed_omit_main_loop=' +1i\ + {\ + if (omit[$3]) next +$a\ + print\ + } +/^[^*$]*\.java$/d +s|/|\\/|g +s|^| if ($3 ~ /| +s|$|/) next|' + +sed "$sed_omit_hash" <tmp.omit >tmp.awk +sed "$sed_omit_main_loop" <tmp.omit >>tmp.awk +@AWK@ -f tmp.awk < ${top_builddir}/lib/classes.1 > ${top_builddir}/lib/classes.tmp +mv ${top_builddir}/lib/classes.tmp ${top_builddir}/lib/classes.1 + +vm_omitlist= +for dir in $vm_dirlist; do + if test -f $dir/$1.omit; then + vm_omitlist="$vm_omitlist $dir/$1.omit" + fi +done +cat $vm_omitlist | sed "$sed_omit_hash" > tmp.awk +cat $vm_omitlist | sed "$sed_omit_main_loop" >> tmp.awk +@AWK@ -f tmp.awk < vm.add >>${top_builddir}/lib/classes.1 + +rm -f vm.omit vm.add tmp.omit tmp.awk + +new= +if test -f ${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 |