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
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.
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
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;
[target_version_index (target_version)];
if (!resultp->tested)
{
- /* Try gcj. */
+ /* Try $JAVAC. */
struct temp_dir *tmpdir;
char *conftest_file_name;
char *compiled_file_name;
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))
if (write_temp_file (tmpdir, conftest_file_name, failcode))
{
free (conftest_file_name);
+ free (javac_source);
cleanup_temp_dir (tmpdir);
return true;
}
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;
}
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)
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;
}
}
- 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: