From: Rusty Russell Date: Mon, 1 Feb 2010 23:05:17 +0000 (+1030) Subject: ccanlint: fix directory issues properly. X-Git-Url: http://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=747a69435d9f83c0968d9689c4951bc0233ffc5e ccanlint: fix directory issues properly. --- diff --git a/tools/ccan_depends.c b/tools/ccan_depends.c index 42efd955..b055e44e 100644 --- a/tools/ccan_depends.c +++ b/tools/ccan_depends.c @@ -12,7 +12,6 @@ int main(int argc, char *argv[]) bool compile = false; bool recurse = true; bool ccan = true; - char *dirname, *basename; if (argv[1] && streq(argv[1], "--direct")) { argv++; @@ -37,15 +36,12 @@ int main(int argc, char *argv[]) if (!ccan && !compile) errx(1, "--non-ccan needs --compile"); - dirname = talloc_dirname(NULL, argv[1]); - basename = talloc_basename(NULL, argv[1]); - if (compile) - deps = get_deps(talloc_autofree_context(), - dirname, basename, recurse, NULL); + deps = get_deps(talloc_autofree_context(), argv[1], + recurse, NULL); else deps = get_safe_ccan_deps(talloc_autofree_context(), - dirname, basename, recurse, NULL); + argv[1], recurse, NULL); for (i = 0; deps[i]; i++) if (strstarts(deps[i], "ccan/") == ccan) diff --git a/tools/ccanlint/ccanlint.c b/tools/ccanlint/ccanlint.c index 968f655e..064e40d8 100644 --- a/tools/ccanlint/ccanlint.c +++ b/tools/ccanlint/ccanlint.c @@ -255,8 +255,6 @@ int main(int argc, char *argv[]) prefix = talloc_append_string(talloc_basename(NULL, optarg), ": "); - if (chdir(optarg) != 0) - err(1, "Changing into directory '%s'", optarg); break; case 's': summary = true; diff --git a/tools/ccanlint/ccanlint.h b/tools/ccanlint/ccanlint.h index 99b0eb7c..876fc64c 100644 --- a/tools/ccanlint/ccanlint.h +++ b/tools/ccanlint/ccanlint.h @@ -12,6 +12,7 @@ #define REGISTER_TEST(name, ...) struct manifest { + char *dir; /* The module name, ie. final element of dir name */ char *basename; struct ccan_file *info_file; @@ -113,8 +114,12 @@ struct line_info { struct ccan_file { struct list_node list; + /* Name (usually, within m->dir). */ char *name; + /* Full path name. */ + char *fullname; + /* Pristine version of the original file. * Use get_ccan_file_lines to fill this. */ const char *contents; @@ -132,7 +137,7 @@ struct ccan_file { }; /* A new ccan_file, with the given name (talloc_steal onto returned value). */ -struct ccan_file *new_ccan_file(const void *ctx, char *name); +struct ccan_file *new_ccan_file(const void *ctx, const char *dir, char *name); /* Use this rather than accessing f->lines directly: loads on demand. */ char **get_ccan_file_lines(struct ccan_file *f); @@ -179,4 +184,7 @@ struct dependent { /* Are we happy to compile stuff, or just non-intrusive tests? */ extern bool safe_mode; +/* Where is the ccan dir? Available after first manifest. */ +extern const char *ccan_dir; + #endif /* CCAN_LINT_H */ diff --git a/tools/ccanlint/compulsory_tests/build.c b/tools/ccanlint/compulsory_tests/build.c index 1b3d8789..e3f96d7d 100644 --- a/tools/ccanlint/compulsory_tests/build.c +++ b/tools/ccanlint/compulsory_tests/build.c @@ -44,7 +44,7 @@ static void *do_build(struct manifest *m) } filename = link_objects(m, obj_list(m), &err); if (filename) { - char *realname = talloc_asprintf(m, "../%s.o", m->basename); + char *realname = talloc_asprintf(m, "%s.o", m->dir); /* We leave this object file around, all built. */ if (rename(filename, realname) != 0) return talloc_asprintf(m, "Failed to rename %s to %s", diff --git a/tools/ccanlint/compulsory_tests/build_objs.c b/tools/ccanlint/compulsory_tests/build_objs.c index 2f189e85..4c0b6bba 100644 --- a/tools/ccanlint/compulsory_tests/build_objs.c +++ b/tools/ccanlint/compulsory_tests/build_objs.c @@ -28,11 +28,12 @@ static void *check_objs_build(struct manifest *m) list_for_each(&m->c_files, i, list) { char *err; + char *fullfile = talloc_asprintf(m, "%s/%s", m->dir, i->name); /* One point for each obj file. */ build_objs.total_score++; - i->compiled = compile_object(m, i->name, &err); + i->compiled = compile_object(m, fullfile, ccan_dir, &err); if (!i->compiled) { if (report) report = talloc_append_string(report, err); diff --git a/tools/ccanlint/compulsory_tests/check_build.c b/tools/ccanlint/compulsory_tests/check_build.c index eb968e11..21189645 100644 --- a/tools/ccanlint/compulsory_tests/check_build.c +++ b/tools/ccanlint/compulsory_tests/check_build.c @@ -36,7 +36,7 @@ static char *obj_list(const struct manifest *m) static char *lib_list(const struct manifest *m) { unsigned int i, num; - char **libs = get_libs(m, ".", ".", &num, &m->info_file->compiled); + char **libs = get_libs(m, ".", &num, &m->info_file->compiled); char *ret = talloc_strdup(m, ""); for (i = 0; i < num; i++) @@ -70,7 +70,8 @@ static void *check_use_build(struct manifest *m) } close(fd); - if (!compile_and_link(m, tmpfile, obj_list(m), "", lib_list(m), &err)) + if (!compile_and_link(m, tmpfile, ccan_dir, obj_list(m), "", + lib_list(m), &err)) return err; return NULL; } diff --git a/tools/ccanlint/compulsory_tests/check_depends_built.c b/tools/ccanlint/compulsory_tests/check_depends_built.c index b3332a9f..d902a985 100644 --- a/tools/ccanlint/compulsory_tests/check_depends_built.c +++ b/tools/ccanlint/compulsory_tests/check_depends_built.c @@ -44,16 +44,16 @@ static void *check_depends_built(struct manifest *m) list_for_each(&m->dep_dirs, i, list) { char *objfile; - if (!expect_obj_file(i->name)) + if (!expect_obj_file(i->fullname)) continue; - objfile = talloc_asprintf(m, "%s.o", i->name); + objfile = talloc_asprintf(m, "%s.o", i->fullname); if (stat(objfile, &st) != 0) { report = talloc_asprintf_append(report, "object file %s\n", objfile); } else { - struct ccan_file *f = new_ccan_file(m, objfile); + struct ccan_file *f = new_ccan_file(m, "", objfile); list_add_tail(&m->dep_objs, &f->list); } @@ -62,10 +62,12 @@ static void *check_depends_built(struct manifest *m) /* We may need libtap for testing, unless we're "tap" */ if (!streq(m->basename, "tap") && (!list_empty(&m->run_tests) || !list_empty(&m->api_tests))) { - if (stat("../tap.o", &st) != 0) { + char *tapobj = talloc_asprintf(m, "%s/ccan/tap.o", ccan_dir); + if (stat(tapobj, &st) != 0) { report = talloc_asprintf_append(report, - "object file ../tap.o" - " (for tests)\n"); + "object file %s" + " (for tests)\n", + tapobj); } } diff --git a/tools/ccanlint/compulsory_tests/check_depends_exist.c b/tools/ccanlint/compulsory_tests/check_depends_exist.c index 2ac60a2a..656901e7 100644 --- a/tools/ccanlint/compulsory_tests/check_depends_exist.c +++ b/tools/ccanlint/compulsory_tests/check_depends_exist.c @@ -20,7 +20,7 @@ static char *add_dep(char *sofar, struct manifest *m, const char *dep) struct stat st; struct ccan_file *f; - dir = talloc_asprintf(m, "../%s", dep); + dir = talloc_asprintf(m, "%s/%s", ccan_dir, dep); if (stat(dir, &st) != 0) { return talloc_asprintf_append(sofar, "ccan/%s: expected it in" @@ -28,7 +28,7 @@ static char *add_dep(char *sofar, struct manifest *m, const char *dep) dep, dir); } - f = new_ccan_file(m, dir); + f = new_ccan_file(m, "", dir); list_add_tail(&m->dep_dirs, &f->list); return sofar; } @@ -38,19 +38,21 @@ static void *check_depends_exist(struct manifest *m) unsigned int i; char *report = NULL; char **deps; + char *updir = talloc_strdup(m, m->dir); + + *strrchr(updir, '/') = '\0'; if (safe_mode) - deps = get_safe_ccan_deps(m, "..", m->basename, true, + deps = get_safe_ccan_deps(m, m->dir, true, &m->info_file->compiled); else - deps = get_deps(m, "..", m->basename, true, - &m->info_file->compiled); + deps = get_deps(m, m->dir, true, &m->info_file->compiled); for (i = 0; deps[i]; i++) { if (!strstarts(deps[i], "ccan/")) continue; - report = add_dep(report, m, deps[i] + strlen("ccan/")); + report = add_dep(report, m, deps[i]); } return report; } diff --git a/tools/ccanlint/compulsory_tests/check_includes_build.c b/tools/ccanlint/compulsory_tests/check_includes_build.c index 7e0ab945..b61d0baa 100644 --- a/tools/ccanlint/compulsory_tests/check_includes_build.c +++ b/tools/ccanlint/compulsory_tests/check_includes_build.c @@ -43,7 +43,7 @@ static void *check_includes_build(struct manifest *m) } close(fd); - if (compile_object(m, tmpfile, &err)) + if (compile_object(m, tmpfile, ccan_dir, &err)) return NULL; return err; } diff --git a/tools/ccanlint/compulsory_tests/compile_test_helpers.c b/tools/ccanlint/compulsory_tests/compile_test_helpers.c index de8d4632..fc88b1b0 100644 --- a/tools/ccanlint/compulsory_tests/compile_test_helpers.c +++ b/tools/ccanlint/compulsory_tests/compile_test_helpers.c @@ -24,8 +24,9 @@ static const char *can_build(struct manifest *m) static char *compile(struct manifest *m, struct ccan_file *cfile) { char *err; + char *fullfile = talloc_asprintf(m, "%s/%s", m->dir, cfile->name); - cfile->compiled = compile_object(m, cfile->name, &err); + cfile->compiled = compile_object(m, fullfile, ccan_dir, &err); if (cfile->compiled) return NULL; return err; diff --git a/tools/ccanlint/compulsory_tests/compile_tests.c b/tools/ccanlint/compulsory_tests/compile_tests.c index 57c257a2..6444fc17 100644 --- a/tools/ccanlint/compulsory_tests/compile_tests.c +++ b/tools/ccanlint/compulsory_tests/compile_tests.c @@ -28,7 +28,7 @@ static char *obj_list(const struct manifest *m, bool link_with_module) /* We expect to be linked with tap, unless that's us. */ if (!streq(m->basename, "tap")) - list = talloc_strdup(m, "../tap.o"); + list = talloc_asprintf(m, "%s/ccan/tap.o", ccan_dir); else list = talloc_strdup(m, ""); @@ -37,7 +37,7 @@ static char *obj_list(const struct manifest *m, bool link_with_module) list = talloc_asprintf_append(list, " %s", i->compiled); if (link_with_module) - list = talloc_asprintf_append(list, " ../%s.o", m->basename); + list = talloc_asprintf_append(list, " %s.o", m->dir); /* Other ccan modules. */ list_for_each(&m->dep_objs, i, list) @@ -49,7 +49,7 @@ static char *obj_list(const struct manifest *m, bool link_with_module) static char *lib_list(const struct manifest *m) { unsigned int i, num; - char **libs = get_libs(m, ".", ".", &num, &m->info_file->compiled); + char **libs = get_libs(m, ".", &num, &m->info_file->compiled); char *ret = talloc_strdup(m, ""); for (i = 0; i < num; i++) @@ -63,7 +63,7 @@ static char *compile(const void *ctx, { char *errmsg; - file->compiled = compile_and_link(ctx, file->name, + file->compiled = compile_and_link(ctx, file->fullname, ccan_dir, obj_list(m, link_with_module), fail ? "-DFAIL" : "", lib_list(m), &errmsg); diff --git a/tools/ccanlint/compulsory_tests/has_tests.c b/tools/ccanlint/compulsory_tests/has_tests.c index cd31d222..46998d58 100644 --- a/tools/ccanlint/compulsory_tests/has_tests.c +++ b/tools/ccanlint/compulsory_tests/has_tests.c @@ -15,10 +15,11 @@ static char test_is_not_dir[] = "test is not a directory"; static void *check_has_tests(struct manifest *m) { struct stat st; + char *test_dir = talloc_asprintf(m, "%s/test", m->dir); - if (lstat("test", &st) != 0) { + if (lstat(test_dir, &st) != 0) { if (errno != ENOENT) - err(1, "statting test/"); + err(1, "statting %s", test_dir); return "You have no test directory"; } diff --git a/tools/ccanlint/compulsory_tests/run_tests.c b/tools/ccanlint/compulsory_tests/run_tests.c index b3c1188d..763b54a3 100644 --- a/tools/ccanlint/compulsory_tests/run_tests.c +++ b/tools/ccanlint/compulsory_tests/run_tests.c @@ -33,6 +33,15 @@ static void *do_run_tests(struct manifest *m) struct run_tests_result *res; struct ccan_file *i; char *cmdout; + char *olddir; + + /* We run tests in the module directory, so any paths + * referenced can all be module-local. */ + olddir = talloc_getcwd(m); + if (!olddir) + err(1, "Could not save cwd"); + if (chdir(m->dir) != 0) + err(1, "Could not chdir to %s", m->dir); list_head_init(list); @@ -65,6 +74,9 @@ static void *do_run_tests(struct manifest *m) list = NULL; } + if (chdir(olddir) != 0) + err(1, "Could not chdir to %s", olddir); + return list; } diff --git a/tools/ccanlint/file_analysis.c b/tools/ccanlint/file_analysis.c index f2ee5d74..c03931d8 100644 --- a/tools/ccanlint/file_analysis.c +++ b/tools/ccanlint/file_analysis.c @@ -15,6 +15,8 @@ #include #include +const char *ccan_dir; + char **get_ccan_file_lines(struct ccan_file *f) { if (!f->lines) @@ -32,7 +34,7 @@ struct list_head *get_ccan_file_docs(struct ccan_file *f) return f->doc_sections; } -struct ccan_file *new_ccan_file(const void *ctx, char *name) +struct ccan_file *new_ccan_file(const void *ctx, const char *dir, char *name) { struct ccan_file *f; @@ -42,6 +44,7 @@ struct ccan_file *new_ccan_file(const void *ctx, char *name) f->doc_sections = NULL; f->compiled = NULL; f->name = talloc_steal(f, name); + f->fullname = talloc_asprintf(f, "%s/%s", dir, f->name); return f; } @@ -66,8 +69,9 @@ static void add_files(struct manifest *m, const char *dir) if (ent->d_name[0] == '.') continue; - f = new_ccan_file(m, talloc_asprintf(m, "%s%s", - dir, ent->d_name)); + f = new_ccan_file(m, m->dir, + talloc_asprintf(m, "%s%s", + dir, ent->d_name)); if (lstat(f->name, &st) != 0) err(1, "lstat %s", f->name); @@ -177,18 +181,29 @@ struct manifest *get_manifest(const void *ctx, const char *dir) if (chdir(dir) != 0) err(1, "Failed to chdir to %s", dir); - m->basename = talloc_getcwd(m); - if (!m->basename) + m->dir = talloc_getcwd(m); + if (!m->dir) err(1, "Getting current directory"); - len = strlen(m->basename); - while (len && m->basename[len-1] == '/') - m->basename[--len] = '\0'; - m->basename = strrchr(m->basename, '/'); + len = strlen(m->dir); + while (len && m->dir[len-1] == '/') + m->dir[--len] = '\0'; + + m->basename = strrchr(m->dir, '/'); if (!m->basename) errx(1, "I don't expect to be run from the root directory"); m->basename++; + /* We expect the ccan dir to be two levels above module dir. */ + if (!ccan_dir) { + char *p; + ccan_dir = talloc_strdup(NULL, m->dir); + p = strrchr(ccan_dir, '/'); + *p = '\0'; + p = strrchr(ccan_dir, '/'); + *p = '\0'; + } + add_files(m, ""); if (chdir(olddir) != 0) diff --git a/tools/ccanlint/tests/run_tests_valgrind.c b/tools/ccanlint/tests/run_tests_valgrind.c index f4ab8f52..4f32ed6c 100644 --- a/tools/ccanlint/tests/run_tests_valgrind.c +++ b/tools/ccanlint/tests/run_tests_valgrind.c @@ -36,6 +36,15 @@ static void *do_run_tests_vg(struct manifest *m) struct run_tests_result *res; struct ccan_file *i; char *cmdout; + char *olddir; + + /* We run tests in the module directory, so any paths + * referenced can all be module-local. */ + olddir = talloc_getcwd(m); + if (!olddir) + err(1, "Could not save cwd"); + if (chdir(m->dir) != 0) + err(1, "Could not chdir to %s", m->dir); list_head_init(list); @@ -68,6 +77,9 @@ static void *do_run_tests_vg(struct manifest *m) list = NULL; } + if (chdir(olddir) != 0) + err(1, "Could not chdir to %s", olddir); + return list; } diff --git a/tools/compile.c b/tools/compile.c index 910b9462..f166512e 100644 --- a/tools/compile.c +++ b/tools/compile.c @@ -16,11 +16,13 @@ char *link_objects(const void *ctx, const char *objs, char **errmsg) } /* Compile a single C file to an object file. Returns errmsg if fails. */ -char *compile_object(const void *ctx, const char *cfile, char **errmsg) +char *compile_object(const void *ctx, const char *cfile, const char *ccandir, + char **errmsg) { char *file = temp_file(ctx, ".o"); - *errmsg = run_command(ctx, "cc " CFLAGS " -c -o %s %s", file, cfile); + *errmsg = run_command(ctx, "cc " CFLAGS " -I%s -c -o %s %s", + ccandir, file, cfile); if (*errmsg) { talloc_free(file); return NULL; @@ -30,14 +32,14 @@ char *compile_object(const void *ctx, const char *cfile, char **errmsg) /* Compile and link single C file, with object files. * Returns name of result, or NULL (and fills in errmsg). */ -char *compile_and_link(const void *ctx, const char *cfile, const char *objs, - const char *extra_cflags, const char *libs, - char **errmsg) +char *compile_and_link(const void *ctx, const char *cfile, const char *ccandir, + const char *objs, const char *extra_cflags, + const char *libs, char **errmsg) { char *file = temp_file(ctx, ""); - *errmsg = run_command(ctx, "cc " CFLAGS " %s -o %s %s %s %s", - extra_cflags, file, cfile, objs, libs); + *errmsg = run_command(ctx, "cc " CFLAGS " -I%s %s -o %s %s %s %s", + ccandir, extra_cflags, file, cfile, objs, libs); if (*errmsg) { talloc_free(file); return NULL; diff --git a/tools/depends.c b/tools/depends.c index 4c31e50a..c83d78b2 100644 --- a/tools/depends.c +++ b/tools/depends.c @@ -37,15 +37,14 @@ lines_from_cmd(const void *ctx, unsigned int *num, char *format, ...) /* Be careful about trying to compile over running programs (parallel make). * temp_file helps here. */ -static char *compile_info(const void *ctx, const char *dir, const char *name) +static char *compile_info(const void *ctx, const char *dir) { - char *info_c_file, *info, *errmsg; + char *info_c_file, *info, *errmsg, *ccandir; size_t len; int fd; /* Copy it to a file with proper .c suffix. */ - info = grab_file(ctx, talloc_asprintf(ctx, "%s/%s/_info", dir, name), - &len); + info = grab_file(ctx, talloc_asprintf(ctx, "%s/_info", dir), &len); if (!info) return NULL; @@ -59,19 +58,21 @@ static char *compile_info(const void *ctx, const char *dir, const char *name) if (close(fd) != 0) return NULL; - return compile_and_link(ctx, info_c_file, "", "", "", &errmsg); + ccandir = talloc_dirname(ctx, dir); + *strrchr(ccandir, '/') = '\0'; + return compile_and_link(ctx, info_c_file, ccandir, "", "", "", + &errmsg); } static char **get_one_deps(const void *ctx, const char *dir, - const char *name, unsigned int *num, - char **infofile) + unsigned int *num, char **infofile) { char **deps, *cmd; if (!*infofile) { - *infofile = compile_info(ctx, dir, name); + *infofile = compile_info(ctx, dir); if (!*infofile) - errx(1, "Could not compile _info for '%s'", name); + errx(1, "Could not compile _info for '%s'", dir); } cmd = talloc_asprintf(ctx, "%s depends", *infofile); @@ -110,14 +111,14 @@ static char *replace(const void *ctx, const char *src, /* This is a terrible hack. We scan for ccan/ strings. */ static char **get_one_safe_deps(const void *ctx, - const char *dir, const char *name, + const char *dir, unsigned int *num, char **infofile) { char **deps, **lines, *raw, *fname; unsigned int i, n = 0; - fname = talloc_asprintf(ctx, "%s/%s/_info", dir, name); + fname = talloc_asprintf(ctx, "%s/_info", dir); raw = grab_file(fname, fname, NULL); if (!raw) errx(1, "Could not open %s", fname); @@ -169,25 +170,28 @@ static bool have_dep(char **deps, unsigned int num, const char *dep) /* Gets all the dependencies, recursively. */ static char ** -get_all_deps(const void *ctx, const char *dir, const char *name, +get_all_deps(const void *ctx, const char *dir, char **infofile, - char **(*get_one)(const void *, const char *, const char *, + char **(*get_one)(const void *, const char *, unsigned int *, char **)) { char **deps; unsigned int i, num; - deps = get_one(ctx, dir, name, &num, infofile); + deps = get_one(ctx, dir, &num, infofile); for (i = 0; i < num; i++) { char **newdeps; unsigned int j, newnum; char *subinfo = NULL; + char *subdir; if (!strstarts(deps[i], "ccan/")) continue; - newdeps = get_one(ctx, dir, deps[i] + strlen("ccan/"), - &newnum, &subinfo); + subdir = talloc_asprintf(ctx, "%s/%s", + talloc_dirname(ctx, dir), + deps[i] + strlen("ccan/")); + newdeps = get_one(ctx, subdir, &newnum, &subinfo); /* Should be short, so brute-force out dups. */ for (j = 0; j < newnum; j++) { @@ -203,15 +207,14 @@ get_all_deps(const void *ctx, const char *dir, const char *name, } char **get_libs(const void *ctx, const char *dir, - const char *name, unsigned int *num, - char **infofile) + unsigned int *num, char **infofile) { char **libs, *cmd; if (!*infofile) { - *infofile = compile_info(ctx, dir, name); + *infofile = compile_info(ctx, dir); if (!*infofile) - errx(1, "Could not compile _info for '%s'", name); + errx(1, "Could not compile _info for '%s'", dir); } cmd = talloc_asprintf(ctx, "%s libs", *infofile); @@ -221,7 +224,7 @@ char **get_libs(const void *ctx, const char *dir, return libs; } -char **get_deps(const void *ctx, const char *dir, const char *name, +char **get_deps(const void *ctx, const char *dir, bool recurse, char **infofile) { char *temp = NULL, **ret; @@ -230,9 +233,9 @@ char **get_deps(const void *ctx, const char *dir, const char *name, if (!recurse) { unsigned int num; - ret = get_one_deps(ctx, dir, name, &num, infofile); + ret = get_one_deps(ctx, dir, &num, infofile); } else - ret = get_all_deps(ctx, dir, name, infofile, get_one_deps); + ret = get_all_deps(ctx, dir, infofile, get_one_deps); if (infofile == &temp && temp) { unlink(temp); @@ -242,11 +245,11 @@ char **get_deps(const void *ctx, const char *dir, const char *name, } char **get_safe_ccan_deps(const void *ctx, const char *dir, - const char *name, bool recurse, char **infofile) + bool recurse, char **infofile) { if (!recurse) { unsigned int num; - return get_one_safe_deps(ctx, dir, name, &num, infofile); + return get_one_safe_deps(ctx, dir, &num, infofile); } - return get_all_deps(ctx, dir, name, infofile, get_one_safe_deps); + return get_all_deps(ctx, dir, infofile, get_one_safe_deps); } diff --git a/tools/namespacize.c b/tools/namespacize.c index 3a3fe47e..77269aac 100644 --- a/tools/namespacize.c +++ b/tools/namespacize.c @@ -457,9 +457,7 @@ static void adjust_dir(const char *dir) verbose("Adjusting %s\n", dir); verbose_indent(); - for (deps = get_deps(parent, parent, talloc_basename(parent, dir), - false, NULL); - *deps; deps++) { + for (deps = get_deps(parent, dir, false, NULL); *deps; deps++) { char *depdir; struct adjusted *adj = NULL; struct replace *repl; @@ -497,8 +495,7 @@ static void adjust_dependents(const char *dir) if (access(info, R_OK) != 0) continue; - for (deps = get_deps(*file, talloc_dirname(*file, *file), - talloc_basename(*file, *file), false, NULL); + for (deps = get_deps(*file, *file, false, NULL); *deps; deps++) { if (!strstarts(*deps, "ccan/")) continue; diff --git a/tools/tools.h b/tools/tools.h index 5f5f119d..2092042f 100644 --- a/tools/tools.h +++ b/tools/tools.h @@ -12,16 +12,16 @@ #define CFLAGS "-g -Wall -Wundef -Wstrict-prototypes -Wold-style-definition -Werror -I../.." /* This actually compiles and runs the info file to get dependencies. */ -char **get_deps(const void *ctx, const char *dir, const char *name, - bool recurse, char **infofile); +char **get_deps(const void *ctx, const char *dir, bool recurse, + char **infofile); /* This is safer: just looks for ccan/ strings in info */ -char **get_safe_ccan_deps(const void *ctx, const char *dir, const char *name, +char **get_safe_ccan_deps(const void *ctx, const char *dir, bool recurse, char **infofile); /* This also needs to compile the info file. */ char **get_libs(const void *ctx, const char *dir, - const char *name, unsigned int *num, char **infofile); + unsigned int *num, char **infofile); /* From tools.c */ char *talloc_basename(const void *ctx, const char *dir); @@ -38,9 +38,10 @@ char *temp_file(const void *ctx, const char *extension); /* Compile multiple object files into a single. */ char *link_objects(const void *ctx, const char *objs, char **errmsg); /* Compile a single C file to an object file. Returns errmsg if fails. */ -char *compile_object(const void *ctx, const char *cfile, char **errmsg); +char *compile_object(const void *ctx, const char *cfile, const char *ccandir, + char **errmsg); /* Compile and link single C file, with object files, libs, etc. */ -char *compile_and_link(const void *ctx, const char *cfile, const char *objs, - const char *extra_cflags, const char *libs, - char **errmsg); +char *compile_and_link(const void *ctx, const char *cfile, const char *ccandir, + const char *objs, const char *extra_cflags, + const char *libs, char **errmsg); #endif /* CCAN_TOOLS_H */