X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fccanlint%2Ftests%2Fbuild_objs.c;fp=tools%2Fccanlint%2Ftests%2Fbuild_objs.c;h=199772ab8f1d08614d57eec52b2fea811a9e44fb;hp=0000000000000000000000000000000000000000;hb=61088f5c752c555172e2ab6cf93a7967f79f3f2c;hpb=3460418c419dfcc84316ad65497b0a00950480b9 diff --git a/tools/ccanlint/tests/build_objs.c b/tools/ccanlint/tests/build_objs.c new file mode 100644 index 00000000..199772ab --- /dev/null +++ b/tools/ccanlint/tests/build_objs.c @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const char *can_build(struct manifest *m) +{ + if (list_empty(&m->c_files)) + return "No C files in module"; + if (safe_mode) + return "Safe mode enabled"; + return NULL; +} + +static bool compile_obj(struct ccan_file *c_file, char *objfile, char **report) +{ + char *contents; + + contents = run_command(objfile, "cc " CFLAGS " -o %s -c %s", + objfile, c_file->name); + if (contents) { + if (*report) + *report = talloc_append_string(*report, contents); + else + *report = contents; + return false; + } + return true; +} + +static int cleanup_obj(char *objfile) +{ + unlink(objfile); + return 0; +} + +static void *check_objs_build(struct manifest *m) +{ + char *report = NULL; + struct ccan_file *i; + + /* One point for each obj file. */ + build_objs.total_score = 0; + list_for_each(&m->c_files, i, list) + build_objs.total_score++; + + list_for_each(&m->c_files, i, list) { + char *objfile = talloc_strdup(m, i->name); + objfile[strlen(objfile)-1] = 'o'; + + if (compile_obj(i, objfile, &report)) + talloc_set_destructor(objfile, cleanup_obj); + } + return report; +} + +static const char *describe_objs_build(struct manifest *m, void *check_result) +{ + return talloc_asprintf(check_result, + "%s", (char *)check_result); +} + +struct ccanlint build_objs = { + .name = "Module object files can be built", + .total_score = 1, + .check = check_objs_build, + .describe = describe_objs_build, + .can_run = can_build, +}; + +REGISTER_TEST(build_objs, &depends_exist, NULL);