From e21309c29b9187b97d0c82b7364192c9cf050103 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Mon, 12 Jun 2023 00:42:05 +0200 Subject: [PATCH] javacomp-script, javacomp: Silence javac warnings regarding [options]. * m4/javacomp.m4 (gt_JAVACOMP): Use option '-Xlint:-options' by default and omit it only when it does not work. * lib/javacomp.c (compile_using_javac): Add nowarn_option parameter. (is_envjavac_usable): Add nowarn_option_out parameter. Use option '-Xlint:-options' by default and omit it only when it does not work. (is_javac_usable): Likewise. (compile_java_class): Store the nowarn_option returned from is_envjavac_usable and use it when invoking compile_using_envjavac. Store the nowarn_option returned from is_javac_usable and use it when invoking compile_using_javac. --- ChangeLog | 14 ++++++++ lib/javacomp.c | 90 ++++++++++++++++++++++++++++++++++++++++---------- m4/javacomp.m4 | 86 ++++++++++++++++++++++++++++++++--------------- 3 files changed, 147 insertions(+), 43 deletions(-) diff --git a/ChangeLog b/ChangeLog index b008ba17f6..573390dffb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2023-06-11 Bruno Haible + + javacomp-script, javacomp: Silence javac warnings regarding [options]. + * m4/javacomp.m4 (gt_JAVACOMP): Use option '-Xlint:-options' by default + and omit it only when it does not work. + * lib/javacomp.c (compile_using_javac): Add nowarn_option parameter. + (is_envjavac_usable): Add nowarn_option_out parameter. Use option + '-Xlint:-options' by default and omit it only when it does not work. + (is_javac_usable): Likewise. + (compile_java_class): Store the nowarn_option returned from + is_envjavac_usable and use it when invoking compile_using_envjavac. + Store the nowarn_option returned from is_javac_usable and use it when + invoking compile_using_javac. + 2023-06-10 Bruno Haible javacomp-script, javacomp: Add support for javac versions > 11. diff --git a/lib/javacomp.c b/lib/javacomp.c index d23820537f..b4bf298d29 100644 --- a/lib/javacomp.c +++ b/lib/javacomp.c @@ -258,6 +258,7 @@ compile_using_envjavac (const char *javac, static bool compile_using_javac (const char * const *java_sources, unsigned int java_sources_count, + const char *nowarn_option, bool source_option, const char *source_version, bool target_option, const char *target_version, const char *directory, @@ -272,12 +273,15 @@ compile_using_javac (const char * const *java_sources, unsigned int i; argc = - 1 + (source_option ? 2 : 0) + (target_option ? 2 : 0) + (optimize ? 1 : 0) - + (debug ? 1 : 0) + (directory != NULL ? 2 : 0) + java_sources_count; + 1 + (nowarn_option != NULL ? 1 : 0) + (source_option ? 2 : 0) + + (target_option ? 2 : 0) + (optimize ? 1 : 0) + (debug ? 1 : 0) + + (directory != NULL ? 2 : 0) + java_sources_count; argv = (const char **) xmalloca ((argc + 1) * sizeof (const char *)); argp = argv; *argp++ = "javac"; + if (nowarn_option != NULL) + *argp++ = nowarn_option; if (source_option) { *argp++ = "-source"; @@ -495,12 +499,13 @@ get_classfile_version (const char *compiled_file_name) } /* Test whether $JAVAC can be used, and whether it needs a -source and/or - -target option. + -target option, as well as an option to inhibit warnings. Return a failure indicator (true upon error). */ static bool is_envjavac_usable (const char *javac, const char *source_version, const char *target_version, bool *usablep, + char nowarn_option_out[17], char source_option_out[30], char target_option_out[30]) { /* The cache depends on the source_version and target_version. */ @@ -508,6 +513,7 @@ is_envjavac_usable (const char *javac, { /*bool*/ unsigned int tested : 1; /*bool*/ unsigned int usable : 1; + /*bool*/ unsigned int nowarn_option : 1; unsigned int source_option : 7; unsigned int target_option : 7; }; @@ -530,6 +536,7 @@ is_envjavac_usable (const char *javac, char *conftest_file_name; char *compiled_file_name; const char *java_sources[1]; + const char *nowarn_option; struct stat statbuf; tmpdir = create_temp_dir ("java", NULL, false); @@ -549,11 +556,22 @@ is_envjavac_usable (const char *javac, xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL); register_temp_file (tmpdir, compiled_file_name); + /* See the discussion in javacomp.m4. */ + nowarn_option = " -Xlint:-options"; + char *javac_nowarn = xasprintf ("%s%s", javac, nowarn_option); + assume (javac_nowarn != NULL); + java_sources[0] = conftest_file_name; - if (!compile_using_envjavac (javac, - java_sources, 1, tmpdir->dir_name, - false, false, false, true) - && stat (compiled_file_name, &statbuf) >= 0) + if ((!compile_using_envjavac (javac_nowarn, + java_sources, 1, tmpdir->dir_name, + false, false, false, true) + && stat (compiled_file_name, &statbuf) >= 0) + || (nowarn_option = "", + unlink (compiled_file_name), + (!compile_using_envjavac (javac, + java_sources, 1, tmpdir->dir_name, + false, false, false, true) + && stat (compiled_file_name, &statbuf) >= 0))) { /* $JAVAC compiled conftest.java successfully. */ int compiler_cfversion = @@ -583,7 +601,8 @@ is_envjavac_usable (const char *javac, try_target_version); char *javac_source_target = - xasprintf ("%s%s%s", javac, source_option, target_option); + xasprintf ("%s%s%s%s", javac, nowarn_option, + source_option, target_option); assume (javac_source_target != NULL); unlink (compiled_file_name); @@ -598,6 +617,7 @@ is_envjavac_usable (const char *javac, and target_version. Perfect. */ free (javac_source_target); + resultp->nowarn_option = (nowarn_option[0] != '\0'); resultp->source_option = try_source_version; resultp->target_option = (try_target_version == compiler_target_version ? 0 : @@ -670,7 +690,7 @@ is_envjavac_usable (const char *javac, try_target_version); javac_source_target = - xasprintf ("%s%s%s", javac, + xasprintf ("%s%s%s%s", javac, nowarn_option, source_option, target_option); assume (javac_source_target != NULL); @@ -689,6 +709,7 @@ is_envjavac_usable (const char *javac, nothing. */ free (javac_source_target); + resultp->nowarn_option = (nowarn_option[0] != '\0'); resultp->source_option = try_source_version; resultp->target_option = (try_target_version == compiler_target_version ? 0 : @@ -705,6 +726,7 @@ is_envjavac_usable (const char *javac, cleanup_temp_dir (tmpdir); + free (javac_nowarn); free (compiled_file_name); free (conftest_file_name); } @@ -713,6 +735,10 @@ is_envjavac_usable (const char *javac, } *usablep = resultp->usable; + if (resultp->nowarn_option) + strcpy (nowarn_option_out, " -Xlint:-options"); + else + nowarn_option_out[0] = '\0'; sprintf (source_option_out, " -source %s%d", resultp->source_option <= 8 ? "1." : "", resultp->source_option); @@ -750,11 +776,12 @@ is_javac_present (void) } /* Test whether javac can be used and whether it needs a -source and/or - -target option. + -target option, as well as an option to inhibit warnings. Return a failure indicator (true upon error). */ static bool is_javac_usable (const char *source_version, const char *target_version, bool *usablep, + char nowarn_option_out[17], char source_option_out[20], char target_option_out[20]) { /* The cache depends on the source_version and target_version. */ @@ -762,6 +789,7 @@ is_javac_usable (const char *source_version, const char *target_version, { /*bool*/ unsigned int tested : 1; /*bool*/ unsigned int usable : 1; + /*bool*/ unsigned int nowarn_option : 1; unsigned int source_option : 7; unsigned int target_option : 7; }; @@ -784,6 +812,7 @@ is_javac_usable (const char *source_version, const char *target_version, char *conftest_file_name; char *compiled_file_name; const char *java_sources[1]; + const char *nowarn_option; struct stat statbuf; tmpdir = create_temp_dir ("java", NULL, false); @@ -803,13 +832,26 @@ is_javac_usable (const char *source_version, const char *target_version, xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL); register_temp_file (tmpdir, compiled_file_name); + /* See the discussion in javacomp.m4. */ + nowarn_option = "-Xlint:-options"; + java_sources[0] = conftest_file_name; - if (!compile_using_javac (java_sources, 1, - false, source_version, - false, target_version, - tmpdir->dir_name, - false, false, false, true) - && stat (compiled_file_name, &statbuf) >= 0) + if ((!compile_using_javac (java_sources, 1, + nowarn_option, + false, source_version, + false, target_version, + tmpdir->dir_name, + false, false, false, true) + && stat (compiled_file_name, &statbuf) >= 0) + || (nowarn_option = NULL, + unlink (compiled_file_name), + (!compile_using_javac (java_sources, 1, + nowarn_option, + false, source_version, + false, target_version, + tmpdir->dir_name, + false, false, false, true) + && stat (compiled_file_name, &statbuf) >= 0))) { /* javac compiled conftest.java successfully. */ int compiler_cfversion = @@ -840,6 +882,7 @@ is_javac_usable (const char *source_version, const char *target_version, java_sources[0] = conftest_file_name; if (!compile_using_javac (java_sources, 1, + nowarn_option, true, source_option, try_target_version != compiler_target_version, @@ -850,6 +893,7 @@ is_javac_usable (const char *source_version, const char *target_version, { /* The compiler directly supports the desired source_version and target_version. Perfect. */ + resultp->nowarn_option = (nowarn_option != NULL); resultp->source_option = try_source_version; resultp->target_option = (try_target_version == compiler_target_version ? 0 : @@ -902,6 +946,7 @@ is_javac_usable (const char *source_version, const char *target_version, java_sources[0] = conftest_file_name; if (!compile_using_javac (java_sources, 1, + nowarn_option, true, source_option, try_target_version != compiler_target_version, @@ -913,6 +958,7 @@ is_javac_usable (const char *source_version, const char *target_version, /* The compiler supports the try_source_version and try_target_version. It's better than nothing. */ + resultp->nowarn_option = (nowarn_option != NULL); resultp->source_option = try_source_version; resultp->target_option = (try_target_version == compiler_target_version ? 0 : @@ -935,6 +981,10 @@ is_javac_usable (const char *source_version, const char *target_version, } *usablep = resultp->usable; + if (resultp->nowarn_option) + strcpy (nowarn_option_out, "-Xlint:-options"); + else + nowarn_option_out[0] = '\0'; sprintf (source_option_out, "%s%d", resultp->source_option <= 8 ? "1." : "", resultp->source_option); @@ -982,6 +1032,7 @@ compile_java_class (const char * const *java_sources, if (javac != NULL && javac[0] != '\0') { bool usable = false; + char nowarn_option[17]; char source_option[30]; char target_option[30]; @@ -991,6 +1042,7 @@ compile_java_class (const char * const *java_sources, if (is_envjavac_usable (javac, source_version, target_version, &usable, + nowarn_option, source_option, target_option)) { err = true; @@ -1007,7 +1059,8 @@ compile_java_class (const char * const *java_sources, set_classpath (classpaths, classpaths_count, false, verbose); javac_with_options = - xasprintf ("%s%s%s", javac, source_option, target_option); + xasprintf ("%s%s%s%s", javac, + nowarn_option, source_option, target_option); assume (javac_with_options != NULL); err = compile_using_envjavac (javac_with_options, @@ -1036,6 +1089,7 @@ compile_java_class (const char * const *java_sources, if (is_javac_present ()) { bool usable = false; + char nowarn_option[17]; char source_option[20]; char target_option[20]; @@ -1044,6 +1098,7 @@ compile_java_class (const char * const *java_sources, if (is_javac_usable (source_version, target_version, &usable, + nowarn_option, source_option, target_option)) { err = true; @@ -1063,6 +1118,7 @@ compile_java_class (const char * const *java_sources, verbose); err = compile_using_javac (java_sources, java_sources_count, + nowarn_option[0] != '\0' ? nowarn_option : NULL, true, source_option, target_option[0] != '\0', target_option, directory, optimize, debug, verbose, diff --git a/m4/javacomp.m4 b/m4/javacomp.m4 index 009c788cb6..240f804bae 100644 --- a/m4/javacomp.m4 +++ b/m4/javacomp.m4 @@ -1,4 +1,4 @@ -# javacomp.m4 serial 25 +# javacomp.m4 serial 26 dnl Copyright (C) 2001-2003, 2006-2007, 2009-2023 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation @@ -215,8 +215,8 @@ changequote([,])dnl dnl javac classfile valid -source and obsolete -source dnl version default version -target values and -target values dnl ------- --------------- ----------------- ------------------ - dnl 1.6 50.0 1.3 .. 1.6 - dnl 1.7 51.0 1.3 .. 1.7 + 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 @@ -233,7 +233,19 @@ changequote([,])dnl dnl dnl The -source option value must be <= the -target option value. dnl The minimal -source and -target option value produces an "is obsolete" - dnl warning. + dnl warning (in javac 1.8 or newer). Additionally, if the -source option + dnl value is not the maximal possible one, i.e. not redundant, it produces a + dnl "bootstrap class path not set in conjunction with -source ..." warning + dnl (in javac 1.7 or newer). + dnl + dnl To get rid of these warnings, two options are available: + dnl * -nowarn. This option is supported since javac 1.6 at least. But + dnl it is overkill, because it would also silence warnings about the + dnl code being compiled. + dnl * -Xlint:-options. This option is supported since javac 1.6 at least. + dnl In javac 1.6 it is an undocumented no-op. + dnl We use -Xlint:-options and omit it only if we find that the compiler + dnl does not support it (which is unlikely). dnl dnl Canonicalize source_version and target_version, for easier arithmetic. case "$source_version" in @@ -254,11 +266,22 @@ changequote([,])dnl dnl options). if test -n "$JAVAC"; then dnl Test whether $JAVAC is usable. - 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 + dnl At the same time, determine which option to use to inhibit warnings; + dnl see the discussion above. + nowarn_option=' -Xlint:-options' + if { rm -f conftest.class \ + && { echo "$as_me:__oline__: $JAVAC$nowarn_option -d . conftest.java" >&AS_MESSAGE_LOG_FD + $JAVAC$nowarn_option -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 + } \ + && test -f conftest.class + } || { \ + nowarn_option= + rm -f conftest.class \ + && { echo "$as_me:__oline__: $JAVAC$nowarn_option -d . conftest.java" >&AS_MESSAGE_LOG_FD + $JAVAC$nowarn_option -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 + } \ + && test -f conftest.class + }; then compiler_cfversion=`func_classfile_version conftest.class` compiler_target_version=`expr $compiler_cfversion - 44` dnl It is hard to determine the compiler_source_version. This would @@ -275,13 +298,13 @@ changequote([,])dnl else target_option=' -target '`case "$target_version" in 6|7|8) echo 1. ;; esac`"$target_version" fi - if { echo "$as_me:__oline__: $JAVAC$source_option$target_option -d . conftest.java" >&AS_MESSAGE_LOG_FD - $JAVAC$source_option$target_option -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 + 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 } \ && test -f conftest.class; then dnl The compiler directly supports the desired source_version and dnl target_version. Perfect. - CONF_JAVAC="$JAVAC$source_option$target_option" + CONF_JAVAC="$JAVAC$nowarn_option$source_option$target_option" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 else @@ -321,13 +344,13 @@ changequote([,])dnl else target_option=' -target '`case "$try_target_version" in 6|7|8) echo 1. ;; esac`"$try_target_version" fi - if { echo "$as_me:__oline__: $JAVAC$source_option$target_option -d . conftest.java" >&AS_MESSAGE_LOG_FD - $JAVAC$source_option$target_option -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 + 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 } \ && test -f conftest.class; then dnl The compiler supports the try_source_version and dnl try_target_version. It's better than nothing. - CONF_JAVAC="$JAVAC$source_option$target_option" + CONF_JAVAC="$JAVAC$nowarn_option$source_option$target_option" HAVE_JAVAC_ENVVAR=1 HAVE_JAVACOMP=1 break @@ -347,11 +370,22 @@ changequote([,])dnl popdef([AC_MSG_CHECKING])dnl if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_JAVAC_IN_PATH"; then dnl Test whether javac is usable. - 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 + dnl At the same time, determine which option to use to inhibit warnings; + dnl see the discussion above. + nowarn_option=' -Xlint:-options' + if { rm -f conftest.class \ + && { echo "$as_me:__oline__: javac$nowarn_option -d . conftest.java" >&AS_MESSAGE_LOG_FD + javac$nowarn_option -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 + } \ + && test -f conftest.class + } || { \ + nowarn_option= + rm -f conftest.class \ + && { echo "$as_me:__oline__: javac$nowarn_option -d . conftest.java" >&AS_MESSAGE_LOG_FD + javac$nowarn_option -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 + } \ + && test -f conftest.class + }; then compiler_cfversion=`func_classfile_version conftest.class` compiler_target_version=`expr $compiler_cfversion - 44` dnl It is hard to determine the compiler_source_version. This would @@ -369,13 +403,13 @@ changequote([,])dnl else target_option=' -target '`case "$target_version" in 6|7|8) echo 1. ;; esac`"$target_version" fi - if { echo "$as_me:__oline__: javac$source_option$target_option -d . conftest.java" >&AS_MESSAGE_LOG_FD - javac$source_option$target_option -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 + 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 } \ && test -f conftest.class; then dnl The compiler directly supports the desired source_version and dnl target_version. Perfect. - CONF_JAVAC="javac$source_option$target_option" + CONF_JAVAC="javac$nowarn_option$source_option$target_option" HAVE_JAVAC=1 HAVE_JAVACOMP=1 else @@ -415,13 +449,13 @@ changequote([,])dnl else target_option=' -target '`case "$try_target_version" in 6|7|8) echo 1. ;; esac`"$try_target_version" fi - if { echo "$as_me:__oline__: javac$source_option$target_option -d . conftest.java" >&AS_MESSAGE_LOG_FD - javac$source_option$target_option -d . conftest.java >&AS_MESSAGE_LOG_FD 2>&1 + 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 } \ && test -f conftest.class; then dnl The compiler supports the try_source_version and dnl try_target_version. It's better than nothing. - CONF_JAVAC="javac$source_option$target_option" + CONF_JAVAC="javac$nowarn_option$source_option$target_option" HAVE_JAVAC=1 HAVE_JAVACOMP=1 break -- 2.39.5