X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;ds=sidebyside;f=tools%2Fdepends.c;h=a7c353c27d04571473808b67692219cc46cf2b12;hb=ca6991d861a02d1da8d51f71607a4d9d8e145850;hp=c6c775448454c7513c8efd54c0a0633293629a85;hpb=1842f55199e6a5da273ca21b6fbe8afa6ecdfe11;p=ccan diff --git a/tools/depends.c b/tools/depends.c index c6c77544..a7c353c2 100644 --- a/tools/depends.c +++ b/tools/depends.c @@ -4,11 +4,11 @@ #include #include #include +#include #include "tools.h" #include #include #include -#include #include #include #include @@ -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);