depends.c 1.1 KB

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