Makefile.am: Add makedepend.
libcpp: * Makefile.am: Add makedepend. * Makefile.in, aclocal.m4: Regenerate. * charset.c: Insert a space to avoid a warning. * directives.c: Include mkdeps.h. (_cpp_handle_directive): Reenable macro expander if appropriate. (undefine_macros): Inline body of _cpp_free_definition for speed. Do not call undef callback or _cpp_warn_if_unused_macro. (cpp_get_deps): New interface. * files.c (search_cache): Add pfile argument. Check for file that would be found by "" or <> search here... (_cpp_find_file): ...not here. Correct recorded start_dir of files found by directory-of-current-file search that would be found by "" or <> search. * init.c (cpp_add_dependency_target): Delete. * internal.h (struct lexer_state): Add discarding_output flag. * lex.c (lex_identifier): Compute hash function while scanning. * macro.c (cpp_scan_nooutput): Disable macro expansion outside directives. * makedepend.c: New file. * mkdeps.c (struct deps): Add vpath vector. (apply_vpath, deps_add_vpath): New function. (deps_free): Free vpath vector. (deps_add_dep, deps_add_target): Use apply_vpath. * symtab.c (calc_hash): Use HT_HASHSTEP and HT_FINISH. (ht_lookup_with_hash): New function. * cpplib.h, mkdeps.h: Update prototypes. * symtab.h: Update prototypes. (HT_HASHSTEP, HT_FINISH): New macros. gcc: * Makefile.in (MKDEPS_H): New shorthand. (c-opts.o): Update dependencies. * c-opts.c: Include mkdeps.h. (handle_deferred_opts): Use cpp_get_deps and deps_add_target, not cpp_add_dependency_target. From-SVN: r82654
This commit is contained in:
parent
dbeff3e56d
commit
c6e8380069
20 changed files with 531 additions and 120 deletions
|
@ -35,6 +35,11 @@ struct deps
|
|||
const char **depv;
|
||||
unsigned int ndeps;
|
||||
unsigned int deps_size;
|
||||
|
||||
const char **vpathv;
|
||||
size_t *vpathlv;
|
||||
unsigned int nvpaths;
|
||||
unsigned int vpaths_size;
|
||||
};
|
||||
|
||||
static const char *munge (const char *);
|
||||
|
@ -105,24 +110,48 @@ munge (const char *filename)
|
|||
return buffer;
|
||||
}
|
||||
|
||||
/* If T begins with any of the partial pathnames listed in d->vpathv,
|
||||
then advance T to point beyond that pathname. */
|
||||
static const char *
|
||||
apply_vpath (struct deps *d, const char *t)
|
||||
{
|
||||
if (d->vpathv)
|
||||
{
|
||||
unsigned int i;
|
||||
for (i = 0; i < d->nvpaths; i++)
|
||||
{
|
||||
if (!strncmp (d->vpathv[i], t, d->vpathlv[i]))
|
||||
{
|
||||
const char *p = t + d->vpathlv[i];
|
||||
if (!IS_DIR_SEPARATOR (*p))
|
||||
goto not_this_one;
|
||||
|
||||
/* Do not simplify $(vpath)/../whatever. ??? Might not
|
||||
be necessary. */
|
||||
if (p[1] == '.' && p[2] == '.' && IS_DIR_SEPARATOR (p[3]))
|
||||
goto not_this_one;
|
||||
|
||||
/* found a match */
|
||||
t = t + d->vpathlv[i] + 1;
|
||||
break;
|
||||
}
|
||||
not_this_one:;
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove leading ./ in any case. */
|
||||
while (t[0] == '.' && IS_DIR_SEPARATOR (t[1]))
|
||||
t += 2;
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
/* Public routines. */
|
||||
|
||||
struct deps *
|
||||
deps_init (void)
|
||||
{
|
||||
struct deps *d = xmalloc (sizeof (struct deps));
|
||||
|
||||
/* Allocate space for the vectors only if we need it. */
|
||||
|
||||
d->targetv = 0;
|
||||
d->depv = 0;
|
||||
|
||||
d->ntargets = 0;
|
||||
d->targets_size = 0;
|
||||
d->ndeps = 0;
|
||||
d->deps_size = 0;
|
||||
|
||||
return d;
|
||||
return xcalloc (sizeof (struct deps), 1);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -144,6 +173,14 @@ deps_free (struct deps *d)
|
|||
free (d->depv);
|
||||
}
|
||||
|
||||
if (d->vpathv)
|
||||
{
|
||||
for (i = 0; i < d->nvpaths; i++)
|
||||
free ((void *) d->vpathv[i]);
|
||||
free (d->vpathv);
|
||||
free (d->vpathlv);
|
||||
}
|
||||
|
||||
free (d);
|
||||
}
|
||||
|
||||
|
@ -159,6 +196,7 @@ deps_add_target (struct deps *d, const char *t, int quote)
|
|||
d->targets_size * sizeof (const char *));
|
||||
}
|
||||
|
||||
t = apply_vpath (d, t);
|
||||
if (quote)
|
||||
t = munge (t); /* Also makes permanent copy. */
|
||||
else
|
||||
|
@ -202,7 +240,7 @@ deps_add_default_target (struct deps *d, const char *tgt)
|
|||
void
|
||||
deps_add_dep (struct deps *d, const char *t)
|
||||
{
|
||||
t = munge (t); /* Also makes permanent copy. */
|
||||
t = munge (apply_vpath (d, t)); /* Also makes permanent copy. */
|
||||
|
||||
if (d->ndeps == d->deps_size)
|
||||
{
|
||||
|
@ -212,6 +250,36 @@ deps_add_dep (struct deps *d, const char *t)
|
|||
d->depv[d->ndeps++] = t;
|
||||
}
|
||||
|
||||
void
|
||||
deps_add_vpath (struct deps *d, const char *vpath)
|
||||
{
|
||||
const char *elem, *p;
|
||||
char *copy;
|
||||
size_t len;
|
||||
|
||||
for (elem = vpath; *elem; elem = p)
|
||||
{
|
||||
for (p = elem; *p && *p != ':'; p++);
|
||||
len = p - elem;
|
||||
copy = xmalloc (len + 1);
|
||||
memcpy (copy, elem, len);
|
||||
copy[len] = '\0';
|
||||
if (*p == ':')
|
||||
p++;
|
||||
|
||||
if (d->nvpaths == d->vpaths_size)
|
||||
{
|
||||
d->vpaths_size = d->vpaths_size * 2 + 8;
|
||||
d->vpathv = xrealloc (d->vpathv,
|
||||
d->vpaths_size * sizeof (const char *));
|
||||
d->vpathlv = xrealloc (d->vpathlv, d->vpaths_size * sizeof (size_t));
|
||||
}
|
||||
d->vpathv[d->nvpaths] = copy;
|
||||
d->vpathlv[d->nvpaths] = len;
|
||||
d->nvpaths++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
deps_write (const struct deps *d, FILE *fp, unsigned int colmax)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue