/* 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;
}
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;
}
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;
}
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;
}
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. */