diff options
author | Tom Tromey <tromey@cygnus.com> | 2000-10-20 21:19:29 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2000-10-20 21:19:29 +0000 |
commit | 316a06a103ac4064f94377b8a4a4c1b91f6a5afe (patch) | |
tree | 4eede965e0e3fec6ff244f7ac3b8432688b7e248 /gcc/java/jcf-depend.c | |
parent | 3f568531d04baeb2dc6a3eaf3e18d5a219c3e841 (diff) | |
download | gcc-316a06a103ac4064f94377b8a4a4c1b91f6a5afe.zip gcc-316a06a103ac4064f94377b8a4a4c1b91f6a5afe.tar.gz gcc-316a06a103ac4064f94377b8a4a4c1b91f6a5afe.tar.bz2 |
jvspec.c (lang_specific_driver): Recognize -MF and -MT.
* jvspec.c (lang_specific_driver): Recognize -MF and -MT.
* lang-specs.h: Added %{MA}, %{MF*}, %{MT*}.
* lang-options.h: Added -MA, -MT, -MF..
* lang.c (lang_decode_option): Recognize -MA, -MT, -MF.
(DEPEND_TARGET_SET): New macro.
(DEPEND_FILE_ALREADY_SET): Likewise.
(init_parse): Handle new flags.
* jcf.h (jcf_dependency_print_dummies): Declare.
* Make-lang.in (s-java): Added mkdeps.o.
* Makefile.in (BACKEND): Added mkdeps.o.
(../gcjh$(exeext)): Added mkdeps.o.
(../jcf-dump$(exeext)): Added mkdeps.o.
* jcf-depend.c: Include mkdeps.h.
(struct entry, dependencies, targets, MAX_OUTPUT_COLUMNS,
add_entry): Removed.
(jcf_dependency_reset): Rewrote.
(dependencies): New global.
(jcf_dependency_set_target): Rewrote.
(jcf_dependency_add_target): Likewise.
(jcf_dependency_add_file): Likewise.
(munge): Removed.
(print_ents): Removed.
(jcf_dependency_write): Rewrote.
(print_dummies): New global.
(jcf_dependency_print_dummies): New function
(jcf_dependency_write): Call deps_dummy_targets if required.
From-SVN: r36981
Diffstat (limited to 'gcc/java/jcf-depend.c')
-rw-r--r-- | gcc/java/jcf-depend.c | 197 |
1 files changed, 32 insertions, 165 deletions
diff --git a/gcc/java/jcf-depend.c b/gcc/java/jcf-depend.c index 1c893e4..501e239 100644 --- a/gcc/java/jcf-depend.c +++ b/gcc/java/jcf-depend.c @@ -25,6 +25,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ #include "config.h" #include "system.h" +#include "mkdeps.h" #include <assert.h> @@ -32,27 +33,8 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ -/* We keep a linked list of all the files we've already read. */ -struct entry -{ - char *file; - struct entry *next; -}; - -static void free_entry PARAMS ((struct entry **)); -static void add_entry PARAMS ((struct entry **, const char *)); -static const char *munge PARAMS ((const char *)); -static int print_ents PARAMS ((struct entry *, int)); - -/* List of files. */ -static struct entry *dependencies = NULL; - -/* Name of targets. We support multiple targets when writing .class - files. */ -static struct entry *targets = NULL; - -/* Number of columns in output. */ -#define MAX_OUTPUT_COLUMNS 72 +/* The dependency structure used for this invocation. */ +struct deps *dependencies; /* The output file, or NULL if we aren't doing dependency tracking. */ static FILE *dep_out = NULL; @@ -60,81 +42,47 @@ static FILE *dep_out = NULL; /* Nonzero if system files should be added. */ static int system_files; - - -/* Helper to free an entry list. */ -static void -free_entry (entp) - struct entry **entp; -{ - struct entry *ent, *next; - - for (ent = *entp; ent != NULL; ent = next) - { - next = ent->next; - free (ent->file); - free (ent); - } - *entp = NULL; -} - -/* Helper to add to the end of the entry list. */ -static void -add_entry (entp, name) - struct entry **entp; - const char *name; -{ - struct entry *ent, *last; - - for (last = ent = *entp; ent != NULL; last = ent, ent = ent->next) - if (! strcmp (ent->file, name)) - return; - - ent = (struct entry *) xmalloc (sizeof (struct entry)); - ent->file = xstrdup (name); - ent->next = NULL; +/* Nonzero if we are dumping out dummy dependencies. */ +static int print_dummies; - if (last == NULL) - { - /* This is only true the first time through, when the entry list - is empty. */ - *entp = ent; - } - else - last->next = ent; -} + /* Call this to reset the dependency module. This is required if multiple dependency files are being generated from a single tool - invocation. */ + invocation. FIXME: we should change our API or just completely use + the one in mkdeps.h. */ void jcf_dependency_reset () { - free_entry (&dependencies); - free_entry (&targets); - if (dep_out != NULL) { if (dep_out != stdout) fclose (dep_out); dep_out = NULL; } + + if (dependencies != NULL) + { + deps_free (dependencies); + dependencies = NULL; + } } void jcf_dependency_set_target (name) const char *name; { - free_entry (&targets); - if (name != NULL) - add_entry (&targets, name); + /* We just handle this the same as an `add_target'. */ + if (dependencies != NULL && name != NULL) + deps_add_target (dependencies, name); } void jcf_dependency_add_target (name) const char *name; { - add_entry (&targets, name); + if (dependencies != NULL) + deps_add_target (dependencies, name); } void @@ -155,122 +103,41 @@ jcf_dependency_add_file (filename, system_p) const char *filename; int system_p; { + if (! dependencies) + return; + /* Just omit system files. */ if (system_p && ! system_files) return; - add_entry (&dependencies, filename); + deps_add_dep (dependencies, filename); } void jcf_dependency_init (system_p) int system_p; { + assert (! dependencies); system_files = system_p; + dependencies = deps_init (); } -/* FIXME: this is taken almost directly from cccp.c. Such duplication - is bad. */ -static const char * -munge (filename) - const char *filename; -{ - static char *buffer = NULL; - static int buflen = 0; - - int len = 2 * strlen (filename) + 1; - const char *p; - char *dst; - - if (buflen < len) - { - buflen = len; - buffer = xrealloc (buffer, buflen); - } - - dst = buffer; - for (p = filename; *p; ++p) - { - switch (*p) - { - case ' ': - case '\t': - { - /* GNU make uses a weird quoting scheme for white space. - A space or tab preceded by 2N+1 backslashes represents - N backslashes followed by space; a space or tab - preceded by 2N backslashes represents N backslashes at - the end of a file name; and backslashes in other - contexts should not be doubled. */ - const char *q; - for (q = p - 1; filename < q && q[-1] == '\\'; q--) - *dst++ = '\\'; - } - *dst++ = '\\'; - goto ordinary_char; - - case '$': - *dst++ = '$'; - /* Fall through. This can mishandle things like "$(" but - there's no easy fix. */ - default: - ordinary_char: - /* This can mishandle characters in the string "\0\n%*?[\\~"; - exactly which chars are mishandled depends on the `make' version. - We know of no portable solution for this; - even GNU make 3.76.1 doesn't solve the problem entirely. - (Also, '\0' is mishandled due to our calling conventions.) */ - *dst++ = *p; - break; - } - } - - *dst++ = '\0'; - return buffer; -} - -/* Helper to print list of files. */ -static int -print_ents (ent, column) - struct entry *ent; - int column; +void +jcf_dependency_print_dummies () { - int first = 1; - - for (; ent != NULL; ent = ent->next) - { - const char *depname = munge (ent->file); - int len = strlen (depname); - - if (column + len + 2 > MAX_OUTPUT_COLUMNS) - { - fprintf (dep_out, " \\\n "); - column = 1; - } - - if (! first) - fputs (" ", dep_out); - fputs (depname, dep_out); - first = 0; - column += len + 1; - } - - return column; + print_dummies = 1; } void jcf_dependency_write () { - int column = 0; - if (! dep_out) return; - assert (targets); - column = print_ents (targets, 0); - fputs (" : ", dep_out); + assert (dependencies); - print_ents (dependencies, column); - fputs ("\n", dep_out); + deps_write (dependencies, dep_out, 72); + if (print_dummies) + deps_dummy_targets (dependencies, dep_out); fflush (dep_out); } |