summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/ccanlint/tests/examples_compile.c7
-rw-r--r--tools/ccanlint/tests/module_links.c8
-rw-r--r--tools/ccanlint/tests/tests_compile.c8
-rw-r--r--tools/depends.c58
-rw-r--r--tools/tools.h4
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. */