1 #include <tools/ccanlint/ccanlint.h>
2 #include <tools/tools.h>
3 #include <ccan/talloc/talloc.h>
4 #include <ccan/str/str.h>
17 static const char *can_build(struct manifest *m)
20 return "Safe mode enabled";
24 static char *obj_list(const struct manifest *m, bool link_with_module)
29 /* We expect to be linked with tap, unless that's us. */
30 if (!streq(m->basename, "tap"))
31 list = talloc_asprintf(m, "%s/ccan/tap.o", ccan_dir);
33 list = talloc_strdup(m, "");
35 /* Objects from any other C files. */
36 list_for_each(&m->other_test_c_files, i, list)
37 list = talloc_asprintf_append(list, " %s", i->compiled);
39 /* Our own object files. */
41 list_for_each(&m->c_files, i, list)
42 list = talloc_asprintf_append(list, " %s", i->compiled);
44 /* Other ccan modules. */
45 list_for_each(&m->dep_dirs, i, list) {
47 list = talloc_asprintf_append(list, " %s", i->compiled);
53 static char *lib_list(const struct manifest *m)
56 char **libs = get_libs(m, ".", &num, &m->info_file->compiled);
57 char *ret = talloc_strdup(m, "");
59 for (i = 0; i < num; i++)
60 ret = talloc_asprintf_append(ret, "-l%s ", libs[i]);
64 static char *compile(const void *ctx,
66 struct ccan_file *file,
68 bool link_with_module,
73 file->compiled = maybe_temp_file(ctx, "", keep, file->fullname);
74 errmsg = compile_and_link(ctx, file->fullname, ccan_dir,
75 obj_list(m, link_with_module),
77 lib_list(m), file->compiled);
79 talloc_free(file->compiled);
85 struct compile_tests_result {
86 struct list_node list;
88 const char *description;
92 static void *do_compile_tests(struct manifest *m,
94 unsigned int *timeleft)
96 struct list_head *list = talloc(m, struct list_head);
99 struct compile_tests_result *res;
101 list_head_init(list);
103 list_for_each(&m->compile_ok_tests, i, list) {
104 compile_tests.total_score++;
105 cmdout = compile(list, m, i, false, false, keep);
107 res = talloc(list, struct compile_tests_result);
108 res->filename = i->name;
109 res->description = "failed to compile";
110 res->output = talloc_steal(res, cmdout);
111 list_add_tail(list, &res->list);
115 list_for_each(&m->run_tests, i, list) {
116 compile_tests.total_score++;
117 cmdout = compile(m, m, i, false, false, keep);
119 res = talloc(list, struct compile_tests_result);
120 res->filename = i->name;
121 res->description = "failed to compile";
122 res->output = talloc_steal(res, cmdout);
123 list_add_tail(list, &res->list);
127 list_for_each(&m->api_tests, i, list) {
128 compile_tests.total_score++;
129 cmdout = compile(m, m, i, false, true, keep);
131 res = talloc(list, struct compile_tests_result);
132 res->filename = i->name;
133 res->description = "failed to compile";
134 res->output = talloc_steal(res, cmdout);
135 list_add_tail(list, &res->list);
139 list_for_each(&m->compile_fail_tests, i, list) {
140 compile_tests.total_score++;
141 cmdout = compile(list, m, i, false, false, false);
143 res = talloc(list, struct compile_tests_result);
144 res->filename = i->name;
145 res->description = "failed to compile without -DFAIL";
146 res->output = talloc_steal(res, cmdout);
147 list_add_tail(list, &res->list);
149 cmdout = compile(list, m, i, true, false, false);
151 res = talloc(list, struct compile_tests_result);
152 res->filename = i->name;
153 res->description = "compiled successfully"
156 list_add_tail(list, &res->list);
161 if (list_empty(list)) {
169 static unsigned int score_compile_tests(struct manifest *m,
172 struct list_head *list = check_result;
173 struct compile_tests_result *i;
174 unsigned int score = compile_tests.total_score;
176 list_for_each(list, i, list)
181 static const char *describe_compile_tests(struct manifest *m,
184 struct list_head *list = check_result;
185 struct compile_tests_result *i;
186 char *descrip = talloc_strdup(list, "Compilation tests failed:\n");
188 list_for_each(list, i, list)
189 descrip = talloc_asprintf_append(descrip, "%s %s\n%s",
190 i->filename, i->description,
195 struct ccanlint compile_tests = {
196 .key = "compile-tests",
197 .name = "Module tests compile",
198 .score = score_compile_tests,
199 .check = do_compile_tests,
200 .describe = describe_compile_tests,
201 .can_run = can_build,
204 REGISTER_TEST(compile_tests, &compile_test_helpers, &build_objs, NULL);