Browse Source

Make depends build the _info files (easier for Dinesh's work)

Rusty Russell 17 years ago
parent
commit
a13257dd9b
3 changed files with 28 additions and 6 deletions
  1. 0 3
      Makefile
  2. 2 1
      tools/ccan_depends.c
  3. 26 2
      tools/depends.c

+ 0 - 3
Makefile

@@ -14,11 +14,8 @@ libccan.a: $(ALL_LIBS)
 check: $(ALL_DIRS:%=test-%)
 
 distclean: clean
-	rm -f */_info
 	rm -f $(ALL_DEPENDS)
 
-$(ALL_DEPENDS): $(ALL_DIRS:=/_info)
-
 $(ALL_DEPENDS): %/.depends: tools/ccan_depends
 	tools/ccan_depends $* > $@ || ( rm -f $@; exit 1 )
 

+ 2 - 1
tools/ccan_depends.c

@@ -3,6 +3,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include "string/string.h"
+#include "talloc/talloc.h"
 
 int main(int argc, char *argv[])
 {
@@ -13,7 +14,7 @@ int main(int argc, char *argv[])
 		errx(1, "Usage: ccan_depends <dir>\n"
 		        "Spits out all the ccan dependencies (recursively)");
 
-	deps = get_deps(NULL, argv[1]);
+	deps = get_deps(talloc_autofree_context(), argv[1]);
 	for (i = 0; deps[i]; i++)
 		if (strstarts(deps[i], "ccan/"))
 			printf("%s\n", deps[i]);

+ 26 - 2
tools/depends.c

@@ -3,6 +3,7 @@
 #include "tools.h"
 #include <err.h>
 #include <stdbool.h>
+#include <unistd.h>
 
 static char ** __attribute__((format(printf, 3, 4)))
 lines_from_cmd(const void *ctx, unsigned int *num, char *format, ...)
@@ -27,11 +28,34 @@ lines_from_cmd(const void *ctx, unsigned int *num, char *format, ...)
 	return strsplit(ctx, buffer, "\n", num);
 }
 
+static int unlink_info(char *infofile)
+{
+	unlink(infofile);
+	return 0;
+}
+
+/* Be careful about trying to compile over running programs (parallel make) */
+static char *compile_info(const void *ctx, const char *dir)
+{
+	char *infofile = talloc_asprintf(ctx, "%s/_info.%u", dir, getpid());
+	char *cmd = talloc_asprintf(ctx, "cc " CFLAGS " -o %s %s/_info.c",
+				    infofile, dir);
+	talloc_set_destructor(infofile, unlink_info);
+	if (system(cmd) != 0)
+		return NULL;
+
+	return infofile;
+}
+
 static char **get_one_deps(const void *ctx, const char *dir, unsigned int *num)
 {
-	char **deps, *cmd;
+	char **deps, *cmd, *infofile;
+
+	infofile = compile_info(ctx, dir);
+	if (!infofile)
+		errx(1, "Could not compile _info for '%s'", dir);
 
-	cmd = talloc_asprintf(ctx, "%s/_info depends", dir);
+	cmd = talloc_asprintf(ctx, "%s depends", infofile);
 	deps = lines_from_cmd(cmd, num, "%s", cmd);
 	if (!deps)
 		err(1, "Could not run '%s'", cmd);