A build of GNU Bison with Gnulib HEAD on macOS 13 fails:

After configure has found

  checking for Java compiler... javac -Xlint:-options -source 1.7 -target 1.7

"make check" fails like this:

  ...
    GEN      examples/java/calc/Calc.java
    GEN      examples/java/calc/Calc.class
  error: Source option 7 is no longer supported. Use 8 or later.
  error: Target option 7 is no longer supported. Use 8 or later.
  make[3]: *** [examples/java/calc/Calc.class] Error 2

Recent JDKs cannot compile source code meant for Java 7 and older any more.
This is because Java 7 is unsupported for more than two years already:
https://en.wikipedia.org/wiki/Java_version_history#Release_table

One possible fix is to change bison/configure.ac, replacing
  gt_JAVACOMP([1.7], [1.7])
with
  gt_JAVACOMP([1.8], [1.8])

But Bison is not the only package that uses gt_JAVACOMP. In GNU gettext,
I made this change already a year ago. But it's tiresome to make the same
change in all packages; it's better to make it centrally in Gnulib.
Done through the following patch:


2025-07-13  Bruno Haible  <br...@clisp.org>

        javacomp-script, javacomp: Remove support for javac versions < 1.8.
        * m4/javacomp.m4 (gt_JAVACOMP): State that the minimum source_version
        and the minimum target_version are 1.8. Map smaller values to 1.8.
        Complain if the java version is < 1.8. Use 1.8 as default, instead of
        1.6.
        * lib/javacomp.h (compile_java_class): State that the minimum
        source_version and the minimum target_version are 1.8.
        * lib/javacomp.c (default_target_version): Complain if the java version
        is < 1.8. Use 1.8 as default, instead of 1.6.
        (SOURCE_VERSION_BOUND, source_version_index): Adjust to the new minimum
        source_version = 1.8.
        (TARGET_VERSION_BOUND, target_version_index): Adjust to the new minimum
        target_version = 1.8.
        (get_compiler_version): Update comment.
        (is_envjavac_usable, is_javac_usable): Update.
        (compile_java_class): Map source_version < 1.8 to 1.8. Map
        target_version < 1.8 to 1.8.

diff --git a/lib/javacomp.c b/lib/javacomp.c
index 33ec8eb63e..936cf79810 100644
--- a/lib/javacomp.c
+++ b/lib/javacomp.c
@@ -94,18 +94,18 @@ default_target_version (void)
       /* Determine the version from the found JVM.  */
       java_version_cache = javaexec_version ();
       if (java_version_cache == NULL)
-        java_version_cache = "1.6";
+        java_version_cache = "1.8";
       else if (java_version_cache[0] == '1'
                && java_version_cache[1] == '.'
-               && java_version_cache[2] >= '1' && java_version_cache[2] <= '5'
+               && java_version_cache[2] >= '1' && java_version_cache[2] <= '7'
                && java_version_cache[3] == '\0')
         {
           error (0, 0, _("The java program is too old. Cannot compile Java 
code for this old version any more."));
-          java_version_cache = "1.6";
+          java_version_cache = "1.8";
         }
       else if ((java_version_cache[0] == '1'
                 && java_version_cache[1] == '.'
-                && java_version_cache[2] >= '6' && java_version_cache[2] <= '8'
+                && java_version_cache[2] == '8'
                 && java_version_cache[3] == '\0')
                || (java_version_cache[0] == '9'
                    && java_version_cache[1] == '\0')
@@ -120,7 +120,7 @@ default_target_version (void)
            determined from the JVM, we do that.  */
         ;
       else
-        java_version_cache = "1.6";
+        java_version_cache = "1.8";
     }
   return java_version_cache;
 }
@@ -128,22 +128,21 @@ default_target_version (void)
 /* ======================= Source version dependent ======================= */
 
 /* Convert a source version to an index.  */
-#define SOURCE_VERSION_BOUND 94 /* exclusive upper bound */
+#define SOURCE_VERSION_BOUND 92 /* exclusive upper bound */
 static unsigned int
 source_version_index (const char *source_version)
 {
   if (source_version[0] == '1' && source_version[1] == '.')
     {
-      if ((source_version[2] >= '6' && source_version[2] <= '8')
-          && source_version[3] == '\0')
-        return source_version[2] - '6';
+      if (source_version[2] == '8' && source_version[3] == '\0')
+        return 0;
     }
   else if (source_version[0] == '9' && source_version[1] == '\0')
-    return 3;
+    return 1;
   else if ((source_version[0] >= '1' && source_version[0] <= '9')
            && (source_version[1] >= '0' && source_version[1] <= '9')
            && source_version[2] == '\0')
-    return (source_version[0] - '1') * 10 + source_version[1] - '0' + 4;
+    return (source_version[0] - '1') * 10 + source_version[1] - '0' + 2;
   error (EXIT_FAILURE, 0, _("invalid source_version argument to 
compile_java_class"));
   return 0;
 }
@@ -151,20 +150,19 @@ source_version_index (const char *source_version)
 /* ======================= Target version dependent ======================= */
 
 /* Convert a target version to an index.  */
-#define TARGET_VERSION_BOUND 94 /* exclusive upper bound */
+#define TARGET_VERSION_BOUND 92 /* exclusive upper bound */
 static unsigned int
 target_version_index (const char *target_version)
 {
   if (target_version[0] == '1' && target_version[1] == '.'
-      && (target_version[2] >= '6' && target_version[2] <= '8')
-      && target_version[3] == '\0')
-    return target_version[2] - '6';
+      && target_version[2] == '8' && target_version[3] == '\0')
+    return 0;
   else if (target_version[0] == '9' && target_version[1] == '\0')
-    return 3;
+    return 1;
   else if ((target_version[0] >= '1' && target_version[0] <= '9')
            && (target_version[1] >= '0' && target_version[1] <= '9')
            && target_version[2] == '\0')
-    return (target_version[0] - '1') * 10 + target_version[1] - '0' + 4;
+    return (target_version[0] - '1') * 10 + target_version[1] - '0' + 2;
   error (EXIT_FAILURE, 0, _("invalid target_version argument to 
compile_java_class"));
   return 0;
 }
@@ -414,7 +412,7 @@ get_compiler_version (const char *progname,
     version_end++;
   *version_end = '\0';
 
-  /* Map 1.6.0_85 to 6, 1.8.0_151 to 8.  Map 9.0.4 to 9, 10.0.2 to 10, etc.  */
+  /* Map 1.8.0_151 to 8.  Map 9.0.4 to 9, 10.0.2 to 10, etc.  */
   if (version_start[0] == '1' && version_start[1] == '.')
     version_start += 2;
   version_end = strchr (version_start, '.');
@@ -525,8 +523,8 @@ is_envjavac_usable (const char *javac,
     {
       /* Canonicalize source_version and target_version, for easier
          arithmetic.  */
-      int try_source_version = 6 + source_version_index (source_version);
-      int try_target_version = 6 + target_version_index (target_version);
+      int try_source_version = 8 + source_version_index (source_version);
+      int try_target_version = 8 + target_version_index (target_version);
       /* Sanity check.  */
       if (try_source_version <= try_target_version)
         {
@@ -801,8 +799,8 @@ is_javac_usable (const char *source_version, const char 
*target_version,
     {
       /* Canonicalize source_version and target_version, for easier
          arithmetic.  */
-      int try_source_version = 6 + source_version_index (source_version);
-      int try_target_version = 6 + target_version_index (target_version);
+      int try_source_version = 8 + source_version_index (source_version);
+      int try_target_version = 8 + target_version_index (target_version);
       /* Sanity check.  */
       if (try_source_version <= try_target_version)
         {
@@ -1013,18 +1011,18 @@ compile_java_class (const char * const *java_sources,
   bool err = false;
   char *old_JAVA_HOME;
 
-  /* Map source_version 1.1 ... 1.5 to 1.6.  */
+  /* Map source_version 1.1 ... 1.7 to 1.8.  */
   if (source_version[0] == '1' && source_version[1] == '.'
-      && (source_version[2] >= '1' && source_version[2] <= '5')
+      && (source_version[2] >= '1' && source_version[2] <= '7')
       && source_version[3] == '\0')
-    source_version = "1.6";
+    source_version = "1.8";
 
-  /* Map target_version 1.1 ... 1.5 to 1.6.  */
+  /* Map target_version 1.1 ... 1.7 to 1.8.  */
   if (target_version != NULL
       && target_version[0] == '1' && target_version[1] == '.'
-      && (target_version[2] >= '1' && target_version[2] <= '5')
+      && (target_version[2] >= '1' && target_version[2] <= '7')
       && target_version[3] == '\0')
-    target_version = "1.6";
+    target_version = "1.8";
 
   {
     const char *javac = getenv ("JAVAC");
diff --git a/lib/javacomp.h b/lib/javacomp.h
index b93893bed2..acb842ca17 100644
--- a/lib/javacomp.h
+++ b/lib/javacomp.h
@@ -28,28 +28,27 @@ extern "C" {
    classpaths is a list of pathnames to be prepended to the CLASSPATH.
 
    source_version can be:    support for
-             1.6             assert keyword (1.4), generic classes and methods 
(1.5)
-             1.7             switch(string)
              1.8             lambdas
              9               private interface methods
             10               type inference for local variables
             11               'var' in parameters of lambda expressions
             ...
-   If source-version 1.3 or 1.4 or 1.5 is requested, it gets mapped to 1.6, for
-   backward compatibility. (Currently the minimum Java and javac version we 
need
-   to support is Java 1.6, since that's the default Java version on Solaris 
10.)
+   If source-version 1.3 or 1.4 or 1.5 or 1.6 or 1.7 is requested, it gets
+   mapped to 1.8, for backward compatibility. (Currently the minimum Java and
+   javac version we need to support is Java 1.8, since older versions are
+   out-of-support, see
+   <https://en.wikipedia.org/wiki/Java_version_history#Release_table>.)
 
    target_version can be:  classfile version:
-             1.6                 50.0
-             1.7                 51.0
              1.8                 52.0
              9                   53.0
             10                   54.0
             11                   55.0
             ...                  ...
-   If a target-version below 1.6 is requested, it gets mapped to 1.6, for
-   backward compatibility. (Currently the minimum Java and javac version we 
need
-   to support is Java 1.6, since that's the default Java version on Solaris 
10.)
+   If a target-version below 1.8 is requested, it gets mapped to 1.8, for
+   backward compatibility. (Currently the minimum Java and javac version we
+   need to support is Java 1.8, since older versions are out-of-support, see
+   <https://en.wikipedia.org/wiki/Java_version_history#Release_table>.)
    target_version can also be given as NULL. In this case, the required
    target_version is determined from the found JVM (see javaversion.h).
    Specifying target_version is useful when building a library (.jar) that is
diff --git a/m4/javacomp.m4 b/m4/javacomp.m4
index 2e96c56dcd..8148b45306 100644
--- a/m4/javacomp.m4
+++ b/m4/javacomp.m4
@@ -1,5 +1,5 @@
 # javacomp.m4
-# serial 26
+# serial 27
 dnl Copyright (C) 2001-2003, 2006-2007, 2009-2025 Free Software Foundation,
 dnl Inc.
 dnl This file is free software; the Free Software Foundation
@@ -14,21 +14,19 @@
 # target-version format.
 #
 # source-version can be:    support for
-#           1.6             assert keyword (1.4), generic classes and methods 
(1.5)
-#           1.7             switch(string)
 #           1.8             lambdas
 #           9               private interface methods
 #          10               type inference for local variables
 #          11               'var' in parameters of lambda expressions
 #          ...
 # (For reference, see <https://en.wikipedia.org/wiki/Java_version_history>.)
-# If source-version 1.3 or 1.4 or 1.5 is requested, it gets mapped to 1.6, for
-# backward compatibility. (Currently the minimum Java and javac version we need
-# to support is Java 1.6, since that's the default Java version on Solaris 10.)
+# If source-version 1.3 or 1.4 or 1.5 or 1.6 or 1.7 is requested, it gets 
mapped
+# to 1.8, for backward compatibility. (Currently the minimum Java and javac
+# version we need to support is Java 1.8, since older versions are
+# out-of-support, see
+# <https://en.wikipedia.org/wiki/Java_version_history#Release_table>.)
 #
 # target-version can be:  classfile version:
-#           1.6                 50.0
-#           1.7                 51.0
 #           1.8                 52.0
 #           9                   53.0
 #          10                   54.0
@@ -37,15 +35,14 @@
 # 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".
-# If a target-version below 1.6 is requested, it gets mapped to 1.6, for
+# If a target-version below 1.8 is requested, it gets mapped to 1.8, for
 # backward compatibility. (Currently the minimum Java and javac version we need
-# to support is Java 1.6, since that's the default Java version on Solaris 10.)
+# to support is Java 1.8, since older versions are out-of-support, see
+# <https://en.wikipedia.org/wiki/Java_version_history#Release_table>.)
 #
 # 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.6         JDK/JRE 6
-#           1.7         JDK/JRE 7
 #           1.8         JDK/JRE 8
 #           9           JDK/JRE 9
 #          10           JDK/JRE 10
@@ -85,7 +82,7 @@ AC_DEFUN([gt_JAVACOMP]
     AC_MSG_ERROR([missing source-version argument to gt_@&t@JAVACOMP])
   }
   case "$source_version" in
-    1.1 | 1.2 | 1.3 | 1.4 | 1.5) source_version='1.6' ;;
+    1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7) source_version='1.8' ;;
   esac
   m4_if([$2], [],
     [if test -n "$HAVE_JAVAEXEC"; then
@@ -123,11 +120,11 @@ AC_DEFUN([gt_JAVACOMP]
            java_exec_version=1.1 ;;
        esac
        case "$java_exec_version" in
-         1.1 | 1.2 | 1.3 | 1.4 | 1.5)
+         1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7)
            AC_MSG_WARN([$CONF_JAVA is too old, cannot compile Java code for 
this old version any more])
-           target_version=1.6 ;;
+           target_version=1.8 ;;
 changequote(,)dnl
-         1.6 | 1.7 | 1.8 | 9 | [1-9][0-9])
+         1.8 | 9 | [1-9][0-9])
 changequote([,])dnl
            dnl Here we could choose any target_version between $source_version
            dnl and the $java_exec_version. (If it is too small, it will be
@@ -135,26 +132,26 @@ AC_DEFUN([gt_JAVACOMP]
            dnl it is determined from the JVM, we do that:
            target_version="$java_exec_version" ;;
          *) AC_MSG_WARN([unknown target-version $target_version, please update 
gt_@&t@JAVACOMP macro])
-            target_version=1.6 ;;
+            target_version=1.8 ;;
        esac
      else
-       target_version="1.6"
+       target_version="1.8"
      fi
     ],
     [target_version=$2
      case "$target_version" in
-       1.1 | 1.2 | 1.3 | 1.4 | 1.5) target_version='1.6' ;;
+       1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7) target_version='1.8' ;;
      esac
     ])
   case "$source_version" in
 changequote(,)dnl
-    1.6 | 1.7 | 1.8 | 9 | [1-9][0-9]) ;;
+    1.8 | 9 | [1-9][0-9]) ;;
 changequote([,])dnl
     *) AC_MSG_ERROR([invalid source-version argument to gt_@&t@JAVACOMP: 
$source_version]) ;;
   esac
   case "$target_version" in
 changequote(,)dnl
-    1.6 | 1.7 | 1.8 | 9 | [1-9][0-9]) ;;
+    1.8 | 9 | [1-9][0-9]) ;;
 changequote([,])dnl
     *) AC_MSG_ERROR([invalid target-version argument to gt_@&t@JAVACOMP: 
$target_version]) ;;
   esac
@@ -177,19 +174,6 @@ AC_DEFUN([gt_JAVACOMP]
   dnl
   dnl The support of Sun/Oracle javac for target-version and source-version:
   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
@@ -217,8 +201,6 @@ AC_DEFUN([gt_JAVACOMP]
   dnl     javac     classfile         valid -source and   obsolete -source
   dnl     version   default version   -target values      and -target values
   dnl     -------   ---------------   -----------------   ------------------
-  dnl     1.6       50.0              1.2 .. 1.6
-  dnl     1.7       51.0              1.2 .. 1.7
   dnl     1.8       52.0              1.3 .. 1.8          1.3 .. 1.5
   dnl     9         53.0              1.6 .. 9            1.6
   dnl     10        54.0              1.6 .. 10           1.6
@@ -318,7 +300,7 @@ AC_DEFUN([gt_JAVACOMP]
           compiler_version=`echo "$compiler_version" | sed -e 
's/^[^0-9]*\([0-9][0-9.]*\).*/\1/'`
 changequote([,])dnl
           case "$compiler_version" in
-            1.*) dnl Map 1.6.0_85 to 6, 1.8.0_151 to 8.
+            1.*) dnl Map 1.8.0_151 to 8.
                  compiler_version=`echo "$compiler_version" | sed -e 
's/^1\.//' -e 's/\..*//'`
                  ;;
             *) dnl Map 9.0.4 to 9, 10.0.2 to 10, etc.
@@ -340,11 +322,11 @@ AC_DEFUN([gt_JAVACOMP]
               fi
               try_source_version=`expr $try_source_version + 1`
               expr $try_source_version '<=' $compiler_version >/dev/null || 
break
-              source_option=' -source '`case "$try_source_version" in 6|7|8) 
echo 1. ;; esac`"$try_source_version"
+              source_option=' -source '`case "$try_source_version" in 8) echo 
1. ;; esac`"$try_source_version"
               if expr $try_target_version = $compiler_target_version 
>/dev/null; then
                 target_option=
               else
-                target_option=' -target '`case "$try_target_version" in 6|7|8) 
echo 1. ;; esac`"$try_target_version"
+                target_option=' -target '`case "$try_target_version" in 8) 
echo 1. ;; esac`"$try_target_version"
               fi
               if { echo "$as_me:__oline__: 
$JAVAC$nowarn_option$source_option$target_option -d . conftest.java" 
>&AS_MESSAGE_LOG_FD
                    $JAVAC$nowarn_option$source_option$target_option -d . 
conftest.java >&AS_MESSAGE_LOG_FD 2>&1
@@ -397,13 +379,13 @@ AC_DEFUN([gt_JAVACOMP]
           dnl Also, javac may point to a shell script that already includes a
           dnl '-source' option.
           dnl Therefore, pass a '-source' option always.
-          source_option=' -source '`case "$source_version" in 6|7|8) echo 1. 
;; esac`"$source_version"
+          source_option=' -source '`case "$source_version" in 8) echo 1. ;; 
esac`"$source_version"
           dnl And pass a '-target' option as well, if needed.
           dnl (All supported javac versions support both, see the table above.)
           if expr $target_version = $compiler_target_version >/dev/null; then
             target_option=
           else
-            target_option=' -target '`case "$target_version" in 6|7|8) echo 1. 
;; esac`"$target_version"
+            target_option=' -target '`case "$target_version" in 8) echo 1. ;; 
esac`"$target_version"
           fi
           if { echo "$as_me:__oline__: 
javac$nowarn_option$source_option$target_option -d . conftest.java" 
>&AS_MESSAGE_LOG_FD
                javac$nowarn_option$source_option$target_option -d . 
conftest.java >&AS_MESSAGE_LOG_FD 2>&1
@@ -423,7 +405,7 @@ AC_DEFUN([gt_JAVACOMP]
             compiler_version=`echo "$compiler_version" | sed -e 
's/^[^0-9]*\([0-9][0-9.]*\).*/\1/'`
 changequote([,])dnl
             case "$compiler_version" in
-              1.*) dnl Map 1.6.0_85 to 6, 1.8.0_151 to 8.
+              1.*) dnl Map 1.8.0_151 to 8.
                    compiler_version=`echo "$compiler_version" | sed -e 
's/^1\.//' -e 's/\..*//'`
                    ;;
               *) dnl Map 9.0.4 to 9, 10.0.2 to 10, etc.
@@ -445,11 +427,11 @@ AC_DEFUN([gt_JAVACOMP]
                 fi
                 try_source_version=`expr $try_source_version + 1`
                 expr $try_source_version '<=' $compiler_version >/dev/null || 
break
-                source_option=' -source '`case "$try_source_version" in 6|7|8) 
echo 1. ;; esac`"$try_source_version"
+                source_option=' -source '`case "$try_source_version" in 8) 
echo 1. ;; esac`"$try_source_version"
                 if expr $try_target_version = $compiler_target_version 
>/dev/null; then
                   target_option=
                 else
-                  target_option=' -target '`case "$try_target_version" in 
6|7|8) echo 1. ;; esac`"$try_target_version"
+                  target_option=' -target '`case "$try_target_version" in 8) 
echo 1. ;; esac`"$try_target_version"
                 fi
                 if { echo "$as_me:__oline__: 
javac$nowarn_option$source_option$target_option -d . conftest.java" 
>&AS_MESSAGE_LOG_FD
                      javac$nowarn_option$source_option$target_option -d . 
conftest.java >&AS_MESSAGE_LOG_FD 2>&1




Reply via email to