static void add_dep(struct manifest ***deps, const char *modname) { unsigned int i; struct manifest *m; char *errstr; if (have_mod(*deps, modname)) return; m = get_manifest(*deps, tal_fmt(*deps, "%s/ccan/%s", ccan_dir, modname)); errstr = build_submodule(m, cflags, COMPILE_NORMAL); if (errstr) errx(1, "%s", errstr); add_mod(deps, m); /* Get that modules depends as well... */ assert(!safe_mode); if (m->info_file) { char **infodeps; infodeps = get_deps(m, m->dir, "depends", false, get_or_compile_info); for (i = 0; infodeps[i]; i++) { if (strstarts(infodeps[i], "ccan/")) add_dep(deps, infodeps[i] + strlen("ccan/")); } } }
static char *example_obj_list(struct manifest *m, struct ccan_file *f) { struct manifest **deps = talloc_array(f, struct manifest *, 0); char **lines, *list; unsigned int i; /* This one for a start. */ add_dep(&deps, m->basename); /* Other modules implied by includes. */ for (lines = get_ccan_file_lines(f); *lines; lines++) { unsigned preflen = strspn(*lines, " \t"); if (strstarts(*lines + preflen, "#include <ccan/")) { char *modname; modname = talloc_strdup(f, *lines + preflen + strlen("#include <ccan/")); modname[strcspn(modname, "/")] = '\0'; if (!have_mod(deps, modname)) add_dep(&deps, modname); } } list = talloc_strdup(f, ""); for (i = 0; i < talloc_get_size(deps) / sizeof(*deps); i++) { if (deps[i]->compiled[COMPILE_NORMAL]) list = talloc_asprintf_append(list, " %s", deps[i]->compiled [COMPILE_NORMAL]); } return list; }