Hash :
66f9edfa
Author :
Date :
2023-06-11T03:13:29
javacomp-script, javacomp: Add support for javac versions > 11. Reported by Adrian Bunk <bunk-gnu@fs.tum.de> in <https://savannah.gnu.org/bugs/?63385>. * m4/javacomp.m4 (gt_JAVACOMP): When the java version is > 11, use that version as target_version, not 11. When the java version is > 17, don't warn. Remove goodcode, failcode variables. Don't bail out if the source-version argument or the target-version argument is in the range 12..99. Use a heuristic that works with javac versions 11..20 at least. Update comments. * lib/javacomp.h (compile_java_class): State that source-version and target-version may be larger than 11. * lib/javacomp.c (default_target_version): Accommodate versions up to 99. (SOURCE_VERSION_BOUND): Increase to 94. (source_version_index): Accept versions up to 99. (get_goodcode_snippet, get_failcode_snippet): Remove functions. (TARGET_VERSION_BOUND): Increase to 94. (target_version_index): Accept versions up to 99. (corresponding_classfile_version): Remove function. (execute_and_read_line): New function, based on lib/javaversion.c. (get_compiler_version): New function. (is_envjavac_usable): Add parameters source_option_out, target_option_out. Use a heuristic that works with javac versions 11..20 at least. Call cleanup_temp_dir. (is_javac_usable): Likewise. (compile_java_class): Update.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
/* Compile a Java program.
Copyright (C) 2001-2002, 2006, 2009-2023 Free Software Foundation, Inc.
Written by Bruno Haible <haible@clisp.cons.org>, 2001.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
#ifndef _JAVACOMP_H
#define _JAVACOMP_H
/* Compile a Java source file to bytecode.
java_sources is an array of source file names.
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.)
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.)
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
useful outside the given package. Passing target_version = NULL is useful
when building an application.
It is unreasonable to ask for a target-version < source-version, such as
- 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, or
- ...
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.
directory is the target directory. The .class file for class X.Y.Z is
written at directory/X/Y/Z.class. If directory is NULL, the .class
file is written in the source's directory.
use_minimal_classpath = true means to ignore the user's CLASSPATH and
use a minimal one. This is likely to reduce possible problems if the
user's CLASSPATH contains garbage or a classes.zip file of the wrong
Java version.
If verbose, the command to be executed will be printed.
Return false if OK, true on error. */
extern bool compile_java_class (const char * const *java_sources,
unsigned int java_sources_count,
const char * const *classpaths,
unsigned int classpaths_count,
const char *source_version,
const char *target_version,
const char *directory,
bool optimize, bool debug,
bool use_minimal_classpath,
bool verbose);
#endif /* _JAVACOMP_H */