Home | History | Annotate | Download | only in m4
      1 # javacomp.m4 serial 12
      2 dnl Copyright (C) 2001-2003, 2006-2007, 2009-2012 Free Software Foundation,
      3 dnl Inc.
      4 dnl This file is free software; the Free Software Foundation
      5 dnl gives unlimited permission to copy and/or distribute it,
      6 dnl with or without modifications, as long as this notice is preserved.
      7 
      8 # Prerequisites of javacomp.sh.
      9 # gt_JAVACOMP([source-version], [target-version])
     10 # Sets HAVE_JAVACOMP to nonempty if javacomp.sh will allow Java source code
     11 # according to source-version to be compiled to Java bytecode classes in the
     12 # target-version format.
     13 #
     14 # source-version can be:    support for
     15 #           1.3             inner classes
     16 #           1.4             assert keyword
     17 #           1.5             generic classes and methods
     18 #           1.6             (not yet supported)
     19 #
     20 # target-version can be:  classfile version:
     21 #           1.1                 45.3
     22 #           1.2                 46.0
     23 #           1.3                 47.0
     24 #           1.4                 48.0
     25 #           1.5                 49.0
     26 #           1.6                 50.0
     27 # The classfile version of a .class file can be determined through the "file"
     28 # command. More portably, the classfile major version can be determined through
     29 # "od -A n -t d1 -j 7 -N 1 classfile".
     30 # target-version can also be omitted. In this case, the required target-version
     31 # is determined from the found JVM (see macro gt_JAVAEXEC):
     32 #      target-version   for JVM
     33 #           1.1         JDK 1.1, jview
     34 #           1.2         JDK/JRE 1.2
     35 #           1.3         JDK/JRE 1.3, gij 3.3, 3.4
     36 #           1.4         JDK/JRE 1.4, gij 4.0, 4.1
     37 #           1.5         JDK/JRE 1.5
     38 #           1.6         JDK/JRE 1.6
     39 # Note: gij >= 3.3 can in some cases handle classes compiled with -target 1.4,
     40 # and gij >= 4.1 can in some cases partially handle classes compiled with
     41 # -target 1.5, but I have no idea how complete this support is.
     42 #
     43 # Specifying target-version is useful when building a library (.jar) that is
     44 # useful outside the given package. Omitting target-version is useful when
     45 # building an application.
     46 #
     47 # It is unreasonable to ask for:
     48 #   - target-version < 1.4 with source-version >= 1.4, or
     49 #   - target-version < 1.5 with source-version >= 1.5, or
     50 #   - target-version < 1.6 with source-version >= 1.6,
     51 # because even Sun's javac doesn't support these combinations.
     52 #
     53 # It is redundant to ask for a target-version > source-version, since the
     54 # smaller target-version = source-version will also always work and newer JVMs
     55 # support the older target-versions too. Except for the case
     56 # target-version = 1.4, source-version = 1.3, which allows gcj versions 3.0
     57 # to 3.2 to be used.
     58 
     59 AC_DEFUN([gt_JAVACOMP],
     60 [
     61   ifelse([$2], [], [AC_REQUIRE([gt_JAVAEXEC])], [])
     62   AC_EGREP_CPP([yes], [
     63 #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
     64   yes
     65 #endif
     66 ], CLASSPATH_SEPARATOR=';', CLASSPATH_SEPARATOR=':')
     67   source_version=$1
     68   test -n "$source_version" || {
     69     AC_MSG_ERROR([missing source-version argument to gt_@&t@JAVACOMP])
     70   }
     71   ifelse([$2], [],
     72     [if test -n "$HAVE_JAVAEXEC"; then
     73        dnl Use $CONF_JAVA to determine the JVM's version.
     74 changequote(,)dnl
     75        cat > conftestver.java <<EOF
     76 public class conftestver {
     77   public static void main (String[] args) {
     78     System.out.println(System.getProperty("java.specification.version"));
     79   }
     80 }
     81 EOF
     82 changequote([,])dnl
     83        dnl A precompiled version of conftestver.java, compiled with
     84        dnl "javac -target 1.1". This avoids having to compile conftestver.java
     85        dnl during each test for a suitable Java compiler.
     86        dnl For the conversion from binary to this ASCII encapsulation, avoiding
     87        dnl to assume the presence of uudecode, use the command
     88        dnl   $ od -A n -t o1 < conftestver.class | tr ' ' '\012'| sort | uniq | sed -e '/^$/d' -e 's,^,\\,' | tr -d '\012'
     89        dnl and the long tr command in opposite direction.
     90        dnl Finally move the position corresponding to \055 to the last position,
     91        dnl to work around a coreutils-5.x bug.
     92        echo 'yzwx!$!I!D,!)!3+!4!5*!6,!4!7,!8!9)!:)!;"!(MeienN"!$FGW"!%Ojab"!2QeibRohZblVYZgb"!%hYei"!9FXQfYpYKgYidKUnleidLGW"!,Ujol_bPegb"!3_jicnbmnpblJfYpY/!*!+)!</!=!>"!=fYpYJmkb_ece_YnejiJpblmeji/!?!@)!A/!B!C"!._jicnbmnpbl"!3fYpYKgYidKSZfb_n"!3fYpYKgYidKUqmnbh"!$jon"!8QfYpYKejKTleinUnlbYhL"!.dbnTljkblnq"!EFQfYpYKgYidKUnleidLGQfYpYKgYidKUnleidL"!6fYpYKejKTleinUnlbYh"!)kleingi"!8FQfYpYKgYidKUnleidLGW!D!(!)!!!!!#!"!*!+!"!,!!!@!"!"!!!&Hu!"r!!!"!.!!!(!"!!!"!+!/!0!"!,!!!F!#!"!!!/s!#5$v!%t!&r!!!"!.!!!,!#!!!$!.!%!"!1!!!#!2' \
     93          | tr -d '\012\015' \
     94          | tr '!"#$%&()*+,./0123456789:;<=>?@ABCDEFGHJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzI' '\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\046\050\051\052\056\057\073\074\076\103\106\114\116\117\120\123\124\126\133\141\142\143\144\145\146\147\151\152\154\155\156\157\160\162\163\164\165\166\171\261\262\266\267\270\272\276\312\376\055' \
     95          > conftestver.class
     96        target_version=`{
     97          unset JAVA_HOME
     98          echo "$as_me:__oline__: CLASSPATH=.${CLASSPATH:+$CLASSPATH_SEPARATOR$CLASSPATH} $CONF_JAVA conftestver" >&AS_MESSAGE_LOG_FD
     99          CLASSPATH=.${CLASSPATH:+$CLASSPATH_SEPARATOR$CLASSPATH} $CONF_JAVA conftestver 2>&AS_MESSAGE_LOG_FD
    100        }`
    101        case "$target_version" in
    102          1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6) ;;
    103          null)
    104            dnl JDK 1.1.X returns null.
    105            target_version=1.1 ;;
    106          *) AC_MSG_WARN([unknown target-version $target_version, please update gt_@&t@JAVACOMP macro])
    107             target_version=1.1 ;;
    108        esac
    109      else
    110        target_version="1.1"
    111      fi
    112     ],
    113     [target_version=$2])
    114   case "$source_version" in
    115     1.3) goodcode='class conftest {}'
    116          failcode='class conftestfail { static { assert(true); } }' ;;
    117     1.4) goodcode='class conftest     { static { assert(true); } }'
    118          failcode='class conftestfail<T> { T foo() { return null; } }' ;;
    119     1.5) goodcode='class conftest<T>     { T foo() { return null; } }'
    120          failcode='class conftestfail syntax error' ;;
    121     *) AC_MSG_ERROR([invalid source-version argument to gt_@&t@JAVACOMP: $source_version]) ;;
    122   esac
    123   case "$target_version" in
    124     1.1) cfversion=45 ;;
    125     1.2) cfversion=46 ;;
    126     1.3) cfversion=47 ;;
    127     1.4) cfversion=48 ;;
    128     1.5) cfversion=49 ;;
    129     1.6) cfversion=50 ;;
    130     *) AC_MSG_ERROR([invalid target-version argument to gt_@&t@JAVACOMP: $target_version]) ;;
    131   esac
    132   # Function to output the classfile version of a file (8th byte) in decimal.
    133   if od -A x < /dev/null >/dev/null 2>/dev/null; then
    134     # Use POSIX od.
    135     func_classfile_version ()
    136     {
    137       od -A n -t d1 -j 7 -N 1 "[$]1"
    138     }
    139   else
    140     # Use BSD hexdump.
    141     func_classfile_version ()
    142     {
    143       dd if="[$]1" bs=1 count=1 skip=7 2>/dev/null | hexdump -e '1/1 "%3d "'
    144       echo
    145     }
    146   fi
    147   AC_MSG_CHECKING([for Java compiler])
    148   dnl
    149   dnl The support of GNU gcj for target-version and source-version:
    150   dnl
    151   dnl   gcj 3.0.4 to 4.2 does not have a way to specify the target-version.
    152   dnl   It always assumes target-version=1.4 but labels the class files as 1.1.
    153   dnl   One consequence of this is that gcj compiles GetURL.java to invalid
    154   dnl   bytecode, which crashes with a VerifyError when executed by Sun Java
    155   dnl   1.3.1. The bug is registered as java/7066, see
    156   dnl   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7066
    157   dnl   gcj 4.3 and newer has an option -ftarget=1.X.
    158   dnl
    159   dnl   For gcj < 3.3, the source-version always is 1.3.
    160   dnl   For 3.3 <= gcj < 4.3, the source-version defaults to 1.4; option
    161   dnl   "-fno-assert" switches to source-version 1.3.
    162   dnl   gcj >= 4.3 has an option -fsource=1.X.
    163   dnl
    164   dnl The support of Sun javac for target-version and source-version:
    165   dnl
    166   dnl   javac 1.3:   -target 1.1 1.2 1.3               default: 1.1
    167   dnl                                                  source always: 1.3
    168   dnl
    169   dnl   javac 1.4:   -target 1.1 1.2 1.3 1.4           default: 1.2
    170   dnl                -source 1.3 1.4                   default: 1.3
    171   dnl                -target 1.1/1.2/1.3 only possible with -source 1.3 or no -source
    172   dnl
    173   dnl   javac 1.5:   -target 1.1 1.2 1.3 1.4 1.5       default: 1.5
    174   dnl                -source 1.3 1.4 1.5               default: 1.5
    175   dnl                -target 1.1/1.2/1.3 only possible with -source 1.3
    176   dnl                -target 1.4 only possible with -source 1.3/1.4
    177   dnl
    178   dnl   javac 1.6:   -target 1.1 1.2 1.3 1.4 1.5 1.6   default: 1.6
    179   dnl                -source 1.3 1.4 1.5 1.6           default: 1.5
    180   dnl                -target 1.1/1.2/1.3 only possible with -source 1.3
    181   dnl                -target 1.4 only possible with -source 1.3/1.4
    182   dnl                -target 1.5 only possible with -source 1.3/1.4/1.5 or no -source
    183   dnl
    184   dnl The support of jikes for target-version and source-version:
    185   dnl
    186   dnl   jikes 1.14 does not have a way to specify the target-version. It
    187   dnl   always assumes target-version=1.1.
    188   dnl
    189   dnl   For jikes 1.14, the source-version always is 1.3.
    190   dnl
    191   CONF_JAVAC=
    192   HAVE_JAVAC_ENVVAR=
    193   HAVE_GCJ_C=
    194   HAVE_JAVAC=
    195   HAVE_JIKES=
    196   HAVE_JAVACOMP=
    197 changequote(,)dnl
    198   cat > conftestlib.java <<EOF
    199 public class conftestlib {
    200   public static void main (String[] args) {
    201   }
    202 }
    203 EOF
    204 changequote([,])dnl
    205   echo "$goodcode" > conftest.java
    206   echo "$failcode" > conftestfail.java
    207   dnl If the user has set the JAVAC environment variable, use that, if it
    208   dnl satisfies the constraints (possibly after adding -target and -source
    209   dnl options).
    210   if test -n "$JAVAC"; then
    211     dnl Try the original $JAVAC.
    212     if $JAVAC --version 2>/dev/null | sed -e 1q | grep gcj > /dev/null; then
    213       dnl It's a version of gcj.
    214 changequote(,)dnl
    215       if $JAVAC --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null; then
    216 changequote([,])dnl
    217         dnl It's a version of gcj >= 4.3. Assume the classfile versions are correct.
    218         dnl Try $JAVAC.
    219         rm -f conftest.class
    220         if { echo "$as_me:__oline__: $JAVAC -d . conftest.java" >&AS_MESSAGE_LOG_FD
    221              $JAVAC -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    222            } \
    223            && test -f conftest.class \
    224            && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
    225           dnl Try adding -fsource option if it is useful.
    226           rm -f conftest.class
    227           rm -f conftestfail.class
    228           if { echo "$as_me:__oline__: $JAVAC -fsource=$source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
    229                $JAVAC -fsource="$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    230              } \
    231              && test -f conftest.class \
    232              && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \
    233              && { echo "$as_me:__oline__: $JAVAC -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
    234                   $JAVAC -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
    235                 } \
    236              && test -f conftestfail.class \
    237              && ! { echo "$as_me:__oline__: $JAVAC -fsource=$source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
    238                     $JAVAC -fsource="$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
    239                   }; then
    240             CONF_JAVAC="$JAVAC -fsource=$source_version"
    241             HAVE_JAVAC_ENVVAR=1
    242             HAVE_JAVACOMP=1
    243           else
    244             CONF_JAVAC="$JAVAC"
    245             HAVE_JAVAC_ENVVAR=1
    246             HAVE_JAVACOMP=1
    247           fi
    248         else
    249           dnl Try with -fsource and -ftarget options.
    250           rm -f conftest.class
    251           rm -f conftestfail.class
    252           if { echo "$as_me:__oline__: $JAVAC -fsource=$source_version -ftarget=$target_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
    253                $JAVAC -fsource="$source_version" -ftarget="$target_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    254              } \
    255              && test -f conftest.class \
    256              && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
    257             CONF_JAVAC="$JAVAC -fsource=$source_version -ftarget=$target_version"
    258             HAVE_JAVAC_ENVVAR=1
    259             HAVE_JAVACOMP=1
    260           fi
    261         fi
    262       else
    263         dnl It's a version of gcj < 4.3. Ignore the version of conftest.class.
    264         if test "$target_version" = 1.4 && test "$source_version" = 1.4; then
    265           dnl Try $JAVAC.
    266           rm -f conftest.class
    267           if { echo "$as_me:__oline__: $JAVAC -d . conftest.java" >&AS_MESSAGE_LOG_FD
    268                $JAVAC -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    269              } \
    270              && test -f conftest.class; then
    271             CONF_JAVAC="$JAVAC"
    272             HAVE_JAVAC_ENVVAR=1
    273             HAVE_JAVACOMP=1
    274           fi
    275         else
    276           if test "$target_version" = 1.4 && test "$source_version" = 1.3; then
    277             dnl Try $JAVAC and "$JAVAC -fno-assert". But add -fno-assert only if
    278             dnl it makes a difference. (It could already be part of $JAVAC.)
    279             javac_works=
    280             rm -f conftest.class
    281             if { echo "$as_me:__oline__: $JAVAC -d . conftest.java" >&AS_MESSAGE_LOG_FD
    282                  $JAVAC -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    283                } \
    284                && test -f conftest.class; then
    285               javac_works=1
    286             fi
    287             javac_noassert_works=
    288             rm -f conftest.class
    289             if { echo "$as_me:__oline__: $JAVAC -fno-assert -d . conftest.java" >&AS_MESSAGE_LOG_FD
    290                  $JAVAC -fno-assert -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    291                } \
    292                && test -f conftest.class; then
    293               javac_noassert_works=1
    294             fi
    295             if test -n "$javac_works" && test -n "$javac_noassert_works"; then
    296               rm -f conftestfail.class
    297               if { echo "$as_me:__oline__: $JAVAC -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
    298                    $JAVAC -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
    299                  } \
    300                  && test -f conftestfail.class \
    301                  && ! { echo "$as_me:__oline__: $JAVAC -fno-assert -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
    302                         $JAVAC -fno-assert -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
    303                       }; then
    304                 dnl "$JAVAC -fno-assert" works better than $JAVAC.
    305                 javac_works=
    306               fi
    307             fi
    308             if test -n "$javac_works"; then
    309               CONF_JAVAC="$JAVAC"
    310               HAVE_JAVAC_ENVVAR=1
    311               HAVE_JAVACOMP=1
    312             else
    313               if test -n "$javac_noassert_works"; then
    314                 CONF_JAVAC="$JAVAC -fno-assert"
    315                 HAVE_JAVAC_ENVVAR=1
    316                 HAVE_JAVACOMP=1
    317               fi
    318             fi
    319           fi
    320         fi
    321       fi
    322     else
    323       dnl It's not gcj. Assume the classfile versions are correct.
    324       dnl Try $JAVAC.
    325       rm -f conftest.class
    326       if { echo "$as_me:__oline__: $JAVAC -d . conftest.java" >&AS_MESSAGE_LOG_FD
    327            $JAVAC -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    328          } \
    329          && test -f conftest.class \
    330          && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
    331         dnl Try adding -source option if it is useful.
    332         rm -f conftest.class
    333         rm -f conftestfail.class
    334         if { echo "$as_me:__oline__: $JAVAC -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
    335              $JAVAC -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    336            } \
    337            && test -f conftest.class \
    338            && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \
    339            && { echo "$as_me:__oline__: $JAVAC -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
    340                 $JAVAC -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
    341               } \
    342            && test -f conftestfail.class \
    343            && ! { echo "$as_me:__oline__: $JAVAC -source $source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
    344                   $JAVAC -source "$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
    345                 }; then
    346           CONF_JAVAC="$JAVAC -source $source_version"
    347           HAVE_JAVAC_ENVVAR=1
    348           HAVE_JAVACOMP=1
    349         else
    350           CONF_JAVAC="$JAVAC"
    351           HAVE_JAVAC_ENVVAR=1
    352           HAVE_JAVACOMP=1
    353         fi
    354       else
    355         dnl Try with -target option alone. (Sun javac 1.3.1 has the -target
    356         dnl option but no -source option.)
    357         rm -f conftest.class
    358         if { echo "$as_me:__oline__: $JAVAC -target $target_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
    359              $JAVAC -target "$target_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    360            } \
    361            && test -f conftest.class \
    362            && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
    363           dnl Try adding -source option if it is useful.
    364           rm -f conftest.class
    365           rm -f conftestfail.class
    366           if { echo "$as_me:__oline__: $JAVAC -target $target_version -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
    367                $JAVAC -target "$target_version" -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    368              } \
    369              && test -f conftest.class \
    370              && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \
    371              && { echo "$as_me:__oline__: $JAVAC -target $target_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
    372                   $JAVAC -target "$target_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
    373                 } \
    374              && test -f conftestfail.class \
    375              && ! { echo "$as_me:__oline__: $JAVAC -target $target_version -source $source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
    376                     $JAVAC -target "$target_version" -source "$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
    377                   }; then
    378             CONF_JAVAC="$JAVAC -target $target_version -source $source_version"
    379             HAVE_JAVAC_ENVVAR=1
    380             HAVE_JAVACOMP=1
    381           else
    382             CONF_JAVAC="$JAVAC -target $target_version"
    383             HAVE_JAVAC_ENVVAR=1
    384             HAVE_JAVACOMP=1
    385           fi
    386         else
    387           dnl Maybe this -target option requires a -source option? Try with
    388           dnl -target and -source options. (Supported by Sun javac 1.4 and
    389           dnl higher.)
    390           rm -f conftest.class
    391           if { echo "$as_me:__oline__: $JAVAC -target $target_version -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
    392                $JAVAC -target "$target_version" -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    393              } \
    394              && test -f conftest.class \
    395              && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
    396             CONF_JAVAC="$JAVAC -target $target_version -source $source_version"
    397             HAVE_JAVAC_ENVVAR=1
    398             HAVE_JAVACOMP=1
    399           fi
    400         fi
    401       fi
    402     fi
    403   fi
    404   if test -z "$HAVE_JAVACOMP"; then
    405     pushdef([AC_MSG_CHECKING],[:])dnl
    406     pushdef([AC_CHECKING],[:])dnl
    407     pushdef([AC_MSG_RESULT],[:])dnl
    408     AC_CHECK_PROG([HAVE_GCJ_IN_PATH], [gcj], [yes])
    409     AC_CHECK_PROG([HAVE_JAVAC_IN_PATH], [javac], [yes])
    410     AC_CHECK_PROG([HAVE_JIKES_IN_PATH], [jikes], [yes])
    411     popdef([AC_MSG_RESULT])dnl
    412     popdef([AC_CHECKING])dnl
    413     popdef([AC_MSG_CHECKING])dnl
    414     if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_GCJ_IN_PATH"; then
    415       dnl Test for a good gcj version (>= 3.0).
    416 changequote(,)dnl
    417       if gcj --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^3\.[01]/d' | grep '^[3-9]' >/dev/null; then
    418 changequote([,])dnl
    419         dnl See if libgcj.jar is well installed.
    420         if { echo "$as_me:__oline__: gcj -C -d . conftestlib.java" >&AS_MESSAGE_LOG_FD
    421              gcj -C -d . conftestlib.java >&AS_MESSAGE_LOG_FD 2>&1
    422            }; then
    423           dnl OK, gcj works.
    424 changequote(,)dnl
    425           if gcj --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null; then
    426 changequote([,])dnl
    427             dnl It's a version of gcj >= 4.3. Assume the classfile versions are correct.
    428             dnl Try gcj.
    429             rm -f conftest.class
    430             if { echo "$as_me:__oline__: gcj -C -d . conftest.java" >&AS_MESSAGE_LOG_FD
    431                  gcj -C -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    432                } \
    433                && test -f conftest.class \
    434                && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
    435               dnl Try adding -fsource option if it is useful.
    436               rm -f conftest.class
    437               rm -f conftestfail.class
    438               if { echo "$as_me:__oline__: gcj -C -fsource=$source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
    439                    gcj -C -fsource="$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    440                  } \
    441                  && test -f conftest.class \
    442                  && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \
    443                  && { echo "$as_me:__oline__: gcj -C -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
    444                       gcj -C -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
    445                     } \
    446                  && test -f conftestfail.class \
    447                  && ! { echo "$as_me:__oline__: gcj -C -fsource=$source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
    448                         gcj -C -fsource="$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
    449                       }; then
    450                 CONF_JAVAC="gcj -C -fsource=$source_version"
    451                 HAVE_JAVAC_ENVVAR=1
    452                 HAVE_JAVACOMP=1
    453               else
    454                 CONF_JAVAC="gcj -C"
    455                 HAVE_JAVAC_ENVVAR=1
    456                 HAVE_JAVACOMP=1
    457               fi
    458             else
    459               dnl Try with -fsource and -ftarget options.
    460               rm -f conftest.class
    461               rm -f conftestfail.class
    462               if { echo "$as_me:__oline__: gcj -C -fsource=$source_version -ftarget=$target_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
    463                    gcj -C -fsource="$source_version" -ftarget="$target_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    464                  } \
    465                  && test -f conftest.class \
    466                  && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
    467                 CONF_JAVAC="gcj -C -fsource=$source_version -ftarget=$target_version"
    468                 HAVE_JAVAC_ENVVAR=1
    469                 HAVE_JAVACOMP=1
    470               fi
    471             fi
    472           else
    473             dnl It's a version of gcj < 4.3. Ignore the version of conftest.class.
    474             dnl Now test whether it supports the desired target-version and
    475             dnl source-version.
    476             if test "$target_version" = 1.4 && test "$source_version" = 1.4; then
    477               rm -f conftest.class
    478               if { echo "$as_me:__oline__: gcj -C -d . conftest.java" >&AS_MESSAGE_LOG_FD
    479                    gcj -C -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    480                  } \
    481                  && test -f conftest.class; then
    482                 CONF_JAVAC="gcj -C"
    483                 HAVE_GCJ_C=1
    484                 HAVE_JAVACOMP=1
    485               fi
    486             else
    487               if test "$target_version" = 1.4 && test "$source_version" = 1.3; then
    488                 dnl Try gcj and "gcj -fno-assert". But add -fno-assert only if
    489                 dnl it works (not gcj < 3.3).
    490                 rm -f conftest.class
    491                 if { echo "$as_me:__oline__: gcj -C -fno-assert -d . conftest.java" >&AS_MESSAGE_LOG_FD
    492                      gcj -C -fno-assert -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    493                    } \
    494                    && test -f conftest.class; then
    495                   CONF_JAVAC="gcj -C -fno-assert"
    496                   HAVE_GCJ_C=1
    497                   HAVE_JAVACOMP=1
    498                 else
    499                   rm -f conftest.class
    500                   if { echo "$as_me:__oline__: gcj -C -d . conftest.java" >&AS_MESSAGE_LOG_FD
    501                        gcj -C -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    502                      } \
    503                      && test -f conftest.class; then
    504                     CONF_JAVAC="gcj -C"
    505                     HAVE_GCJ_C=1
    506                     HAVE_JAVACOMP=1
    507                   fi
    508                 fi
    509               fi
    510             fi
    511           fi
    512         fi
    513       fi
    514     fi
    515     if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_JAVAC_IN_PATH"; then
    516       dnl Test whether javac is usable.
    517       if { javac -version >/dev/null 2>/dev/null || test $? -le 2; } \
    518          && ( if javac -help 2>&1 >/dev/null | grep at.dms.kjc.Main >/dev/null && javac -help 2>/dev/null | grep 'released.*2000' >/dev/null ; then exit 1; else exit 0; fi ); then
    519         dnl OK, javac works.
    520         dnl Now test whether it supports the desired target-version and
    521         dnl source-version.
    522         rm -f conftest.class
    523         if { echo "$as_me:__oline__: javac -d . conftest.java" >&AS_MESSAGE_LOG_FD
    524              javac -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    525            } \
    526            && test -f conftest.class \
    527            && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
    528           dnl Try adding -source option if it is useful.
    529           rm -f conftest.class
    530           rm -f conftestfail.class
    531           if { echo "$as_me:__oline__: javac -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
    532                javac -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    533              } \
    534              && test -f conftest.class \
    535              && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \
    536              && { echo "$as_me:__oline__: javac -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
    537                   javac -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
    538                 } \
    539              && test -f conftestfail.class \
    540              && ! { echo "$as_me:__oline__: javac -source $source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
    541                     javac -source "$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
    542                   }; then
    543             CONF_JAVAC="javac -source $source_version"
    544             HAVE_JAVAC=1
    545             HAVE_JAVACOMP=1
    546           else
    547             CONF_JAVAC="javac"
    548             HAVE_JAVAC=1
    549             HAVE_JAVACOMP=1
    550           fi
    551         else
    552           dnl Try with -target option alone. (Sun javac 1.3.1 has the -target
    553           dnl option but no -source option.)
    554           rm -f conftest.class
    555           if { echo "$as_me:__oline__: javac -target $target_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
    556                javac -target "$target_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    557              } \
    558              && test -f conftest.class \
    559              && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
    560             dnl Try adding -source option if it is useful.
    561             rm -f conftest.class
    562             rm -f conftestfail.class
    563             if { echo "$as_me:__oline__: javac -target $target_version -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
    564                  javac -target "$target_version" -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    565                } \
    566                && test -f conftest.class \
    567                && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \
    568                && { echo "$as_me:__oline__: javac -target $target_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
    569                     javac -target "$target_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
    570                   } \
    571                && test -f conftestfail.class \
    572                && ! { echo "$as_me:__oline__: javac -target $target_version -source $source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD
    573                       javac -target "$target_version" -source "$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1
    574                     }; then
    575               CONF_JAVAC="javac -target $target_version -source $source_version"
    576               HAVE_JAVAC=1
    577               HAVE_JAVACOMP=1
    578             else
    579               CONF_JAVAC="javac -target $target_version"
    580               HAVE_JAVAC=1
    581               HAVE_JAVACOMP=1
    582             fi
    583           else
    584             dnl Maybe this -target option requires a -source option? Try with
    585             dnl -target and -source options. (Supported by Sun javac 1.4 and
    586             dnl higher.)
    587             rm -f conftest.class
    588             if { echo "$as_me:__oline__: javac -target $target_version -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD
    589                  javac -target "$target_version" -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1
    590                } \
    591                && test -f conftest.class \
    592                && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then
    593               CONF_JAVAC="javac -target $target_version -source $source_version"
    594               HAVE_JAVAC=1
    595               HAVE_JAVACOMP=1
    596             fi
    597           fi
    598         fi
    599       fi
    600     fi
    601     if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_JIKES_IN_PATH"; then
    602       dnl Test whether jikes is usable.
    603       if { jikes >/dev/null 2>/dev/null || test $? = 1; } \
    604          && (
    605               # See if the existing CLASSPATH is sufficient to make jikes work.
    606               unset JAVA_HOME
    607               jikes conftestlib.java >&AS_MESSAGE_LOG_FD 2>&1
    608               error=$?
    609               rm -f conftestlib.class
    610               exit $error
    611             ); then
    612         dnl OK, jikes works.
    613         dnl Now test whether it supports the desired target-version and
    614         dnl source-version.
    615         if test "$source_version" = 1.3; then
    616           CONF_JAVAC="jikes"
    617           HAVE_JIKES=1
    618           HAVE_JAVACOMP=1
    619         fi
    620       fi
    621     fi
    622   fi
    623   rm -f conftest*.java conftest*.class
    624   if test -n "$HAVE_JAVACOMP"; then
    625     ac_result="$CONF_JAVAC"
    626   else
    627     ac_result="no"
    628   fi
    629   AC_MSG_RESULT([$ac_result])
    630   AC_SUBST([CONF_JAVAC])
    631   AC_SUBST([CLASSPATH])
    632   AC_SUBST([CLASSPATH_SEPARATOR])
    633   AC_SUBST([HAVE_JAVAC_ENVVAR])
    634   AC_SUBST([HAVE_GCJ_C])
    635   AC_SUBST([HAVE_JAVAC])
    636   AC_SUBST([HAVE_JIKES])
    637 ])
    638