/* Specific flags and argument handling of the front-end of the GNU compiler for the Java(TM) language. Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU CC. GNU CC 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 2, or (at your option) any later version. GNU CC 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 GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Java and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries. The Free Software Foundation is independent of Sun Microsystems, Inc. */ #include "config.h" #include "system.h" #include "gcc.h" /* Name of spec file. */ #define SPEC_FILE "libgcj.spec" /* This bit is set if we saw a `-xfoo' language specification. */ #define LANGSPEC (1<<1) /* True if this arg is a parameter to the previous option-taking arg. */ #define PARAM_ARG (1<<2) /* True if this arg is a .java input file name. */ #define JAVA_FILE_ARG (1<<3) /* True if this arg is a .class input file name. */ #define CLASS_FILE_ARG (1<<4) static char *find_spec_file PARAMS ((const char *)); static const char *main_class_name = NULL; int lang_specific_extra_outfiles = 0; /* Once we have the proper support in jc1 (and gcc.c) working, set COMBINE_INPUTS to one. This enables combining multiple *.java and *.class input files to be passed to a single jc1 invocation. */ #define COMBINE_INPUTS 0 const char jvgenmain_spec[] = "jvgenmain %{D*} %i %{!pipe:%umain.i} |\n\ cc1 %{!pipe:%Umain.i} %1 \ %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\ %{g*} %{O*} \ %{v:-version} %{pg:-p} %{p}\ %{ 5 && strcmp (argv[i] + len - 5, ".java") == 0) { args[i] |= JAVA_FILE_ARG; java_files_count++; java_files_length += len; last_input_index = i; } if (len > 6 && strcmp (argv[i] + len - 6, ".class") == 0) { args[i] |= CLASS_FILE_ARG; class_files_count++; class_files_length += len; last_input_index = i; } #endif } } if (quote) fatal ("argument to `%s' missing\n", quote); if (saw_D && ! main_class_name) fatal ("can't specify `-D' without `--main'\n"); num_args = argc + added; if (saw_C) { num_args += 3; #if COMBINE_INPUTS class_files_length = 0; num_args -= class_files_count; num_args += 2; /* For -o NONE. */ #endif if (saw_o) fatal ("cannot specify both -C and -o"); } #if COMBINE_INPUTS if (saw_o && java_files_count + (saw_C ? 0 : class_files_count) > 1) combine_inputs = 1; if (combine_inputs) { int len = java_files_length + java_files_count - 1; num_args -= java_files_count; num_args++; /* Add one for the combined arg. */ if (class_files_length > 0) { len += class_files_length + class_files_count - 1; num_args -= class_files_count; } combined_inputs_buffer = (char*) xmalloc (len); combined_inputs_pos = 0; } /* If we know we don't have to do anything, bail now. */ #endif #if 0 if (! added && ! library && main_class_name == NULL && ! saw_C) { free (args); return; } #endif if (main_class_name) { lang_specific_extra_outfiles++; } if (saw_g + saw_O == 0) num_args++; num_args++; arglist = (const char **) (real_arglist = (char **) xmalloc ((num_args + 1) * sizeof (char *))); for (i = 0, j = 0; i < argc; i++, j++) { arglist[j] = argv[i]; if ((args[i] & PARAM_ARG) || i == 0) continue; if (strcmp (argv[i], "-classpath") == 0 || strcmp (argv[i], "-CLASSPATH") == 0) { char* patharg = (char*) xmalloc (strlen (argv[i]) + strlen (argv[i+1]) + 3); sprintf (patharg, "-f%s=%s", argv[i]+1, argv[i+1]); arglist[j] = patharg; i++; continue; } if (strcmp (argv[i], "-d") == 0) { char *patharg = (char *) xmalloc (sizeof ("-foutput-class-dir=") + strlen (argv[i + 1]) + 1); sprintf (patharg, "-foutput-class-dir=%s", argv[i + 1]); arglist[j] = patharg; ++i; continue; } if (spec_file == NULL && strncmp (argv[i], "-L", 2) == 0) spec_file = find_spec_file (argv[i] + 2); if (strncmp (argv[i], "-fmain=", 7) == 0) { if (! will_link) fatal ("cannot specify `main' class when not linking"); --j; continue; } if ((args[i] & CLASS_FILE_ARG) && saw_C) { --j; continue; } #if COMBINE_INPUTS if (combine_inputs && (args[i] & (CLASS_FILE_ARG|JAVA_FILE_ARG)) != 0) { if (combined_inputs_pos > 0) combined_inputs_buffer[combined_inputs_pos++] = '&'; strcpy (&combined_inputs_buffer[combined_inputs_pos], argv[i]); combined_inputs_pos += strlen (argv[i]); --j; continue; } #endif } #if COMBINE_INPUTS if (combine_inputs) { combined_inputs_buffer[combined_inputs_pos] = '\0'; #if 0 if (! saw_C) #endif arglist[j++] = combined_inputs_buffer; } #endif /* If we saw no -O or -g option, default to -g1, for javac compatibility. */ if (saw_g + saw_O == 0) arglist[j++] = "-g1"; /* Read the specs file corresponding to libgcj. If we didn't find the spec file on the -L path, then we hope it is somewhere in the standard install areas. */ if (want_spec_file) arglist[j++] = spec_file == NULL ? "-specs=libgcj.spec" : spec_file; if (saw_C) { arglist[j++] = "-fsyntax-only"; arglist[j++] = "-femit-class-files"; arglist[j++] = "-S"; #if COMBINE_INPUTS arglist[j++] = "-o"; arglist[j++] = "NONE"; #endif } arglist[j] = NULL; *in_argc = j; *in_argv = real_arglist; *in_added_libraries = added_libraries; } int lang_specific_pre_link () { if (main_class_name == NULL) return 0; input_filename = main_class_name; input_filename_length = strlen (main_class_name); return do_spec (jvgenmain_spec); }