Commit d1827b42 authored by David Gibson's avatar David Gibson

ccanlint: Allow path to gcov to be overriden

Currently ccanlint always assumes that the coverage tool can be
invoked under the command "gcov".

However, the coverage tool generally needs to be closely matched to
the compiler version.  So, the current behaviour won't work with
compilers other than gcc, like clang.  It won't even work for a gcc
version which isn't the standard system one matching gcov.

To address this, allow the command for the coverage tool to be
overridden on the ccanlint command line with a new --gcov option.  We
also allow it to be overridden for make check with a GCOV make
Signed-off-by: 's avatarDavid Gibson <>
parent bcb956d9
......@@ -62,6 +62,9 @@ LINT_DEPS := $(LINT_SRCS:%.c=%.d) $(LINT).d
LINT_CCAN_MODULES := asort autodata dgraph ilog lbalance ptr_valid strmap
LINT_CCAN_SRCS := $(wildcard $(LINT_CCAN_MODULES:%=ccan/%/*.c))
ifneq ($(GCOV),)
LINT_GCOV = --gcov="$(GCOV)"
$(PRE)$(CC) $(CCAN_CFLAGS) $(DEP_CFLAGS) $(LINT).c $(LINT_OBJS) -lm -o $@
......@@ -72,7 +75,7 @@ TEST_DEPS := $(MODULES:%=%/.d)
# We produce .ok files when the tests succeed
%.ok: $(LINT) %info
$(PRE)$(LINT) $(LINT_OPTS$(notdir $@)) --deps-fail-ignore $(LINTFLAGS) $(dir $*) && touch $@
$(PRE)$(LINT) $(LINT_OPTS$(notdir $@)) --deps-fail-ignore $(LINT_GCOV) $(LINTFLAGS) $(dir $*) && touch $@
check: $(MODULES:%=%/.ok)
fastcheck: $(MODULES:%=%/.fast.ok)
......@@ -616,6 +616,7 @@ int main(int argc, char *argv[])
char *cwd = path_cwd(NULL), *dir;
struct ccanlint top; /* cannot_run may try to set ->can_run */
const char *override_compiler = NULL, *override_cflags = NULL;
const char *override_gcov = NULL;
/* Empty graph node to which we attach everything else. */
......@@ -644,6 +645,8 @@ int main(int argc, char *argv[])
NULL, &override_compiler, "set the compiler");
opt_register_arg("--cflags <flags>", opt_set_const_charp,
NULL, &override_cflags, "set the compiler flags");
opt_register_arg("--gcov <coverage tool>", opt_set_const_charp,
NULL, &override_gcov, "set the coverage tool");
opt_register_noarg("--deps-fail-ignore", opt_set_bool,
"don't fail if external dependencies are missing");
......@@ -688,6 +691,8 @@ int main(int argc, char *argv[])
cflags = override_cflags;
if (override_compiler)
compiler = override_compiler;
if (override_gcov)
gcov = override_gcov;
if (argc == 1)
pass = test_module(&top.node, cwd, "",
......@@ -2,16 +2,28 @@
#include <stdlib.h>
#include <stdarg.h>
const char *gcov; /* = NULL */
bool run_gcov(const void *ctx, unsigned int *time_ms, char **output,
const char *fmt, ...)
const char *cmd = gcov;
char *args;
va_list ap;
bool rc;
if (!gcov) {
#ifdef __GNUC__
cmd = "gcov";
if (!cmd)
return false;
va_start(ap, fmt);
args = tal_vfmt(ctx, fmt, ap);
rc = run_command(ctx, time_ms, output, "gcov %s", args);
rc = run_command(ctx, time_ms, output, "%s %s", cmd, args);
return rc;
......@@ -20,6 +32,13 @@ const char *gcov_unavailable(void *ctx)
const char *err = NULL;
* If the user has specified a path, assume they know what
* they're doing
if (gcov)
return NULL;
#ifdef __GNUC__
unsigned int timeleft = default_timeout_ms;
char *output;
......@@ -103,6 +103,7 @@ extern const unsigned int default_timeout_ms;
const char *find_ccan_dir(const char *base);
/* Run gcov coverage tool */
extern const char *gcov;
const char *gcov_unavailable(void *ctx);
bool run_gcov(const void *ctx, unsigned int *time_ms, char **output,
const char *fmt, ...);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment