Commit fa7a78f9 authored by Rusty Russell's avatar Rusty Russell

ccanlint: recurse to get -l options.

If a dependent module needs -l options, we don't notice.  Fix that, now
we have one.
parent e2a53df3
...@@ -107,13 +107,12 @@ static char *example_obj_list(struct manifest *m, struct ccan_file *f) ...@@ -107,13 +107,12 @@ static char *example_obj_list(struct manifest *m, struct ccan_file *f)
/* FIXME: Test with reduced features! */ /* FIXME: Test with reduced features! */
static char *lib_list(const struct manifest *m) static char *lib_list(const struct manifest *m)
{ {
unsigned int i, num; unsigned int i;
char **libs; char **libs;
char *ret = talloc_strdup(m, ""); char *ret = talloc_strdup(m, "");
libs = get_libs(m, m->dir, &num, libs = get_libs(m, m->dir, true, get_or_compile_info);
&m->info_file->compiled[COMPILE_NORMAL]); for (i = 0; libs[i]; i++)
for (i = 0; i < num; i++)
ret = talloc_asprintf_append(ret, "-l%s ", libs[i]); ret = talloc_asprintf_append(ret, "-l%s ", libs[i]);
return ret; return ret;
} }
......
...@@ -43,12 +43,12 @@ static char *obj_list(const struct manifest *m) ...@@ -43,12 +43,12 @@ static char *obj_list(const struct manifest *m)
static char *lib_list(const struct manifest *m) static char *lib_list(const struct manifest *m)
{ {
unsigned int i, num; unsigned int i;
char **libs = get_libs(m, ".", char **libs;
&num, &m->info_file->compiled[COMPILE_NORMAL]);
char *ret = talloc_strdup(m, ""); char *ret = talloc_strdup(m, "");
for (i = 0; i < num; i++) libs = get_libs(m, m->dir, true, get_or_compile_info);
for (i = 0; libs[i]; i++)
ret = talloc_asprintf_append(ret, "-l%s ", libs[i]); ret = talloc_asprintf_append(ret, "-l%s ", libs[i]);
return ret; return ret;
} }
......
...@@ -54,12 +54,12 @@ char *test_obj_list(const struct manifest *m, bool link_with_module, ...@@ -54,12 +54,12 @@ char *test_obj_list(const struct manifest *m, bool link_with_module,
char *lib_list(const struct manifest *m, enum compile_type ctype) char *lib_list(const struct manifest *m, enum compile_type ctype)
{ {
unsigned int i, num; unsigned int i;
char **libs = get_libs(m, m->dir, &num, char **libs;
&m->info_file->compiled[ctype]);
char *ret = talloc_strdup(m, ""); char *ret = talloc_strdup(m, "");
for (i = 0; i < num; i++) libs = get_libs(m, m->dir, true, get_or_compile_info);
for (i = 0; libs[i]; i++)
ret = talloc_asprintf_append(ret, "-l%s ", libs[i]); ret = talloc_asprintf_append(ret, "-l%s ", libs[i]);
return ret; return ret;
} }
......
...@@ -214,23 +214,55 @@ get_all_deps(const void *ctx, const char *dir, ...@@ -214,23 +214,55 @@ get_all_deps(const void *ctx, const char *dir,
return deps; return deps;
} }
char **get_libs(const void *ctx, const char *dir, /* Can return NULL: _info may not support 'libs'. */
unsigned int *num, char **infofile) static char **get_one_libs(const void *ctx, const char *dir,
char *(*get_info)(const void *ctx, const char *dir))
{
char *cmd, **lines;
cmd = talloc_asprintf(ctx, "%s libs", get_info(ctx, dir));
lines = lines_from_cmd(cmd, "%s", cmd);
/* Strip final NULL. */
if (lines)
lines = talloc_realloc(NULL, lines, char *,
talloc_array_length(lines)-1);
return lines;
}
char **get_libs(const void *ctx, const char *dir, bool recurse,
char *(*get_info)(const void *ctx, const char *dir))
{ {
char **libs, *cmd; char **deps, **libs;
unsigned int i, len;
libs = get_one_libs(ctx, dir, get_info);
len = talloc_array_length(libs);
if (!*infofile) { if (recurse) {
*infofile = compile_info(ctx, dir); deps = get_deps(ctx, dir, true, get_info);
if (!*infofile) for (i = 0; deps[i]; i++) {
errx(1, "Could not compile _info for '%s'", dir); char **newlibs, *subdir;
size_t newlen;
if (!strstarts(deps[i], "ccan/"))
continue;
subdir = talloc_asprintf(ctx, "%s/%s",
talloc_dirname(ctx, dir),
deps[i] + strlen("ccan/"));
newlibs = get_one_libs(ctx, subdir, get_info);
newlen = talloc_array_length(newlibs);
libs = talloc_realloc(ctx, libs, char *, len + newlen);
memcpy(&libs[len], newlibs,
sizeof(newlibs[0])*newlen);
len += newlen;
}
} }
cmd = talloc_asprintf(ctx, "%s libs", *infofile); /* Append NULL entry. */
libs = lines_from_cmd(cmd, "%s", cmd); libs = talloc_realloc(ctx, libs, char *, len + 1);
if (!libs) libs[len] = NULL;
err(1, "Could not run '%s'", cmd);
/* FIXME: Do we need num arg? */
*num = talloc_array_length(libs) - 1;
return libs; return libs;
} }
......
...@@ -30,8 +30,8 @@ char **get_deps(const void *ctx, const char *dir, bool recurse, ...@@ -30,8 +30,8 @@ char **get_deps(const void *ctx, const char *dir, bool recurse,
char **get_safe_ccan_deps(const void *ctx, const char *dir, bool recurse); char **get_safe_ccan_deps(const void *ctx, const char *dir, bool recurse);
/* This also needs to compile the info file. */ /* This also needs to compile the info file. */
char **get_libs(const void *ctx, const char *dir, char **get_libs(const void *ctx, const char *dir, bool recurse,
unsigned int *num, char **infofile); char *(*get_info)(const void *ctx, const char *dir));
/* From tools.c */ /* From tools.c */
/* If set, print all commands run, all output they give and exit status. */ /* If set, print all commands run, all output they give and exit status. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment