From fa7a78f9d3553292b5088b1e7a89d63a2393ab2c Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 10 Sep 2012 15:44:00 +0930 Subject: [PATCH] ccanlint: recurse to get -l options. If a dependent module needs -l options, we don't notice. Fix that, now we have one. --- tools/ccanlint/tests/examples_compile.c | 7 ++- tools/ccanlint/tests/module_links.c | 8 ++-- tools/ccanlint/tests/tests_compile.c | 8 ++-- tools/depends.c | 58 +++++++++++++++++++------ tools/tools.h | 4 +- 5 files changed, 58 insertions(+), 27 deletions(-) diff --git a/tools/ccanlint/tests/examples_compile.c b/tools/ccanlint/tests/examples_compile.c index 7fb60845..760711f1 100644 --- a/tools/ccanlint/tests/examples_compile.c +++ b/tools/ccanlint/tests/examples_compile.c @@ -107,13 +107,12 @@ static char *example_obj_list(struct manifest *m, struct ccan_file *f) /* FIXME: Test with reduced features! */ static char *lib_list(const struct manifest *m) { - unsigned int i, num; + unsigned int i; char **libs; char *ret = talloc_strdup(m, ""); - libs = get_libs(m, m->dir, &num, - &m->info_file->compiled[COMPILE_NORMAL]); - 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]); return ret; } diff --git a/tools/ccanlint/tests/module_links.c b/tools/ccanlint/tests/module_links.c index 2dda6429..79aa7d1a 100644 --- a/tools/ccanlint/tests/module_links.c +++ b/tools/ccanlint/tests/module_links.c @@ -43,12 +43,12 @@ static char *obj_list(const struct manifest *m) static char *lib_list(const struct manifest *m) { - unsigned int i, num; - char **libs = get_libs(m, ".", - &num, &m->info_file->compiled[COMPILE_NORMAL]); + unsigned int i; + char **libs; 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]); return ret; } diff --git a/tools/ccanlint/tests/tests_compile.c b/tools/ccanlint/tests/tests_compile.c index 911f310c..733aebdb 100644 --- a/tools/ccanlint/tests/tests_compile.c +++ b/tools/ccanlint/tests/tests_compile.c @@ -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) { - unsigned int i, num; - char **libs = get_libs(m, m->dir, &num, - &m->info_file->compiled[ctype]); + unsigned int i; + char **libs; 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]); return ret; } diff --git a/tools/depends.c b/tools/depends.c index 6958c37b..19229661 100644 --- a/tools/depends.c +++ b/tools/depends.c @@ -214,23 +214,55 @@ get_all_deps(const void *ctx, const char *dir, return deps; } -char **get_libs(const void *ctx, const char *dir, - unsigned int *num, char **infofile) +/* Can return NULL: _info may not support 'libs'. */ +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) { - *infofile = compile_info(ctx, dir); - if (!*infofile) - errx(1, "Could not compile _info for '%s'", dir); + if (recurse) { + deps = get_deps(ctx, dir, true, get_info); + for (i = 0; deps[i]; i++) { + 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); - libs = lines_from_cmd(cmd, "%s", cmd); - if (!libs) - err(1, "Could not run '%s'", cmd); - /* FIXME: Do we need num arg? */ - *num = talloc_array_length(libs) - 1; + /* Append NULL entry. */ + libs = talloc_realloc(ctx, libs, char *, len + 1); + libs[len] = NULL; return libs; } diff --git a/tools/tools.h b/tools/tools.h index e78d1390..56e9de61 100644 --- a/tools/tools.h +++ b/tools/tools.h @@ -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); /* This also needs to compile the info file. */ -char **get_libs(const void *ctx, const char *dir, - unsigned int *num, char **infofile); +char **get_libs(const void *ctx, const char *dir, bool recurse, + char *(*get_info)(const void *ctx, const char *dir)); /* From tools.c */ /* If set, print all commands run, all output they give and exit status. */ -- 2.39.2