Split tools unto parts for fixing run_tests to link req'd deps.
[ccan] / tools / depends.c
1 #include "talloc/talloc.h"
2 #include "tools.h"
3 #include <err.h>
4
5 static char ** __attribute__((format(printf, 2, 3)))
6 lines_from_cmd(const void *ctx, char *format, ...)
7 {
8         va_list ap;
9         char *cmd, *buffer;
10         FILE *p;
11
12         va_start(ap, format);
13         cmd = talloc_vasprintf(ctx, format, ap);
14         va_end(ap);
15
16         p = popen(cmd, "r");
17         if (!p)
18                 err(1, "Executing '%s'", cmd);
19
20         buffer = grab_fd(ctx, fileno(p));
21         if (!buffer)
22                 err(1, "Reading from '%s'", cmd);
23         pclose(p);
24
25         return split(ctx, buffer, "\n", NULL);
26 }
27
28 static char *build_info(const void *ctx, const char *dir)
29 {
30         char *file, *cfile, *cmd;
31
32         cfile = talloc_asprintf(ctx, "%s/%s", dir, "_info.c");
33         file = talloc_asprintf(cfile, "%s/%s", dir, "_info");
34         cmd = talloc_asprintf(file, "gcc " CFLAGS " -o %s %s", file, cfile);
35         if (system(cmd) != 0)
36                 errx(1, "Failed to compile %s", file);
37
38         return file;
39 }
40
41 char **get_deps(const void *ctx, const char *dir)
42 {
43         char **deps, *cmd;
44
45         cmd = talloc_asprintf(ctx, "%s depends", build_info(ctx, dir));
46         deps = lines_from_cmd(cmd, cmd);
47         if (!deps)
48                 err(1, "Could not run '%s'", cmd);
49         return deps;
50 }
51