/* Note: we already test safe_mode in run_tests.c */
static const char *can_run_coverage(struct manifest *m)
{
-#ifdef __GNUC__
- unsigned int timeleft = default_timeout_ms;
- char *output;
-
- if (!run_command(m, &timeleft, &output, "gcov -h"))
- return tal_fmt(m, "No gcov support: %s", output);
- return NULL;
-#else
- return "No coverage support for this compiler";
-#endif
+ return gcov_unavailable(m);
}
static char *cflags_list(const struct manifest *m)
{
struct ccan_file *i;
char *cmdout, *outdir;
- char *covcmd;
+ char *covargs;
bool full_gcov = (verbose > 1);
struct list_head *list;
bool ran_some = false;
/* This tells gcov where we put those .gcno files. */
outdir = path_dirname(score,
m->info_file->compiled[COMPILE_NORMAL]);
- covcmd = tal_fmt(m, "gcov %s -o %s",
- full_gcov ? "" : "-n",
- outdir);
+ covargs = tal_fmt(m, "%s -o %s", full_gcov ? "" : "-n", outdir);
/* Run them all. */
foreach_ptr(list, &m->run_tests, &m->api_tests) {
list_for_each(list, i, list) {
if (run_command(score, timeleft, &cmdout,
"%s", i->compiled[COMPILE_COVERAGE])) {
- tal_append_fmt(&covcmd, " %s", i->fullname);
+ tal_append_fmt(&covargs, " %s", i->fullname);
} else {
score_file_error(score, i, 0,
"Running test with coverage"
}
/* Now run gcov: we want output even if it succeeds. */
- if (!run_command(score, timeleft, &cmdout, "%s", covcmd)) {
+ if (!run_gcov(score, timeleft, &cmdout, "%s", covargs)) {
score->error = tal_fmt(score, "Running gcov: %s", cmdout);
return;
}
--- /dev/null
+#include "tools.h"
+#include <stdlib.h>
+#include <stdarg.h>
+
+bool run_gcov(const void *ctx, unsigned int *time_ms, char **output,
+ const char *fmt, ...)
+{
+ char *args;
+ va_list ap;
+ bool rc;
+
+ va_start(ap, fmt);
+ args = tal_vfmt(ctx, fmt, ap);
+ rc = run_command(ctx, time_ms, output, "gcov %s", args);
+ tal_free(args);
+ return rc;
+}
+
+const char *gcov_unavailable(void *ctx)
+{
+ const char *err = NULL;
+
+#ifdef __GNUC__
+ unsigned int timeleft = default_timeout_ms;
+ char *output;
+
+ if (!run_gcov(ctx, &timeleft, &output, "-h")) {
+ err = tal_fmt(ctx, "No gcov support: %s", output);
+ tal_free(output);
+ }
+#else
+ err = "No coverage support for this compiler";
+#endif
+
+ return err;
+}
/* Get ccan/ top dir, given a directory within it. */
const char *find_ccan_dir(const char *base);
+
+/* Run gcov coverage tool */
+const char *gcov_unavailable(void *ctx);
+bool run_gcov(const void *ctx, unsigned int *time_ms, char **output,
+ const char *fmt, ...);
+
#endif /* CCAN_TOOLS_H */