X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fccanlint%2Fcompulsory_tests%2Fcheck_depends_built.c;h=b1ba40cb40493be87ae46bb6cb307ef3d79b4a2a;hp=41e5d8885e52aea5026d73d426c10eee9c592e99;hb=2d4243996a4ace6d4eac1da460dd5bbcb31304ce;hpb=a40b318e7a07a452ae7456053727bd11b2fa49b4 diff --git a/tools/ccanlint/compulsory_tests/check_depends_built.c b/tools/ccanlint/compulsory_tests/check_depends_built.c index 41e5d888..b1ba40cb 100644 --- a/tools/ccanlint/compulsory_tests/check_depends_built.c +++ b/tools/ccanlint/compulsory_tests/check_depends_built.c @@ -13,6 +13,7 @@ #include #include #include +#include "build.h" static const char *can_build(struct manifest *m) { @@ -21,61 +22,87 @@ static const char *can_build(struct manifest *m) return NULL; } -/* FIXME: recursive ccanlint if they ask for it. */ -static bool expect_obj_file(const char *dir) +static bool expect_obj_file(struct manifest *m) { - struct manifest *dep_man; - bool has_c_files; + /* If it has C files, we expect an object file built from them. */ + return !list_empty(&m->c_files); +} - dep_man = get_manifest(dir, dir); +static char *build_subdir_objs(struct manifest *m) +{ + struct ccan_file *i; - /* If it has C files, we expect an object file built from them. */ - has_c_files = !list_empty(&dep_man->c_files); - talloc_free(dep_man); - return has_c_files; + list_for_each(&m->c_files, i, list) { + char *fullfile = talloc_asprintf(m, "%s/%s", m->dir, i->name); + char *output; + + i->compiled = maybe_temp_file(m, "", false, fullfile); + if (!compile_object(m, fullfile, ccan_dir, "", i->compiled, + &output)) { + talloc_free(i->compiled); + i->compiled = NULL; + return talloc_asprintf(m, + "Dependency %s" + " did not build:\n%s", + m->basename, output); + } + } + return NULL; +} + +char *build_submodule(struct manifest *m) +{ + char *errstr; + struct stat st; + + if (m->compiled) + return NULL; + + if (!expect_obj_file(m)) + return NULL; + + m->compiled = talloc_asprintf(m, "%s.o", m->dir); + if (stat(m->compiled, &st) == 0) + return NULL; + + if (verbose >= 2) + printf(" Building dependency %s\n", m->dir); + + errstr = build_subdir_objs(m); + if (errstr) + return errstr; + + m->compiled = build_module(m, false, &errstr); + if (!m->compiled) + return errstr; + return NULL; } static void check_depends_built(struct manifest *m, bool keep, unsigned int *timeleft, struct score *score) { - struct ccan_file *i; - struct stat st; + struct manifest *i; - list_for_each(&m->dep_dirs, i, list) { - if (!expect_obj_file(i->fullname)) - continue; - - i->compiled = talloc_asprintf(i, "%s.o", i->fullname); - if (stat(i->compiled, &st) != 0) { - score->error = "Dependencies are not built"; - score_file_error(score, i, 0, - talloc_asprintf(score, - "object file %s", - i->compiled)); - i->compiled = NULL; - } - } + list_for_each(&m->deps, i, list) { + char *errstr = build_submodule(i); - /* 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))) { - char *tapobj = talloc_asprintf(m, "%s/ccan/tap.o", ccan_dir); - if (stat(tapobj, &st) != 0) { + if (errstr) { score->error = talloc_asprintf(score, - "tap object file not built"); + "Dependency %s" + " did not build:\n%s", + i->basename, errstr); + return; } } - if (!score->error) { - score->pass = true; - score->score = score->total; - } + score->pass = true; + score->score = score->total; } struct ccanlint depends_built = { .key = "depends-built", - .name = "Module's CCAN dependencies are already built", + .name = "Module's CCAN dependencies can be found or built", .check = check_depends_built, .can_run = can_build, };