From: David Gibson Date: Wed, 18 Jan 2017 03:23:51 +0000 (+1100) Subject: ccanlint: Allow path to gcov to be overriden X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=d1827b423b5d30c8ecb184a3186d95d9f134f806;hp=bcb956d9afb054a36c4f481900cdbc6587c4a2bf 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 variable. Signed-off-by: David Gibson --- diff --git a/Makefile b/Makefile index d1e08a37..7f57869e 100644 --- a/Makefile +++ b/Makefile @@ -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)) LINT_OBJS := $(LINT_SRCS:%.c=%.o) $(LINT_CCAN_SRCS:%.c=%.o) $(TOOLS_OBJS) +ifneq ($(GCOV),) +LINT_GCOV = --gcov="$(GCOV)" +endif $(LINT): $(LINT).c $(LINT_OBJS) $(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) diff --git a/tools/ccanlint/ccanlint.c b/tools/ccanlint/ccanlint.c index f06f200b..237e4128 100644 --- a/tools/ccanlint/ccanlint.c +++ b/tools/ccanlint/ccanlint.c @@ -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. */ dgraph_init_node(&top.node); @@ -644,6 +645,8 @@ int main(int argc, char *argv[]) NULL, &override_compiler, "set the compiler"); opt_register_arg("--cflags ", opt_set_const_charp, NULL, &override_cflags, "set the compiler flags"); + opt_register_arg("--gcov ", opt_set_const_charp, + NULL, &override_gcov, "set the coverage tool"); opt_register_noarg("--deps-fail-ignore", opt_set_bool, &deps_fail_ignore, "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, "", diff --git a/tools/gcov.c b/tools/gcov.c index f922d8d9..c36f69b0 100644 --- a/tools/gcov.c +++ b/tools/gcov.c @@ -2,16 +2,28 @@ #include #include +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"; +#endif + } + + 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); tal_free(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; diff --git a/tools/tools.h b/tools/tools.h index e5aaee2f..257a14ae 100644 --- a/tools/tools.h +++ b/tools/tools.h @@ -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, ...);