From: Bruno Haible Date: Fri, 9 Jun 2023 13:45:25 +0000 (+0200) Subject: javacomp: Remove support for 'gcj'. X-Git-Tag: v1.0~1233 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=3eae71481526bbdb4c0b514c59e252c92081063c;p=gnulib.git javacomp: Remove support for 'gcj'. * lib/javacomp.h: Update comment. * lib/javacomp.c (compile_using_gcj, is_envjavac_gcj, is_envjavac_gcj43, is_envjavac_gcj43_usable, is_envjavac_oldgcj_14_14_usable, is_envjavac_oldgcj_14_13_usable, is_gcj_present, is_gcj_43, is_gcj43_usable, is_oldgcj_14_14_usable, is_oldgcj_14_13_usable): Remove functions. (is_envjavac_usable): Renamed from is_envjavac_nongcj_usable. (compile_java_class): Remove gcj related code. --- diff --git a/ChangeLog b/ChangeLog index 4d733c5018..de1b1eb08d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2023-06-09 Bruno Haible + javacomp: Remove support for 'gcj'. + * lib/javacomp.h: Update comment. + * lib/javacomp.c (compile_using_gcj, is_envjavac_gcj, is_envjavac_gcj43, + is_envjavac_gcj43_usable, is_envjavac_oldgcj_14_14_usable, + is_envjavac_oldgcj_14_13_usable, is_gcj_present, is_gcj_43, + is_gcj43_usable, is_oldgcj_14_14_usable, is_oldgcj_14_13_usable): Remove + functions. + (is_envjavac_usable): Renamed from is_envjavac_nongcj_usable. + (compile_java_class): Remove gcj related code. + javacomp-script: Remove support for 'gcj'. * build-aux/javacomp.sh.in: Don't test HAVE_GCJ_C. * m4/javacomp.m4 (gt_JAVACOMP): Don't set HAVE_GCJ_C. Don't test whether diff --git a/lib/javacomp.c b/lib/javacomp.c index bb4ef919f4..b3bef36ca1 100644 --- a/lib/javacomp.c +++ b/lib/javacomp.c @@ -64,7 +64,6 @@ Program from A C O g T $JAVAC unknown N n/a -O -g true - gcj -C GCC 3.2 Y --classpath=P -O -g gcj --version | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^3\.[01]/d' | grep '^[3-9]' >/dev/null javac JDK 1.1.8 Y -classpath P -O -g javac 2>/dev/null; test $? = 1 javac JDK 1.3.0 Y -classpath P -O -g javac 2>/dev/null; test $? -le 2 jikes Jikes 1.14 N -classpath P -O -g jikes 2>/dev/null; test $? = 1 @@ -78,9 +77,8 @@ We try the Java compilers in the following order: 1. getenv ("JAVAC"), because the user must be able to override our preferences, - 2. "gcj -C", because it is a completely free compiler, - 3. "javac", because it is a standard compiler, - 4. "jikes", comes last because it has some deviating interpretation + 2. "javac", because it is a standard compiler, + 3. "jikes", comes last because it has some deviating interpretation of the Java Language Specification and because it requires a CLASSPATH environment variable. @@ -354,93 +352,6 @@ compile_using_envjavac (const char *javac, return err; } -/* Try to compile a set of Java sources with gcj. - Return a failure indicator (true upon error). */ -static bool -compile_using_gcj (const char * const *java_sources, - unsigned int java_sources_count, - bool no_assert_option, - bool fsource_option, const char *source_version, - bool ftarget_option, const char *target_version, - const char *directory, - bool optimize, bool debug, - bool verbose, bool null_stderr) -{ - bool err; - unsigned int argc; - const char **argv; - const char **argp; - char *fsource_arg; - char *ftarget_arg; - int exitstatus; - unsigned int i; - - argc = - 2 + (no_assert_option ? 1 : 0) + (fsource_option ? 1 : 0) - + (ftarget_option ? 1 : 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++ = "gcj"; - *argp++ = "-C"; - if (no_assert_option) - *argp++ = "-fno-assert"; - if (fsource_option) - { - fsource_arg = (char *) xmalloca (9 + strlen (source_version) + 1); - memcpy (fsource_arg, "-fsource=", 9); - strcpy (fsource_arg + 9, source_version); - *argp++ = fsource_arg; - } - else - fsource_arg = NULL; - if (ftarget_option) - { - ftarget_arg = (char *) xmalloca (9 + strlen (target_version) + 1); - memcpy (ftarget_arg, "-ftarget=", 9); - strcpy (ftarget_arg + 9, target_version); - *argp++ = ftarget_arg; - } - else - ftarget_arg = NULL; - if (optimize) - *argp++ = "-O"; - if (debug) - *argp++ = "-g"; - if (directory != NULL) - { - *argp++ = "-d"; - *argp++ = directory; - } - for (i = 0; i < java_sources_count; i++) - *argp++ = java_sources[i]; - *argp = NULL; - /* Ensure argv length was correctly calculated. */ - if (argp - argv != argc) - abort (); - - if (verbose) - { - char *command = shell_quote_argv (argv); - printf ("%s\n", command); - free (command); - } - - exitstatus = execute ("gcj", "gcj", argv, NULL, - false, false, false, null_stderr, - true, true, NULL); - err = (exitstatus != 0); - - if (ftarget_arg != NULL) - freea (ftarget_arg); - if (fsource_arg != NULL) - freea (fsource_arg); - freea (argv); - - return err; -} - /* Try to compile a set of Java sources with javac. Return a failure indicator (true upon error). */ static bool @@ -623,986 +534,24 @@ get_classfile_version (const char *compiled_file_name) return INT_MAX; } -/* Return true if $JAVAC is a version of gcj. */ -static bool -is_envjavac_gcj (const char *javac) -{ - static bool envjavac_tested; - static bool envjavac_gcj; - - if (!envjavac_tested) - { - /* Test whether $JAVAC is gcj: - "$JAVAC --version 2>/dev/null | sed -e 1q | grep gcj > /dev/null" */ - unsigned int command_length; - char *command; - const char *argv[4]; - pid_t child; - int fd[1]; - FILE *fp; - char *line; - size_t linesize; - size_t linelen; - int exitstatus; - char *p; - - /* Setup the command "$JAVAC --version". */ - command_length = strlen (javac) + 1 + 9 + 1; - command = (char *) xmalloca (command_length); - p = command; - /* Don't shell_quote $JAVAC, because it may consist of a command - and options. */ - memcpy (p, javac, strlen (javac)); - p += strlen (javac); - memcpy (p, " --version", 1 + 9 + 1); - p += 1 + 9 + 1; - /* Ensure command_length was correctly calculated. */ - if (p - command > command_length) - abort (); - - /* Call $JAVAC --version 2>/dev/null. */ - argv[0] = BOURNE_SHELL; - argv[1] = "-c"; - argv[2] = command; - argv[3] = NULL; - child = create_pipe_in (javac, BOURNE_SHELL, argv, NULL, - DEV_NULL, true, true, false, fd); - if (child == -1) - goto failed; - - /* Retrieve its result. */ - fp = fdopen (fd[0], "r"); - if (fp == NULL) - goto failed; - - line = NULL; linesize = 0; - linelen = getline (&line, &linesize, fp); - if (linelen == (size_t)(-1)) - { - fclose (fp); - goto failed; - } - /* It is safe to call c_strstr() instead of strstr() here; see the - comments in c-strstr.h. */ - envjavac_gcj = (c_strstr (line, "gcj") != NULL); - - fclose (fp); - - /* Remove zombie process from process list, and retrieve exit status. */ - exitstatus = - wait_subprocess (child, javac, true, true, true, false, NULL); - if (exitstatus != 0) - envjavac_gcj = false; - - failed: - freea (command); - - envjavac_tested = true; - } - - return envjavac_gcj; -} - -/* Return true if $JAVAC, known to be a version of gcj, is a version >= 4.3 - of gcj. */ -static bool -is_envjavac_gcj43 (const char *javac) -{ - static bool envjavac_tested; - static bool envjavac_gcj43; - - if (!envjavac_tested) - { - /* Test whether $JAVAC is gcj: - "$JAVAC --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q \ - | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null" */ - unsigned int command_length; - char *command; - const char *argv[4]; - pid_t child; - int fd[1]; - FILE *fp; - char *line; - size_t linesize; - size_t linelen; - int exitstatus; - char *p; - - /* Setup the command "$JAVAC --version". */ - command_length = strlen (javac) + 1 + 9 + 1; - command = (char *) xmalloca (command_length); - p = command; - /* Don't shell_quote $JAVAC, because it may consist of a command - and options. */ - memcpy (p, javac, strlen (javac)); - p += strlen (javac); - memcpy (p, " --version", 1 + 9 + 1); - p += 1 + 9 + 1; - /* Ensure command_length was correctly calculated. */ - if (p - command > command_length) - abort (); - - /* Call $JAVAC --version 2>/dev/null. */ - argv[0] = BOURNE_SHELL; - argv[1] = "-c"; - argv[2] = command; - argv[3] = NULL; - child = create_pipe_in (javac, BOURNE_SHELL, argv, NULL, - DEV_NULL, true, true, false, fd); - if (child == -1) - goto failed; - - /* Retrieve its result. */ - fp = fdopen (fd[0], "r"); - if (fp == NULL) - goto failed; - - line = NULL; linesize = 0; - linelen = getline (&line, &linesize, fp); - if (linelen == (size_t)(-1)) - { - fclose (fp); - goto failed; - } - p = line; - while (*p != '\0' && !(*p >= '0' && *p <= '9')) - p++; - envjavac_gcj43 = - !(*p == '4' && p[1] == '.' && p[2] >= '0' && p[2] <= '2') - && (*p >= '4' && *p <= '9'); - - fclose (fp); - - /* Remove zombie process from process list, and retrieve exit status. */ - exitstatus = - wait_subprocess (child, javac, true, true, true, false, NULL); - if (exitstatus != 0) - envjavac_gcj43 = false; - - failed: - freea (command); - - envjavac_tested = true; - } - - return envjavac_gcj43; -} - -/* Test whether $JAVAC, known to be a version of gcj >= 4.3, can be used, and - whether it needs a -fsource and/or -ftarget option. - Return a failure indicator (true upon error). */ -static bool -is_envjavac_gcj43_usable (const char *javac, - const char *source_version, - const char *target_version, - bool *usablep, - bool *fsource_option_p, bool *ftarget_option_p) -{ - /* The cache depends on the source_version and target_version. */ - struct result_t - { - bool tested; - bool usable; - bool fsource_option; - bool ftarget_option; - }; - static struct result_t result_cache[SOURCE_VERSION_BOUND][TARGET_VERSION_BOUND]; - struct result_t *resultp; - - resultp = &result_cache[source_version_index (source_version)] - [target_version_index (target_version)]; - if (!resultp->tested) - { - /* Try $JAVAC. */ - struct temp_dir *tmpdir; - char *conftest_file_name; - char *compiled_file_name; - const char *java_sources[1]; - struct stat statbuf; - - tmpdir = create_temp_dir ("java", NULL, false); - if (tmpdir == NULL) - return true; - - conftest_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL); - if (write_temp_file (tmpdir, conftest_file_name, - get_goodcode_snippet (source_version))) - { - free (conftest_file_name); - cleanup_temp_dir (tmpdir); - return true; - } - - compiled_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL); - register_temp_file (tmpdir, compiled_file_name); - - 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 - && get_classfile_version (compiled_file_name) - <= corresponding_classfile_version (target_version)) - { - /* $JAVAC compiled conftest.java successfully. */ - /* Try adding -fsource option if it is useful. */ - char *javac_source = - xasprintf ("%s -fsource=%s", javac, source_version); - assume (javac_source != NULL); - - unlink (compiled_file_name); - - java_sources[0] = conftest_file_name; - if (!compile_using_envjavac (javac_source, - java_sources, 1, tmpdir->dir_name, - false, false, false, true) - && stat (compiled_file_name, &statbuf) >= 0 - && get_classfile_version (compiled_file_name) - <= corresponding_classfile_version (target_version)) - { - const char *failcode = get_failcode_snippet (source_version); - - if (failcode != NULL) - { - free (compiled_file_name); - free (conftest_file_name); - - conftest_file_name = - xconcatenated_filename (tmpdir->dir_name, - "conftestfail.java", - NULL); - if (write_temp_file (tmpdir, conftest_file_name, failcode)) - { - free (conftest_file_name); - free (javac_source); - cleanup_temp_dir (tmpdir); - return true; - } - - compiled_file_name = - xconcatenated_filename (tmpdir->dir_name, - "conftestfail.class", - NULL); - register_temp_file (tmpdir, compiled_file_name); - - 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) - { - unlink (compiled_file_name); - - java_sources[0] = conftest_file_name; - if (compile_using_envjavac (javac_source, - java_sources, 1, - tmpdir->dir_name, - false, false, false, true)) - /* $JAVAC compiled conftestfail.java successfully, and - "$JAVAC -fsource=$source_version" rejects it. So - the -fsource option is useful. */ - resultp->fsource_option = true; - } - } - } - - free (javac_source); - - resultp->usable = true; - } - else - { - /* Try with -fsource and -ftarget options. */ - char *javac_target = - xasprintf ("%s -fsource=%s -ftarget=%s", - javac, source_version, target_version); - assume (javac_target != NULL); - - unlink (compiled_file_name); - - java_sources[0] = conftest_file_name; - if (!compile_using_envjavac (javac_target, - java_sources, 1, tmpdir->dir_name, - false, false, false, true) - && stat (compiled_file_name, &statbuf) >= 0 - && get_classfile_version (compiled_file_name) - <= corresponding_classfile_version (target_version)) - { - /* "$JAVAC -fsource $source_version -ftarget $target_version" - compiled conftest.java successfully. */ - resultp->fsource_option = true; - resultp->ftarget_option = true; - resultp->usable = true; - } - - free (javac_target); - } - - free (compiled_file_name); - free (conftest_file_name); - - resultp->tested = true; - } - - *usablep = resultp->usable; - *fsource_option_p = resultp->fsource_option; - *ftarget_option_p = resultp->ftarget_option; - return false; -} - -/* Test whether $JAVAC, known to be a version of gcj < 4.3, can be used for - compiling with target_version = 1.4 and source_version = 1.4. - Return a failure indicator (true upon error). */ -static bool -is_envjavac_oldgcj_14_14_usable (const char *javac, bool *usablep) -{ - static bool envjavac_tested; - static bool envjavac_usable; - - if (!envjavac_tested) - { - /* Try $JAVAC. */ - struct temp_dir *tmpdir; - char *conftest_file_name; - char *compiled_file_name; - const char *java_sources[1]; - struct stat statbuf; - - tmpdir = create_temp_dir ("java", NULL, false); - if (tmpdir == NULL) - return true; - - conftest_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL); - if (write_temp_file (tmpdir, conftest_file_name, - get_goodcode_snippet ("1.4"))) - { - free (conftest_file_name); - cleanup_temp_dir (tmpdir); - return true; - } - - compiled_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL); - register_temp_file (tmpdir, compiled_file_name); - - 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) - /* Compilation succeeded. */ - envjavac_usable = true; - - free (compiled_file_name); - free (conftest_file_name); - - cleanup_temp_dir (tmpdir); - - envjavac_tested = true; - } - - *usablep = envjavac_usable; - return false; -} - -/* Test whether $JAVAC, known to be a version of gcj < 4.3, can be used for - compiling with target_version = 1.4 and source_version = 1.3. - Return a failure indicator (true upon error). */ -static bool -is_envjavac_oldgcj_14_13_usable (const char *javac, - bool *usablep, bool *need_no_assert_option_p) -{ - static bool envjavac_tested; - static bool envjavac_usable; - static bool envjavac_need_no_assert_option; - - if (!envjavac_tested) - { - /* Try $JAVAC and "$JAVAC -fno-assert". But add -fno-assert only if - it makes a difference. (It could already be part of $JAVAC.) */ - struct temp_dir *tmpdir; - char *conftest_file_name; - char *compiled_file_name; - const char *java_sources[1]; - struct stat statbuf; - bool javac_works; - char *javac_noassert; - bool javac_noassert_works; - - tmpdir = create_temp_dir ("java", NULL, false); - if (tmpdir == NULL) - return true; - - conftest_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL); - if (write_temp_file (tmpdir, conftest_file_name, - get_goodcode_snippet ("1.3"))) - { - free (conftest_file_name); - cleanup_temp_dir (tmpdir); - return true; - } - - compiled_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL); - register_temp_file (tmpdir, compiled_file_name); - - 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) - /* Compilation succeeded. */ - javac_works = true; - else - javac_works = false; - - unlink (compiled_file_name); - - javac_noassert = xasprintf ("%s -fno-assert", javac); - assume (javac_noassert != NULL); - - java_sources[0] = conftest_file_name; - if (!compile_using_envjavac (javac_noassert, - java_sources, 1, tmpdir->dir_name, - false, false, false, true) - && stat (compiled_file_name, &statbuf) >= 0) - /* Compilation succeeded. */ - javac_noassert_works = true; - else - javac_noassert_works = false; - - free (compiled_file_name); - free (conftest_file_name); - - if (javac_works && javac_noassert_works) - { - conftest_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftestfail.java", - NULL); - if (write_temp_file (tmpdir, conftest_file_name, - get_failcode_snippet ("1.3"))) - { - free (conftest_file_name); - free (javac_noassert); - cleanup_temp_dir (tmpdir); - return true; - } - - compiled_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftestfail.class", - NULL); - register_temp_file (tmpdir, compiled_file_name); - - 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) - { - /* Compilation succeeded. */ - unlink (compiled_file_name); - - java_sources[0] = conftest_file_name; - if (!(!compile_using_envjavac (javac_noassert, - java_sources, 1, tmpdir->dir_name, - false, false, false, true) - && stat (compiled_file_name, &statbuf) >= 0)) - /* Compilation failed. */ - /* "$JAVAC -fno-assert" works better than $JAVAC. */ - javac_works = true; - } - - free (compiled_file_name); - free (conftest_file_name); - } - - cleanup_temp_dir (tmpdir); - - if (javac_works) - { - envjavac_usable = true; - envjavac_need_no_assert_option = false; - } - else if (javac_noassert_works) - { - envjavac_usable = true; - envjavac_need_no_assert_option = true; - } - - envjavac_tested = true; - } - - *usablep = envjavac_usable; - *need_no_assert_option_p = envjavac_need_no_assert_option; - return false; -} - -/* Test whether $JAVAC, known to be not a version of gcj, can be used, and - whether it needs a -source and/or -target option. - Return a failure indicator (true upon error). */ -static bool -is_envjavac_nongcj_usable (const char *javac, - const char *source_version, - const char *source_version_for_javac, - const char *target_version, - bool *usablep, - bool *source_option_p, bool *target_option_p) -{ - /* The cache depends on the source_version and target_version. */ - struct result_t - { - bool tested; - bool usable; - bool source_option; - bool target_option; - }; - static struct result_t result_cache[SOURCE_VERSION_BOUND][TARGET_VERSION_BOUND]; - struct result_t *resultp; - - resultp = &result_cache[source_version_index (source_version)] - [target_version_index (target_version)]; - if (!resultp->tested) - { - /* Try $JAVAC. */ - struct temp_dir *tmpdir; - char *conftest_file_name; - char *compiled_file_name; - const char *java_sources[1]; - struct stat statbuf; - - tmpdir = create_temp_dir ("java", NULL, false); - if (tmpdir == NULL) - return true; - - conftest_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL); - if (write_temp_file (tmpdir, conftest_file_name, - get_goodcode_snippet (source_version))) - { - free (conftest_file_name); - cleanup_temp_dir (tmpdir); - return true; - } - - compiled_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL); - register_temp_file (tmpdir, compiled_file_name); - - 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 - && get_classfile_version (compiled_file_name) - <= corresponding_classfile_version (target_version)) - { - /* $JAVAC compiled conftest.java successfully. */ - /* Try adding -source option if it is useful. */ - char *javac_source = - xasprintf ("%s -source %s", javac, source_version_for_javac); - assume (javac_source != NULL); - - unlink (compiled_file_name); - - java_sources[0] = conftest_file_name; - if (!compile_using_envjavac (javac_source, - java_sources, 1, tmpdir->dir_name, - false, false, false, true) - && stat (compiled_file_name, &statbuf) >= 0 - && get_classfile_version (compiled_file_name) - <= corresponding_classfile_version (target_version)) - { - const char *failcode = get_failcode_snippet (source_version); - - if (failcode != NULL) - { - free (compiled_file_name); - free (conftest_file_name); - - conftest_file_name = - xconcatenated_filename (tmpdir->dir_name, - "conftestfail.java", - NULL); - if (write_temp_file (tmpdir, conftest_file_name, failcode)) - { - free (conftest_file_name); - free (javac_source); - cleanup_temp_dir (tmpdir); - return true; - } - - compiled_file_name = - xconcatenated_filename (tmpdir->dir_name, - "conftestfail.class", - NULL); - register_temp_file (tmpdir, compiled_file_name); - - 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) - { - unlink (compiled_file_name); - - java_sources[0] = conftest_file_name; - if (compile_using_envjavac (javac_source, - java_sources, 1, - tmpdir->dir_name, - false, false, false, true)) - /* $JAVAC compiled conftestfail.java successfully, and - "$JAVAC -source $source_version_for_javac" rejects it. - So the -source option is useful. */ - resultp->source_option = true; - } - } - } - - free (javac_source); - - resultp->usable = true; - } - else - { - /* Try with -target option alone. (Sun javac 1.3.1 has the -target - option but no -source option.) */ - char *javac_target = - xasprintf ("%s -target %s", javac, target_version); - assume (javac_target != NULL); - - unlink (compiled_file_name); - - java_sources[0] = conftest_file_name; - if (!compile_using_envjavac (javac_target, - java_sources, 1, tmpdir->dir_name, - false, false, false, true) - && stat (compiled_file_name, &statbuf) >= 0 - && get_classfile_version (compiled_file_name) - <= corresponding_classfile_version (target_version)) - { - /* "$JAVAC -target $target_version" compiled conftest.java - successfully. */ - /* Try adding -source option if it is useful. */ - char *javac_target_source = - xasprintf ("%s -source %s", javac_target, source_version_for_javac); - assume (javac_target_source != NULL); - - unlink (compiled_file_name); - - java_sources[0] = conftest_file_name; - if (!compile_using_envjavac (javac_target_source, - java_sources, 1, tmpdir->dir_name, - false, false, false, true) - && stat (compiled_file_name, &statbuf) >= 0 - && get_classfile_version (compiled_file_name) - <= corresponding_classfile_version (target_version)) - { - const char *failcode = get_failcode_snippet (source_version); - - if (failcode != NULL) - { - free (compiled_file_name); - free (conftest_file_name); - - conftest_file_name = - xconcatenated_filename (tmpdir->dir_name, - "conftestfail.java", - NULL); - if (write_temp_file (tmpdir, conftest_file_name, - failcode)) - { - free (conftest_file_name); - free (javac_target_source); - free (javac_target); - cleanup_temp_dir (tmpdir); - return true; - } - - compiled_file_name = - xconcatenated_filename (tmpdir->dir_name, - "conftestfail.class", - NULL); - register_temp_file (tmpdir, compiled_file_name); - - java_sources[0] = conftest_file_name; - if (!compile_using_envjavac (javac_target, - java_sources, 1, - tmpdir->dir_name, - false, false, false, true) - && stat (compiled_file_name, &statbuf) >= 0) - { - unlink (compiled_file_name); - - java_sources[0] = conftest_file_name; - if (compile_using_envjavac (javac_target_source, - java_sources, 1, - tmpdir->dir_name, - false, false, false, - true)) - /* "$JAVAC -target $target_version" compiled - conftestfail.java successfully, and - "$JAVAC -target $target_version -source $source_version_for_javac" - rejects it. So the -source option is useful. */ - resultp->source_option = true; - } - } - } - - free (javac_target_source); - - resultp->target_option = true; - resultp->usable = true; - } - else - { - /* Maybe this -target option requires a -source option? Try with - -target and -source options. (Supported by Sun javac 1.4 and - higher.) */ - char *javac_target_source = - xasprintf ("%s -source %s", javac_target, source_version_for_javac); - assume (javac_target_source != NULL); - - unlink (compiled_file_name); - - java_sources[0] = conftest_file_name; - if (!compile_using_envjavac (javac_target_source, - java_sources, 1, tmpdir->dir_name, - false, false, false, true) - && stat (compiled_file_name, &statbuf) >= 0 - && get_classfile_version (compiled_file_name) - <= corresponding_classfile_version (target_version)) - { - /* "$JAVAC -target $target_version -source $source_version_for_javac" - compiled conftest.java successfully. */ - resultp->source_option = true; - resultp->target_option = true; - resultp->usable = true; - } - - free (javac_target_source); - } - - free (javac_target); - } - - free (compiled_file_name); - free (conftest_file_name); - - resultp->tested = true; - } - - *usablep = resultp->usable; - *source_option_p = resultp->source_option; - *target_option_p = resultp->target_option; - return false; -} - -static bool -is_gcj_present (void) -{ - static bool gcj_tested; - static bool gcj_present; - - if (!gcj_tested) - { - /* Test for presence of gcj: - "gcj --version 2> /dev/null | \ - sed -e 's,^[^0-9]*,,' -e 1q | \ - sed -e '/^3\.[01]/d' | grep '^[3-9]' > /dev/null" */ - const char *argv[3]; - pid_t child; - int fd[1]; - int exitstatus; - - argv[0] = "gcj"; - argv[1] = "--version"; - argv[2] = NULL; - child = create_pipe_in ("gcj", "gcj", argv, NULL, - DEV_NULL, true, true, false, fd); - gcj_present = false; - if (child != -1) - { - /* Read the subprocess output, drop all lines except the first, - drop all characters before the first digit, and test whether - the remaining string starts with a digit >= 3, but not with - "3.0" or "3.1". */ - char c[3]; - size_t count = 0; - - while (safe_read (fd[0], &c[count], 1) > 0) - { - if (c[count] == '\n') - break; - if (count == 0) - { - if (!(c[0] >= '0' && c[0] <= '9')) - continue; - gcj_present = (c[0] >= '3'); - } - count++; - if (count == 3) - { - if (c[0] == '3' && c[1] == '.' - && (c[2] == '0' || c[2] == '1')) - gcj_present = false; - break; - } - } - while (safe_read (fd[0], &c[0], 1) > 0) - ; - - close (fd[0]); - - /* Remove zombie process from process list, and retrieve exit - status. */ - exitstatus = - wait_subprocess (child, "gcj", false, true, true, false, NULL); - if (exitstatus != 0) - gcj_present = false; - } - - if (gcj_present) - { - /* See if libgcj.jar is well installed. */ - struct temp_dir *tmpdir; - - tmpdir = create_temp_dir ("java", NULL, false); - if (tmpdir == NULL) - gcj_present = false; - else - { - char *conftest_file_name; - - conftest_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftestlib.java", - NULL); - if (write_temp_file (tmpdir, conftest_file_name, -"public class conftestlib {\n" -" public static void main (String[] args) {\n" -" }\n" -"}\n")) - gcj_present = false; - else - { - char *compiled_file_name; - const char *java_sources[1]; - - compiled_file_name = - xconcatenated_filename (tmpdir->dir_name, - "conftestlib.class", - NULL); - register_temp_file (tmpdir, compiled_file_name); - - java_sources[0] = conftest_file_name; - if (compile_using_gcj (java_sources, 1, false, - false, NULL, false, NULL, - tmpdir->dir_name, - false, false, false, true)) - gcj_present = false; - - free (compiled_file_name); - } - free (conftest_file_name); - } - cleanup_temp_dir (tmpdir); - } - - gcj_tested = true; - } - - return gcj_present; -} - -static bool -is_gcj_43 (void) -{ - static bool gcj_tested; - static bool gcj_43; - - if (!gcj_tested) - { - /* Test for presence of gcj: - "gcj --version 2> /dev/null | \ - sed -e 's,^[^0-9]*,,' -e 1q | \ - sed -e '/^4\.[012]/d' | grep '^[4-9]'" */ - const char *argv[3]; - pid_t child; - int fd[1]; - int exitstatus; - - argv[0] = "gcj"; - argv[1] = "--version"; - argv[2] = NULL; - child = create_pipe_in ("gcj", "gcj", argv, NULL, - DEV_NULL, true, true, false, fd); - gcj_43 = false; - if (child != -1) - { - /* Read the subprocess output, drop all lines except the first, - drop all characters before the first digit, and test whether - the remaining string starts with a digit >= 4, but not with - "4.0" or "4.1" or "4.2". */ - char c[3]; - size_t count = 0; - - while (safe_read (fd[0], &c[count], 1) > 0) - { - if (c[count] == '\n') - break; - if (count == 0) - { - if (!(c[0] >= '0' && c[0] <= '9')) - continue; - gcj_43 = (c[0] >= '4'); - } - count++; - if (count == 3) - { - if (c[0] == '4' && c[1] == '.' && c[2] >= '0' && c[2] <= '2') - gcj_43 = false; - break; - } - } - while (safe_read (fd[0], &c[0], 1) > 0) - ; - - close (fd[0]); - - /* Remove zombie process from process list, and retrieve exit - status. */ - exitstatus = - wait_subprocess (child, "gcj", false, true, true, false, NULL); - if (exitstatus != 0) - gcj_43 = false; - } - - gcj_tested = true; - } - - return gcj_43; -} - -/* Test whether gcj >= 4.3 can be used, and whether it needs a -fsource and/or - -ftarget option. +/* Test whether $JAVAC can be used, and whether it needs a -source and/or + -target option. Return a failure indicator (true upon error). */ static bool -is_gcj43_usable (const char *source_version, - const char *target_version, - bool *usablep, - bool *fsource_option_p, bool *ftarget_option_p) +is_envjavac_usable (const char *javac, + const char *source_version, + const char *source_version_for_javac, + const char *target_version, + bool *usablep, + bool *source_option_p, bool *target_option_p) { /* The cache depends on the source_version and target_version. */ struct result_t { bool tested; bool usable; - bool fsource_option; - bool ftarget_option; + bool source_option; + bool target_option; }; static struct result_t result_cache[SOURCE_VERSION_BOUND][TARGET_VERSION_BOUND]; struct result_t *resultp; @@ -1611,7 +560,7 @@ is_gcj43_usable (const char *source_version, [target_version_index (target_version)]; if (!resultp->tested) { - /* Try gcj. */ + /* Try $JAVAC. */ struct temp_dir *tmpdir; char *conftest_file_name; char *compiled_file_name; @@ -1637,20 +586,25 @@ is_gcj43_usable (const char *source_version, register_temp_file (tmpdir, compiled_file_name); java_sources[0] = conftest_file_name; - if (!compile_using_gcj (java_sources, 1, false, false, NULL, false, NULL, - tmpdir->dir_name, false, false, false, true) + if (!compile_using_envjavac (javac, + java_sources, 1, tmpdir->dir_name, + false, false, false, true) && stat (compiled_file_name, &statbuf) >= 0 && get_classfile_version (compiled_file_name) <= corresponding_classfile_version (target_version)) { - /* gcj compiled conftest.java successfully. */ - /* Try adding -fsource option if it is useful. */ + /* $JAVAC compiled conftest.java successfully. */ + /* Try adding -source option if it is useful. */ + char *javac_source = + xasprintf ("%s -source %s", javac, source_version_for_javac); + assume (javac_source != NULL); + unlink (compiled_file_name); java_sources[0] = conftest_file_name; - if (!compile_using_gcj (java_sources, 1, - false, true, source_version, false, NULL, - tmpdir->dir_name, false, false, false, true) + if (!compile_using_envjavac (javac_source, + java_sources, 1, tmpdir->dir_name, + false, false, false, true) && stat (compiled_file_name, &statbuf) >= 0 && get_classfile_version (compiled_file_name) <= corresponding_classfile_version (target_version)) @@ -1669,6 +623,7 @@ is_gcj43_usable (const char *source_version, if (write_temp_file (tmpdir, conftest_file_name, failcode)) { free (conftest_file_name); + free (javac_source); cleanup_temp_dir (tmpdir); return true; } @@ -1680,193 +635,163 @@ is_gcj43_usable (const char *source_version, register_temp_file (tmpdir, compiled_file_name); java_sources[0] = conftest_file_name; - if (!compile_using_gcj (java_sources, 1, - false, false, NULL, false, NULL, - tmpdir->dir_name, - false, false, false, true) + if (!compile_using_envjavac (javac, + java_sources, 1, + tmpdir->dir_name, + false, false, false, true) && stat (compiled_file_name, &statbuf) >= 0) { unlink (compiled_file_name); java_sources[0] = conftest_file_name; - if (compile_using_gcj (java_sources, 1, - false, true, source_version, - false, NULL, - tmpdir->dir_name, - false, false, false, true)) - /* gcj compiled conftestfail.java successfully, and - "gcj -fsource=$source_version" rejects it. So - the -fsource option is useful. */ - resultp->fsource_option = true; + if (compile_using_envjavac (javac_source, + java_sources, 1, + tmpdir->dir_name, + false, false, false, true)) + /* $JAVAC compiled conftestfail.java successfully, and + "$JAVAC -source $source_version_for_javac" rejects it. + So the -source option is useful. */ + resultp->source_option = true; } } } + free (javac_source); + resultp->usable = true; } else { - /* Try with -fsource and -ftarget options. */ + /* Try with -target option alone. (Sun javac 1.3.1 has the -target + option but no -source option.) */ + char *javac_target = + xasprintf ("%s -target %s", javac, target_version); + assume (javac_target != NULL); + unlink (compiled_file_name); java_sources[0] = conftest_file_name; - if (!compile_using_gcj (java_sources, 1, - false, true, source_version, - true, target_version, - tmpdir->dir_name, - false, false, false, true) + if (!compile_using_envjavac (javac_target, + java_sources, 1, tmpdir->dir_name, + false, false, false, true) && stat (compiled_file_name, &statbuf) >= 0 && get_classfile_version (compiled_file_name) <= corresponding_classfile_version (target_version)) { - /* "gcj -fsource $source_version -ftarget $target_version" - compiled conftest.java successfully. */ - resultp->fsource_option = true; - resultp->ftarget_option = true; - resultp->usable = true; - } - } - - free (compiled_file_name); - free (conftest_file_name); - - resultp->tested = true; - } - - *usablep = resultp->usable; - *fsource_option_p = resultp->fsource_option; - *ftarget_option_p = resultp->ftarget_option; - return false; -} - -/* Test whether gcj < 4.3 can be used for compiling with target_version = 1.4 - and source_version = 1.4. - Return a failure indicator (true upon error). */ -static bool -is_oldgcj_14_14_usable (bool *usablep) -{ - static bool gcj_tested; - static bool gcj_usable; - - if (!gcj_tested) - { - /* Try gcj. */ - struct temp_dir *tmpdir; - char *conftest_file_name; - char *compiled_file_name; - const char *java_sources[1]; - struct stat statbuf; - - tmpdir = create_temp_dir ("java", NULL, false); - if (tmpdir == NULL) - return true; - - conftest_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL); - if (write_temp_file (tmpdir, conftest_file_name, - get_goodcode_snippet ("1.4"))) - { - free (conftest_file_name); - cleanup_temp_dir (tmpdir); - return true; - } - - compiled_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL); - register_temp_file (tmpdir, compiled_file_name); + /* "$JAVAC -target $target_version" compiled conftest.java + successfully. */ + /* Try adding -source option if it is useful. */ + char *javac_target_source = + xasprintf ("%s -source %s", javac_target, source_version_for_javac); + assume (javac_target_source != NULL); - java_sources[0] = conftest_file_name; - if (!compile_using_gcj (java_sources, 1, false, false, NULL, false, NULL, - tmpdir->dir_name, false, false, false, true) - && stat (compiled_file_name, &statbuf) >= 0) - /* Compilation succeeded. */ - gcj_usable = true; + unlink (compiled_file_name); - free (compiled_file_name); - free (conftest_file_name); + java_sources[0] = conftest_file_name; + if (!compile_using_envjavac (javac_target_source, + java_sources, 1, tmpdir->dir_name, + false, false, false, true) + && stat (compiled_file_name, &statbuf) >= 0 + && get_classfile_version (compiled_file_name) + <= corresponding_classfile_version (target_version)) + { + const char *failcode = get_failcode_snippet (source_version); - cleanup_temp_dir (tmpdir); + if (failcode != NULL) + { + free (compiled_file_name); + free (conftest_file_name); - gcj_tested = true; - } + conftest_file_name = + xconcatenated_filename (tmpdir->dir_name, + "conftestfail.java", + NULL); + if (write_temp_file (tmpdir, conftest_file_name, + failcode)) + { + free (conftest_file_name); + free (javac_target_source); + free (javac_target); + cleanup_temp_dir (tmpdir); + return true; + } - *usablep = gcj_usable; - return false; -} + compiled_file_name = + xconcatenated_filename (tmpdir->dir_name, + "conftestfail.class", + NULL); + register_temp_file (tmpdir, compiled_file_name); -/* Test whether gcj < 4.3 can be used for compiling with target_version = 1.4 - and source_version = 1.3. - Return a failure indicator (true upon error). */ -static bool -is_oldgcj_14_13_usable (bool *usablep, bool *need_no_assert_option_p) -{ - static bool gcj_tested; - static bool gcj_usable; - static bool gcj_need_no_assert_option; + java_sources[0] = conftest_file_name; + if (!compile_using_envjavac (javac_target, + java_sources, 1, + tmpdir->dir_name, + false, false, false, true) + && stat (compiled_file_name, &statbuf) >= 0) + { + unlink (compiled_file_name); - if (!gcj_tested) - { - /* Try gcj and "gcj -fno-assert". But add -fno-assert only if - it works (not gcj < 3.3). */ - struct temp_dir *tmpdir; - char *conftest_file_name; - char *compiled_file_name; - const char *java_sources[1]; - struct stat statbuf; + java_sources[0] = conftest_file_name; + if (compile_using_envjavac (javac_target_source, + java_sources, 1, + tmpdir->dir_name, + false, false, false, + true)) + /* "$JAVAC -target $target_version" compiled + conftestfail.java successfully, and + "$JAVAC -target $target_version -source $source_version_for_javac" + rejects it. So the -source option is useful. */ + resultp->source_option = true; + } + } + } - tmpdir = create_temp_dir ("java", NULL, false); - if (tmpdir == NULL) - return true; + free (javac_target_source); - conftest_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL); - if (write_temp_file (tmpdir, conftest_file_name, - get_goodcode_snippet ("1.3"))) - { - free (conftest_file_name); - cleanup_temp_dir (tmpdir); - return true; - } + resultp->target_option = true; + resultp->usable = true; + } + else + { + /* Maybe this -target option requires a -source option? Try with + -target and -source options. (Supported by Sun javac 1.4 and + higher.) */ + char *javac_target_source = + xasprintf ("%s -source %s", javac_target, source_version_for_javac); + assume (javac_target_source != NULL); - compiled_file_name = - xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL); - register_temp_file (tmpdir, compiled_file_name); + unlink (compiled_file_name); - java_sources[0] = conftest_file_name; - if (!compile_using_gcj (java_sources, 1, true, false, NULL, false, NULL, - tmpdir->dir_name, false, false, false, true) - && stat (compiled_file_name, &statbuf) >= 0) - /* Compilation succeeded. */ - { - gcj_usable = true; - gcj_need_no_assert_option = true; - } - else - { - unlink (compiled_file_name); + java_sources[0] = conftest_file_name; + if (!compile_using_envjavac (javac_target_source, + java_sources, 1, tmpdir->dir_name, + false, false, false, true) + && stat (compiled_file_name, &statbuf) >= 0 + && get_classfile_version (compiled_file_name) + <= corresponding_classfile_version (target_version)) + { + /* "$JAVAC -target $target_version -source $source_version_for_javac" + compiled conftest.java successfully. */ + resultp->source_option = true; + resultp->target_option = true; + resultp->usable = true; + } - java_sources[0] = conftest_file_name; - if (!compile_using_gcj (java_sources, 1, false, - false, NULL, false, NULL, - tmpdir->dir_name, false, false, false, true) - && stat (compiled_file_name, &statbuf) >= 0) - /* Compilation succeeded. */ - { - gcj_usable = true; - gcj_need_no_assert_option = false; + free (javac_target_source); } + + free (javac_target); } free (compiled_file_name); free (conftest_file_name); - cleanup_temp_dir (tmpdir); - - gcj_tested = true; + resultp->tested = true; } - *usablep = gcj_usable; - *need_no_assert_option_p = gcj_need_no_assert_option; + *usablep = resultp->usable; + *source_option_p = resultp->source_option; + *target_option_p = resultp->target_option; return false; } @@ -2196,61 +1121,15 @@ compile_java_class (const char * const *java_sources, source_version_for_javac = get_source_version_for_javac (source_version, target_version); - if (is_envjavac_gcj (javac)) - { - /* It's a version of gcj. */ - if (is_envjavac_gcj43 (javac)) - { - /* It's a version of gcj >= 4.3. Assume the classfile versions - are correct. */ - if (is_envjavac_gcj43_usable (javac, - source_version, target_version, - &usable, - &fsource_option, &ftarget_option)) - { - err = true; - goto done1; - } - } - else - { - /* It's a version of gcj < 4.3. Ignore the version of the - class files that it creates. */ - if (strcmp (target_version, "1.4") == 0 - && strcmp (source_version, "1.4") == 0) - { - if (is_envjavac_oldgcj_14_14_usable (javac, &usable)) - { - err = true; - goto done1; - } - } - else if (strcmp (target_version, "1.4") == 0 - && strcmp (source_version, "1.3") == 0) - { - if (is_envjavac_oldgcj_14_13_usable (javac, - &usable, - &no_assert_option)) - { - err = true; - goto done1; - } - } - } - } - else + if (is_envjavac_usable (javac, + source_version, + source_version_for_javac, + target_version, + &usable, + &source_option, &target_option)) { - /* It's not gcj. Assume the classfile versions are correct. */ - if (is_envjavac_nongcj_usable (javac, - source_version, - source_version_for_javac, - target_version, - &usable, - &source_option, &target_option)) - { - err = true; - goto done1; - } + err = true; + goto done1; } if (usable) @@ -2300,79 +1179,6 @@ compile_java_class (const char * const *java_sources, unsetenv ("JAVA_HOME"); } - if (is_gcj_present ()) - { - /* It's a version of gcj. */ - bool usable = false; - bool no_assert_option = false; - bool fsource_option = false; - bool ftarget_option = false; - - if (target_version == NULL) - target_version = default_target_version (); - - if (is_gcj_43 ()) - { - /* It's a version of gcj >= 4.3. Assume the classfile versions - are correct. */ - if (is_gcj43_usable (source_version, target_version, - &usable, &fsource_option, &ftarget_option)) - { - err = true; - goto done1; - } - } - else - { - /* It's a version of gcj < 4.3. Ignore the version of the class - files that it creates. - Test whether it supports the desired target-version and - source-version. */ - if (strcmp (target_version, "1.4") == 0 - && strcmp (source_version, "1.4") == 0) - { - if (is_oldgcj_14_14_usable (&usable)) - { - err = true; - goto done1; - } - } - else if (strcmp (target_version, "1.4") == 0 - && strcmp (source_version, "1.3") == 0) - { - if (is_oldgcj_14_13_usable (&usable, &no_assert_option)) - { - err = true; - goto done1; - } - } - } - - if (usable) - { - char *old_classpath; - - /* Set CLASSPATH. We could also use the --CLASSPATH=... option - of gcj. Note that --classpath=... option is different: its - argument should also contain gcj's libgcj.jar, but we don't - know its location. */ - old_classpath = - set_classpath (classpaths, classpaths_count, use_minimal_classpath, - verbose); - - err = compile_using_gcj (java_sources, java_sources_count, - no_assert_option, - fsource_option, source_version, - ftarget_option, target_version, - directory, optimize, debug, verbose, false); - - /* Reset CLASSPATH. */ - reset_classpath (old_classpath); - - goto done2; - } - } - if (is_javac_present ()) { bool usable = false; @@ -2448,7 +1254,7 @@ compile_java_class (const char * const *java_sources, } } - error (0, 0, _("Java compiler not found, try installing gcj or set $JAVAC")); + error (0, 0, _("Java compiler not found, try setting $JAVAC")); err = true; done2: diff --git a/lib/javacomp.h b/lib/javacomp.h index 825efb4667..dcc9c37f7a 100644 --- a/lib/javacomp.h +++ b/lib/javacomp.h @@ -61,11 +61,7 @@ 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. + 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