]> git.ozlabs.org Git - ccan/blobdiff - tools/depends.c
tal: simplify.
[ccan] / tools / depends.c
index c6c775448454c7513c8efd54c0a0633293629a85..a7c353c27d04571473808b67692219cc46cf2b12 100644 (file)
@@ -4,11 +4,11 @@
 #include <ccan/str_talloc/str_talloc.h>
 #include <ccan/read_write_all/read_write_all.h>
 #include <ccan/compiler/compiler.h>
+#include <ccan/err/err.h>
 #include "tools.h"
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
-#include <err.h>
 #include <stdbool.h>
 #include <unistd.h>
 #include <errno.h>
@@ -40,7 +40,7 @@ lines_from_cmd(const void *ctx, const char *format, ...)
  * temp_file helps here. */
 char *compile_info(const void *ctx, const char *dir)
 {
-       char *info_c_file, *info, *ccandir, *compiled, *output;
+       char *info_c_file, *info, *compiled, *output;
        size_t len;
        int fd;
 
@@ -59,12 +59,8 @@ char *compile_info(const void *ctx, const char *dir)
        if (close(fd) != 0)
                return NULL;
 
-       ccandir = talloc_dirname(ctx, dir);
-       if (strrchr(ccandir, '/'))
-               *strrchr(ccandir, '/') = '\0';
-
        compiled = temp_file(ctx, "", "info");
-       if (compile_and_link(ctx, info_c_file, ccandir, "",
+       if (compile_and_link(ctx, info_c_file, find_ccan_dir(dir), "",
                             CCAN_COMPILER, CCAN_CFLAGS " -I.", "",
                             compiled, &output))
                return compiled;
@@ -209,8 +205,7 @@ get_all_deps(const void *ctx, const char *dir, const char *style,
                        continue;
 
                subdir = talloc_asprintf(ctx, "%s/%s",
-                                        talloc_dirname(ctx, dir),
-                                        deps[i] + strlen("ccan/"));
+                                        find_ccan_dir(dir), deps[i]);
                newdeps = get_one(ctx, subdir, "depends", get_info);
 
                /* Should be short, so brute-force out dups. */
@@ -244,7 +239,24 @@ static char **get_one_libs(const void *ctx, const char *dir,
        return lines;
 }
 
-char **get_libs(const void *ctx, const char *dir, bool recurse,
+/* O(n^2) but n is small. */
+static char **add_deps(char **deps1, char **deps2)
+{
+       unsigned int i, len;
+
+       len = talloc_array_length(deps1);
+
+       for (i = 0; deps2[i]; i++) {
+               if (have_dep(deps1, deps2[i]))
+                       continue;
+               deps1 = talloc_realloc(NULL, deps1, char *, len + 1);
+               deps1[len-1] = talloc_steal(deps1, deps2[i]);
+               deps1[len++] = NULL;
+       }
+       return deps1;
+}
+
+char **get_libs(const void *ctx, const char *dir, const char *style,
                char *(*get_info)(const void *ctx, const char *dir))
 {
        char **deps, **libs;
@@ -253,8 +265,13 @@ char **get_libs(const void *ctx, const char *dir, bool recurse,
        libs = get_one_libs(ctx, dir, get_info);
        len = talloc_array_length(libs);
 
-       if (recurse) {
-               deps = get_deps(ctx, dir, "depends", true, get_info);
+       if (style) {
+               deps = get_deps(ctx, dir, style, true, get_info);
+               if (streq(style, "testdepends"))
+                       deps = add_deps(deps,
+                                       get_deps(ctx, dir, "depends", true,
+                                                get_info));
+
                for (i = 0; deps[i]; i++) {
                        char **newlibs, *subdir;
                        size_t newlen;
@@ -263,8 +280,7 @@ char **get_libs(const void *ctx, const char *dir, bool recurse,
                                continue;
 
                        subdir = talloc_asprintf(ctx, "%s/%s",
-                                                talloc_dirname(ctx, dir),
-                                                deps[i] + strlen("ccan/"));
+                                                find_ccan_dir(dir), deps[i]);
 
                        newlibs = get_one_libs(ctx, subdir, get_info);
                        newlen = talloc_array_length(newlibs);