1 #include "talloc/talloc.h"
2 #include "string/string.h"
7 static char ** __attribute__((format(printf, 3, 4)))
8 lines_from_cmd(const void *ctx, unsigned int *num, char *format, ...)
15 cmd = talloc_vasprintf(ctx, format, ap);
20 err(1, "Executing '%s'", cmd);
22 buffer = grab_fd(ctx, fileno(p));
24 err(1, "Reading from '%s'", cmd);
27 return strsplit(ctx, buffer, "\n", num);
30 static char **get_one_deps(const void *ctx, const char *dir, unsigned int *num)
34 cmd = talloc_asprintf(ctx, "%s/_info depends", dir);
35 deps = lines_from_cmd(cmd, num, "%s", cmd);
37 err(1, "Could not run '%s'", cmd);
41 static bool have_dep(char **deps, unsigned int num, const char *dep)
45 for (i = 0; i < num; i++)
46 if (streq(deps[i], dep))
51 /* Gets all the dependencies, recursively. */
52 char **get_deps(const void *ctx, const char *dir)
57 deps = get_one_deps(ctx, dir, &num);
58 for (i = 0; i < num; i++) {
60 unsigned int j, newnum;
62 if (!strstarts(deps[i], "ccan/"))
65 newdeps = get_one_deps(ctx, deps[i], &newnum);
67 /* Should be short, so brute-force out dups. */
68 for (j = 0; j < newnum; j++) {
69 if (have_dep(deps, num, newdeps[j]))
72 deps = talloc_realloc(NULL, deps, char *, num + 2);
73 deps[num++] = newdeps[j];