X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fccanlint%2Fccanlint.c;h=81f9614739b2242410bb7524634101ddb1e191da;hp=231ae7c05c45e0b1050b834b096b48ddb634f23d;hb=94b797a5d4fb35f85a314e11c9ded9f18b941d00;hpb=104125b2dd0a044fb3d68f9bc3b1b18c9f32ae2b diff --git a/tools/ccanlint/ccanlint.c b/tools/ccanlint/ccanlint.c index 231ae7c0..81f96147 100644 --- a/tools/ccanlint/ccanlint.c +++ b/tools/ccanlint/ccanlint.c @@ -32,6 +32,7 @@ #include #include #include +#include int verbose = 0; static LIST_HEAD(compulsory_tests); @@ -43,8 +44,8 @@ static struct btree *info_exclude; static unsigned int timeout; /* These are overridden at runtime if we can find config.h */ -const char *compiler = CCAN_COMPILER; -const char *cflags = CCAN_CFLAGS; +const char *compiler = NULL; +const char *cflags = NULL; const char *config_header; @@ -160,9 +161,9 @@ static bool run_test(struct ccanlint *i, printf("%s%s", score->error, strends(score->error, "\n") ? "" : "\n"); } - if (!quiet && !score->pass && i->handle) - i->handle(m, score); } + if (!quiet && score->score < score->total && i->handle) + i->handle(m, score); *running_score += score->score; *running_total += score->total; @@ -284,24 +285,29 @@ static void init_tests(void) } btree_delete(keys); btree_delete(names); +} - if (!verbose) - return; +static void print_test_depends(void) +{ + struct list_head *list; foreach_ptr(list, &compulsory_tests, &normal_tests) { + struct ccanlint *c; printf("\%s Tests\n", list == &compulsory_tests ? "Compulsory" : "Normal"); - if (!list_empty(&c->dependencies)) { - const struct dependent *d; - printf("These depend on us:\n"); - list_for_each(&c->dependencies, d, node) - printf("\t%s\n", d->dependent->name); + list_for_each(list, c, list) { + if (!list_empty(&c->dependencies)) { + const struct dependent *d; + printf("These depend on %s:\n", c->key); + list_for_each(&c->dependencies, d, node) + printf("\t%s\n", d->dependent->key); + } } } } -static int show_tmpdir(char *dir) +static int show_tmpdir(const char *dir) { printf("You can find ccanlint working files in '%s'\n", dir); return 0; @@ -499,7 +505,7 @@ static char *demangle_string(char *string) if (string[i] == '\\') { char repl; unsigned len = 0; - char *p = strchr(mapfrom, string[i+1]); + const char *p = strchr(mapfrom, string[i+1]); if (p) { repl = mapto[p - mapfrom]; len = 1; @@ -508,7 +514,7 @@ static char *demangle_string(char *string) repl = (string[i+2]-'0')*16 + string[i+3]-'0'; len = 3; - } else if (isdigit(string[i+1])) { + } else if (cisdigit(string[i+1])) { repl = (string[i+2]-'0')*8*8 + (string[i+3]-'0')*8 + (string[i+4]-'0'); @@ -552,25 +558,38 @@ static void read_config_header(void) if (!get_token(line, "define")) continue; sym = get_symbol_token(lines, line); - if (streq(sym, "CCAN_COMPILER")) { + if (streq(sym, "CCAN_COMPILER") && !compiler) { compiler = demangle_string(lines[i]); + if (!compiler) + errx(1, "%s:%u:could not parse CCAN_COMPILER", + fname, i+1); if (verbose > 1) printf("%s: compiler set to '%s'\n", fname, compiler); - } else if (streq(sym, "CCAN_CFLAGS")) { + } else if (streq(sym, "CCAN_CFLAGS") && !cflags) { cflags = demangle_string(lines[i]); + if (!cflags) + errx(1, "%s:%u:could not parse CCAN_CFLAGS", + fname, i+1); if (verbose > 1) printf("%s: compiler flags set to '%s'\n", fname, cflags); } } - if (!compiler || !cflags) - errx(1, "Problem parsing %s", fname); + if (!compiler) + compiler = CCAN_COMPILER; + if (!cflags) + compiler = CCAN_CFLAGS; +} + +static char *opt_set_const_charp(const char *arg, const char **p) +{ + return opt_set_charp(arg, cast_const2(char **, p)); } int main(int argc, char *argv[]) { - bool summary = false; + bool summary = false, pass = true; unsigned int score = 0, total_score = 0; struct manifest *m; struct ccanlint *i; @@ -605,6 +624,10 @@ int main(int argc, char *argv[]) opt_register_arg("--target ", opt_set_charp, NULL, &target, "only run one test (and its prerequisites)"); + opt_register_arg("--compiler ", opt_set_const_charp, + NULL, &compiler, "set the compiler"); + opt_register_arg("--cflags ", opt_set_const_charp, + NULL, &cflags, "set the compiler flags"); opt_register_noarg("-?|-h|--help", opt_usage_and_exit, "\nA program for checking and guiding development" " of CCAN modules.", @@ -622,8 +645,10 @@ int main(int argc, char *argv[]) dir[strlen(dir)-1] = '\0'; if (dir != base_dir) prefix = talloc_append_string(talloc_basename(NULL, dir), ": "); - if (verbose >= 3) + if (verbose >= 3) { compile_verbose = true; + print_test_depends(); + } if (verbose >= 4) tools_verbose = true; @@ -653,11 +678,12 @@ int main(int argc, char *argv[]) } /* --target overrides known FAIL from _info */ - add_info_options(m->info_file, !target); + if (m->info_file) + add_info_options(m->info_file, !target); while ((i = get_next_test(&normal_tests)) != NULL) - run_test(i, summary, &score, &total_score, m); + pass &= run_test(i, summary, &score, &total_score, m); printf("%sTotal score: %u/%u\n", prefix, score, total_score); - return 0; + return pass ? 0 : 1; }