#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>
* 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;
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;
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. */
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;
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;
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);