# javacomp.m4 serial 19 dnl Copyright (C) 2001-2003, 2006-2007, 2009-2023 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Prerequisites of javacomp.sh. # gt_JAVACOMP([source-version], [target-version]) # Sets HAVE_JAVACOMP to nonempty if javacomp.sh will allow Java source code # according to source-version to be compiled to Java bytecode classes in the # target-version format. # # source-version can be: support for # 1.3 inner classes # 1.4 assert keyword # 1.5 generic classes and methods # 1.6 (not supported) # 1.7 switch(string) # 1.8 lambdas # 9 private interface methods # 10 type inference for local variables # 11 'var' in parameters of lambda expressions # Instead of source-version 1.6, use 1.5, since Java 6 did not introduce any # language changes. See # https://docs.oracle.com/javase/8/docs/technotes/guides/language/enhancements.html # # target-version can be: classfile version: # 1.1 45.3 # 1.2 46.0 # 1.3 47.0 # 1.4 48.0 # 1.5 49.0 # 1.6 50.0 # 1.7 51.0 # 1.8 52.0 # 9 53.0 # 10 54.0 # 11 55.0 # The classfile version of a .class file can be determined through the "file" # command. More portably, the classfile major version can be determined through # "od -A n -t d1 -j 7 -N 1 classfile". # target-version can also be omitted. In this case, the required target-version # is determined from the found JVM (see macro gt_JAVAEXEC): # target-version for JVM # 1.1 JDK 1.1, jview # 1.2 JDK/JRE 1.2 # 1.3 JDK/JRE 1.3, gij 3.3, 3.4 # 1.4 JDK/JRE 1.4, gij 4.0 ... 4.2 # 1.5 JDK/JRE 5, gij 4.3 ... 6 # 1.6 JDK/JRE 6 # 1.7 JDK/JRE 7 # 1.8 JDK/JRE 8 # 9 JDK/JRE 9 # 10 JDK/JRE 10 # 11 JDK/JRE 11 # Note: gij >= 3.3 can in some cases handle classes compiled with -target 1.4, # and gij >= 4.1 can in some cases partially handle classes compiled with # -target 1.5, but I have no idea how complete this support is. Similarly, # gcj >= 4.3 supports -ftarget=1.6, and gij >= 4.3 can in some cases handle # classes compiled with -target 1.6. # # Specifying target-version is useful when building a library (.jar) that is # useful outside the given package. Omitting target-version is useful when # building an application. # # It is unreasonable to ask for: # - target-version < 1.4 with source-version >= 1.4, or # - target-version < 1.5 with source-version >= 1.5, or # - target_version < 1.6 with source_version >= 1.6, or # - target_version < 1.7 with source_version >= 1.7, or # - target_version < 1.8 with source_version >= 1.8, or # - target_version < 9 with source_version >= 9, or # - target_version < 10 with source_version >= 10, or # - target_version < 11 with source_version >= 11, # because even Sun's/Oracle's javac doesn't support these combinations. # # It is redundant to ask for a target-version > source-version, since the # smaller target-version = source-version will also always work and newer JVMs # support the older target-versions too. Except for the cases # - target-version = 1.4, source-version = 1.3, which allows gcj versions 3.0 # to 3.2 to be used, # - target-version = 1.6, source-version = 1.5, which allows gcj versions # >= 4.3 to be used. AC_DEFUN([gt_JAVACOMP], [ m4_if([$2], [], [AC_REQUIRE([gt_JAVAEXEC])], []) AC_EGREP_CPP([yes], [ #if defined _WIN32 || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ yes #endif ], CLASSPATH_SEPARATOR=';', CLASSPATH_SEPARATOR=':') source_version=$1 test -n "$source_version" || { AC_MSG_ERROR([missing source-version argument to gt_@&t@JAVACOMP]) } m4_if([$2], [], [if test -n "$HAVE_JAVAEXEC"; then dnl Use $CONF_JAVA to determine the JVM's version. changequote(,)dnl cat > conftestver.java <"!=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' \ | tr -d '\012\015' \ | 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' \ > conftestver.class target_version=`{ unset JAVA_HOME echo "$as_me:__oline__: CLASSPATH=.${CLASSPATH:+$CLASSPATH_SEPARATOR$CLASSPATH} $CONF_JAVA conftestver" >&AS_MESSAGE_LOG_FD CLASSPATH=.${CLASSPATH:+$CLASSPATH_SEPARATOR$CLASSPATH} $CONF_JAVA conftestver 2>&AS_MESSAGE_LOG_FD }` case "$target_version" in 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7 | 1.8 | 9 | 10 | 11) ;; 12 | 13 | 14 | 15 | 16 | 17) dnl Assume that these (not yet released) Java versions will behave dnl like the preceding ones. target_version=11 ;; null) dnl JDK 1.1.X returns null. target_version=1.1 ;; *) AC_MSG_WARN([unknown target-version $target_version, please update gt_@&t@JAVACOMP macro]) target_version=1.1 ;; esac else target_version="1.1" fi ], [target_version=$2]) case "$source_version" in 1.3) goodcode='class conftest {}' failcode='class conftestfail { static { assert(true); } }' ;; 1.4) goodcode='class conftest { static { assert(true); } }' failcode='class conftestfail { T foo() { return null; } }' ;; 1.5) goodcode='class conftest { T foo() { return null; } }' failcode='class conftestfail { void foo () { switch ("A") {} } }' ;; 1.7) goodcode='class conftest { void foo () { switch ("A") {} } }' failcode='class conftestfail { void foo () { Runnable r = () -> {}; } }' ;; 1.8) goodcode='class conftest { void foo () { Runnable r = () -> {}; } }' failcode='interface conftestfail { private void foo () {} }' ;; 9) goodcode='interface conftest { private void foo () {} }' failcode='class conftestfail { public void m() { var i = new Integer(0); } }' ;; 10) goodcode='class conftest { public void m() { var i = new Integer(0); } }' failcode='class conftestfail { Readable r = (var b) -> 0; }' ;; 11) goodcode='class conftest { Readable r = (var b) -> 0; }' failcode='class conftestfail syntax error' ;; *) AC_MSG_ERROR([invalid source-version argument to gt_@&t@JAVACOMP: $source_version]) ;; esac case "$target_version" in 1.1) cfversion=45 ;; 1.2) cfversion=46 ;; 1.3) cfversion=47 ;; 1.4) cfversion=48 ;; 1.5) cfversion=49 ;; 1.6) cfversion=50 ;; 1.7) cfversion=51 ;; 1.8) cfversion=52 ;; 9) cfversion=53 ;; 10) cfversion=54 ;; 11) cfversion=55 ;; *) AC_MSG_ERROR([invalid target-version argument to gt_@&t@JAVACOMP: $target_version]) ;; esac # Function to output the classfile version of a file (8th byte) in decimal. if od -A x < /dev/null >/dev/null 2>/dev/null; then # Use POSIX od. func_classfile_version () { od -A n -t d1 -j 7 -N 1 "[$]1" } else # Use BSD hexdump. func_classfile_version () { dd if="[$]1" bs=1 count=1 skip=7 2>/dev/null | hexdump -e '1/1 "%3d "' echo } fi AC_MSG_CHECKING([for Java compiler]) dnl dnl The support of GNU gcj for target-version and source-version: dnl dnl gcj 3.0.4 to 4.2 does not have a way to specify the target-version. dnl It always assumes target-version=1.4 but labels the class files as 1.1. dnl One consequence of this is that gcj compiles GetURL.java to invalid dnl bytecode, which crashes with a VerifyError when executed by Sun Java dnl 1.3.1. The bug is registered as java/7066, see dnl https://gcc.gnu.org/bugzilla/show_bug.cgi?id=7066 dnl gcj 4.3 and newer has an option -ftarget=1.X; the maximum supported dnl target-version is 1.6. dnl dnl For gcj < 3.3, the source-version always is 1.3. dnl For 3.3 <= gcj < 4.3, the source-version defaults to 1.4; option dnl "-fno-assert" switches to source-version 1.3. dnl gcj >= 4.3 has an option -fsource=1.X. dnl dnl The support of Sun/Oracle javac for target-version and source-version: dnl dnl javac 1.3: -target 1.1 1.2 1.3 default: 1.1 dnl source always: 1.3 dnl dnl javac 1.4: -target 1.1 1.2 1.3 1.4 default: 1.2 dnl -source 1.3 1.4 default: 1.3 dnl -target 1.1/1.2/1.3 only possible with -source 1.3 or no -source dnl dnl javac 1.5: -target 1.1 1.2 1.3 1.4 1.5 default: 1.5 dnl -source 1.3 1.4 1.5 default: 1.5 dnl -target 1.1/1.2/1.3 only possible with -source 1.3 dnl -target 1.4 only possible with -source 1.3/1.4 dnl dnl javac 1.6: -target 1.1 1.2 1.3 1.4 1.5 1.6 default: 1.6 dnl -source 1.3 1.4 1.5 1.6 default: 1.5 dnl -target 1.1/1.2/1.3 only possible with -source 1.3 dnl -target 1.4 only possible with -source 1.3/1.4 dnl -target 1.5 only possible with -source 1.3/1.4/1.5 or no -source dnl dnl javac 1.7: -target 1.1 1.2 1.3 1.4 1.5 1.6 1.7 default: 1.7 dnl -source 1.3 1.4 1.5 1.6 1.7 default: 1.7 dnl -target 1.1/1.2/1.3 only possible with -source 1.3 dnl -target 1.4 only possible with -source 1.3/1.4 dnl -target 1.5 only possible with -source 1.3/1.4/1.5 dnl -target 1.6 only possible with -source 1.3/1.4/1.5/1.6 dnl dnl javac 1.8: -target 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 default: 1.8 dnl -source 1.3 1.4 1.5 1.6 1.7 1.8 default: 1.8 dnl -target 1.1/1.2/1.3 only possible with -source 1.3 dnl -target 1.4 only possible with -source 1.3/1.4 dnl -target 1.5 only possible with -source 1.3/1.4/1.5 dnl -target 1.6 only possible with -source 1.3/1.4/1.5/1.6 dnl -target 1.7 only possible with -source 1.3/1.4/1.5/1.6/1.7 dnl dnl javac 9: -target 1.6 1.7 1.8 9 default: 9 dnl -source 1.6 1.7 1.8 9 default: 9 dnl -target 1.6 only possible with -source 1.6 dnl -target 1.7 only possible with -source 1.6/1.7 dnl -target 1.8 only possible with -source 1.6/1.7/1.8 dnl dnl javac 10: -target 1.6 1.7 1.8 9 10 default: 10 dnl -source 1.6 1.7 1.8 9 10 default: 10 dnl -target 1.6 only possible with -source 1.6 dnl -target 1.7 only possible with -source 1.6/1.7 dnl -target 1.8 only possible with -source 1.6/1.7/1.8 dnl -target 9 only possible with -source 1.6/1.7/1.8/9 dnl dnl javac 11: -target 1.6 1.7 1.8 9 10 11 default: 11 dnl -source 1.6 1.7 1.8 9 10 11 default: 11 dnl -target 1.6 only possible with -source 1.6 dnl -target 1.7 only possible with -source 1.6/1.7 dnl -target 1.8 only possible with -source 1.6/1.7/1.8 dnl -target 9 only possible with -source 1.6/1.7/1.8/9 dnl -target 10 only possible with -source 1.6/1.7/1.8/9/10 dnl dnl The support of jikes for target-version and source-version: dnl dnl jikes 1.14 does not have a way to specify the target-version. It dnl always assumes target-version=1.1. dnl dnl For jikes 1.14, the source-version always is 1.3. dnl CONF_JAVAC= HAVE_JAVAC_ENVVAR= HAVE_GCJ_C= HAVE_JAVAC= HAVE_JIKES= HAVE_JAVACOMP= changequote(,)dnl cat > conftestlib.java < conftest.java echo "$failcode" > conftestfail.java dnl If the user has set the JAVAC environment variable, use that, if it dnl satisfies the constraints (possibly after adding -target and -source dnl options). if test -n "$JAVAC"; then dnl Try the original $JAVAC. if $JAVAC --version 2>/dev/null | sed -e 1q | grep gcj > /dev/null; then dnl It's a version of gcj. changequote(,)dnl if $JAVAC --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null; then changequote([,])dnl dnl It's a version of gcj >= 4.3. Assume the classfile versions are correct. dnl Try $JAVAC. rm -f conftest.class if { echo "$as_me:__oline__: $JAVAC -d . conftest.java" >&AS_MESSAGE_LOG_FD $JAVAC -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then dnl Try adding -fsource option if it is useful. rm -f conftest.class rm -f conftestfail.class if { echo "$as_me:__oline__: $JAVAC -fsource=$source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD $JAVAC -fsource="$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \ && { echo "$as_me:__oline__: $JAVAC -d . conftestfail.java" >&AS_MESSAGE_LOG_FD $JAVAC -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftestfail.class \ && ! { echo "$as_me:__oline__: $JAVAC -fsource=$source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD $JAVAC -fsource="$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1 }; then CONF_JAVAC="$JAVAC -fsource=$source_version" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 else CONF_JAVAC="$JAVAC" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 fi else dnl Try with -fsource and -ftarget options. rm -f conftest.class rm -f conftestfail.class if { echo "$as_me:__oline__: $JAVAC -fsource=$source_version -ftarget=$target_version -d . conftest.java" >&AS_MESSAGE_LOG_FD $JAVAC -fsource="$source_version" -ftarget="$target_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then CONF_JAVAC="$JAVAC -fsource=$source_version -ftarget=$target_version" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 fi fi else dnl It's a version of gcj < 4.3. Ignore the version of conftest.class. if test "$target_version" = 1.4 && test "$source_version" = 1.4; then dnl Try $JAVAC. rm -f conftest.class if { echo "$as_me:__oline__: $JAVAC -d . conftest.java" >&AS_MESSAGE_LOG_FD $JAVAC -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class; then CONF_JAVAC="$JAVAC" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 fi else if test "$target_version" = 1.4 && test "$source_version" = 1.3; then dnl Try $JAVAC and "$JAVAC -fno-assert". But add -fno-assert only if dnl it makes a difference. (It could already be part of $JAVAC.) javac_works= rm -f conftest.class if { echo "$as_me:__oline__: $JAVAC -d . conftest.java" >&AS_MESSAGE_LOG_FD $JAVAC -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class; then javac_works=1 fi javac_noassert_works= rm -f conftest.class if { echo "$as_me:__oline__: $JAVAC -fno-assert -d . conftest.java" >&AS_MESSAGE_LOG_FD $JAVAC -fno-assert -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class; then javac_noassert_works=1 fi if test -n "$javac_works" && test -n "$javac_noassert_works"; then rm -f conftestfail.class if { echo "$as_me:__oline__: $JAVAC -d . conftestfail.java" >&AS_MESSAGE_LOG_FD $JAVAC -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftestfail.class \ && ! { echo "$as_me:__oline__: $JAVAC -fno-assert -d . conftestfail.java" >&AS_MESSAGE_LOG_FD $JAVAC -fno-assert -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1 }; then dnl "$JAVAC -fno-assert" works better than $JAVAC. javac_works= fi fi if test -n "$javac_works"; then CONF_JAVAC="$JAVAC" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 else if test -n "$javac_noassert_works"; then CONF_JAVAC="$JAVAC -fno-assert" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 fi fi fi fi fi else dnl It's not gcj. Assume the classfile versions are correct. dnl Try $JAVAC. dnl The javac option '-source 1.5' has the same meaning as '-source 1.6', dnl but since Java 9 supports only the latter, prefer the latter if a dnl target_version >= 1.6 is requested. if test "$source_version" = 1.5; then case "$target_version" in 1.1 | 1.2 | 1.3 | 1.4 | 1.5) ;; *) source_version='1.6' ;; esac fi rm -f conftest.class if { echo "$as_me:__oline__: $JAVAC -d . conftest.java" >&AS_MESSAGE_LOG_FD $JAVAC -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then dnl Try adding -source option if it is useful. rm -f conftest.class rm -f conftestfail.class if { echo "$as_me:__oline__: $JAVAC -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD $JAVAC -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \ && { echo "$as_me:__oline__: $JAVAC -d . conftestfail.java" >&AS_MESSAGE_LOG_FD $JAVAC -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftestfail.class \ && ! { echo "$as_me:__oline__: $JAVAC -source $source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD $JAVAC -source "$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1 }; then CONF_JAVAC="$JAVAC -source $source_version" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 else CONF_JAVAC="$JAVAC" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 fi else dnl Try with -target option alone. (Sun javac 1.3.1 has the -target dnl option but no -source option.) rm -f conftest.class if { echo "$as_me:__oline__: $JAVAC -target $target_version -d . conftest.java" >&AS_MESSAGE_LOG_FD $JAVAC -target "$target_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then dnl Try adding -source option if it is useful. rm -f conftest.class rm -f conftestfail.class if { echo "$as_me:__oline__: $JAVAC -target $target_version -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD $JAVAC -target "$target_version" -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \ && { echo "$as_me:__oline__: $JAVAC -target $target_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD $JAVAC -target "$target_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftestfail.class \ && ! { echo "$as_me:__oline__: $JAVAC -target $target_version -source $source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD $JAVAC -target "$target_version" -source "$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1 }; then CONF_JAVAC="$JAVAC -target $target_version -source $source_version" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 else CONF_JAVAC="$JAVAC -target $target_version" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 fi else dnl Maybe this -target option requires a -source option? Try with dnl -target and -source options. (Supported by Sun javac 1.4 and dnl higher.) rm -f conftest.class if { echo "$as_me:__oline__: $JAVAC -target $target_version -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD $JAVAC -target "$target_version" -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then CONF_JAVAC="$JAVAC -target $target_version -source $source_version" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 fi fi fi fi fi if test -z "$HAVE_JAVACOMP"; then pushdef([AC_MSG_CHECKING],[:])dnl pushdef([AC_CHECKING],[:])dnl pushdef([AC_MSG_RESULT],[:])dnl AC_CHECK_PROG([HAVE_GCJ_IN_PATH], [gcj], [yes]) AC_CHECK_PROG([HAVE_JAVAC_IN_PATH], [javac], [yes]) AC_CHECK_PROG([HAVE_JIKES_IN_PATH], [jikes], [yes]) popdef([AC_MSG_RESULT])dnl popdef([AC_CHECKING])dnl popdef([AC_MSG_CHECKING])dnl if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_GCJ_IN_PATH"; then dnl Test for a good gcj version (>= 3.0). changequote(,)dnl if gcj --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^3\.[01]/d' | grep '^[3-9]' >/dev/null; then changequote([,])dnl dnl See if libgcj.jar is well installed. if { echo "$as_me:__oline__: gcj -C -d . conftestlib.java" >&AS_MESSAGE_LOG_FD gcj -C -d . conftestlib.java >&AS_MESSAGE_LOG_FD 2>&1 }; then dnl OK, gcj works. changequote(,)dnl if gcj --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null; then changequote([,])dnl dnl It's a version of gcj >= 4.3. Assume the classfile versions are correct. dnl Try gcj. rm -f conftest.class if { echo "$as_me:__oline__: gcj -C -d . conftest.java" >&AS_MESSAGE_LOG_FD gcj -C -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then dnl Try adding -fsource option if it is useful. rm -f conftest.class rm -f conftestfail.class if { echo "$as_me:__oline__: gcj -C -fsource=$source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD gcj -C -fsource="$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \ && { echo "$as_me:__oline__: gcj -C -d . conftestfail.java" >&AS_MESSAGE_LOG_FD gcj -C -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftestfail.class \ && ! { echo "$as_me:__oline__: gcj -C -fsource=$source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD gcj -C -fsource="$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1 }; then CONF_JAVAC="gcj -C -fsource=$source_version" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 else CONF_JAVAC="gcj -C" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 fi else dnl Try with -fsource and -ftarget options. rm -f conftest.class rm -f conftestfail.class if { echo "$as_me:__oline__: gcj -C -fsource=$source_version -ftarget=$target_version -d . conftest.java" >&AS_MESSAGE_LOG_FD gcj -C -fsource="$source_version" -ftarget="$target_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then CONF_JAVAC="gcj -C -fsource=$source_version -ftarget=$target_version" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 fi fi else dnl It's a version of gcj < 4.3. Ignore the version of conftest.class. dnl Now test whether it supports the desired target-version and dnl source-version. if test "$target_version" = 1.4 && test "$source_version" = 1.4; then rm -f conftest.class if { echo "$as_me:__oline__: gcj -C -d . conftest.java" >&AS_MESSAGE_LOG_FD gcj -C -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class; then CONF_JAVAC="gcj -C" HAVE_GCJ_C=1 HAVE_JAVACOMP=1 fi else if test "$target_version" = 1.4 && test "$source_version" = 1.3; then dnl Try gcj and "gcj -fno-assert". But add -fno-assert only if dnl it works (not gcj < 3.3). rm -f conftest.class if { echo "$as_me:__oline__: gcj -C -fno-assert -d . conftest.java" >&AS_MESSAGE_LOG_FD gcj -C -fno-assert -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class; then CONF_JAVAC="gcj -C -fno-assert" HAVE_GCJ_C=1 HAVE_JAVACOMP=1 else rm -f conftest.class if { echo "$as_me:__oline__: gcj -C -d . conftest.java" >&AS_MESSAGE_LOG_FD gcj -C -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class; then CONF_JAVAC="gcj -C" HAVE_GCJ_C=1 HAVE_JAVACOMP=1 fi fi fi fi fi fi fi fi if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_JAVAC_IN_PATH"; then dnl Test whether javac is usable. if { javac -version >/dev/null 2>/dev/null || test $? -le 2; } \ && ( 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 dnl OK, javac works. dnl The javac option '-source 1.5' has the same meaning as '-source 1.6', dnl but since Java 9 supports only the latter, prefer the latter if a dnl target_version >= 1.6 is requested. if test "$source_version" = 1.5; then case "$target_version" in 1.1 | 1.2 | 1.3 | 1.4 | 1.5) ;; *) source_version='1.6' ;; esac fi dnl Now test whether it supports the desired target-version and dnl source-version. rm -f conftest.class if { echo "$as_me:__oline__: javac -d . conftest.java" >&AS_MESSAGE_LOG_FD javac -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then dnl Try adding -source option if it is useful. rm -f conftest.class rm -f conftestfail.class if { echo "$as_me:__oline__: javac -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD javac -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \ && { echo "$as_me:__oline__: javac -d . conftestfail.java" >&AS_MESSAGE_LOG_FD javac -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftestfail.class \ && ! { echo "$as_me:__oline__: javac -source $source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD javac -source "$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1 }; then CONF_JAVAC="javac -source $source_version" HAVE_JAVAC=1 HAVE_JAVACOMP=1 else CONF_JAVAC="javac" HAVE_JAVAC=1 HAVE_JAVACOMP=1 fi else dnl Try with -target option alone. (Sun javac 1.3.1 has the -target dnl option but no -source option.) rm -f conftest.class if { echo "$as_me:__oline__: javac -target $target_version -d . conftest.java" >&AS_MESSAGE_LOG_FD javac -target "$target_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then dnl Try adding -source option if it is useful. rm -f conftest.class rm -f conftestfail.class if { echo "$as_me:__oline__: javac -target $target_version -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD javac -target "$target_version" -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD \ && { echo "$as_me:__oline__: javac -target $target_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD javac -target "$target_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftestfail.class \ && ! { echo "$as_me:__oline__: javac -target $target_version -source $source_version -d . conftestfail.java" >&AS_MESSAGE_LOG_FD javac -target "$target_version" -source "$source_version" -d . conftestfail.java >&AS_MESSAGE_LOG_FD 2>&1 }; then CONF_JAVAC="javac -target $target_version -source $source_version" HAVE_JAVAC=1 HAVE_JAVACOMP=1 else CONF_JAVAC="javac -target $target_version" HAVE_JAVAC=1 HAVE_JAVACOMP=1 fi else dnl Maybe this -target option requires a -source option? Try with dnl -target and -source options. (Supported by Sun javac 1.4 and dnl higher.) rm -f conftest.class if { echo "$as_me:__oline__: javac -target $target_version -source $source_version -d . conftest.java" >&AS_MESSAGE_LOG_FD javac -target "$target_version" -source "$source_version" -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 } \ && test -f conftest.class \ && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&AS_MESSAGE_LOG_FD; then CONF_JAVAC="javac -target $target_version -source $source_version" HAVE_JAVAC=1 HAVE_JAVACOMP=1 fi fi fi fi fi if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_JIKES_IN_PATH"; then dnl Test whether jikes is usable. if { jikes >/dev/null 2>/dev/null || test $? = 1; } \ && ( # See if the existing CLASSPATH is sufficient to make jikes work. unset JAVA_HOME jikes conftestlib.java >&AS_MESSAGE_LOG_FD 2>&1 error=$? rm -f conftestlib.class exit $error ); then dnl OK, jikes works. dnl Now test whether it supports the desired target-version and dnl source-version. if test "$source_version" = 1.3; then CONF_JAVAC="jikes" HAVE_JIKES=1 HAVE_JAVACOMP=1 fi fi fi fi rm -f conftest*.java conftest*.class if test -n "$HAVE_JAVACOMP"; then ac_result="$CONF_JAVAC" else ac_result="no" fi AC_MSG_RESULT([$ac_result]) AC_SUBST([CONF_JAVAC]) AC_SUBST([CLASSPATH]) AC_SUBST([CLASSPATH_SEPARATOR]) AC_SUBST([HAVE_JAVAC_ENVVAR]) AC_SUBST([HAVE_GCJ_C]) AC_SUBST([HAVE_JAVAC]) AC_SUBST([HAVE_JIKES]) ]) # Simulates gt_JAVACOMP when no Java support is desired. AC_DEFUN([gt_JAVACOMP_DISABLED], [ CONF_JAVAC= HAVE_JAVAC_ENVVAR= HAVE_GCJ_C= HAVE_JAVAC= HAVE_JIKES= AC_SUBST([CONF_JAVAC]) AC_SUBST([HAVE_JAVAC_ENVVAR]) AC_SUBST([HAVE_GCJ_C]) AC_SUBST([HAVE_JAVAC]) AC_SUBST([HAVE_JIKES]) ])