From 4c6ac053271850d24b2eda44a78f066c332880e1 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Tue, 29 Jul 2014 18:36:51 -0400 Subject: [PATCH] Fix: git version build system integration (v2) Fix: - Don't overwrite version.h if the previous content matches. - While we are there, if we notice the previous content matches, print a (cached) message to show that we do not overwrite the content. - Introduce LTTNG_TOOLS_BUILD_GIT_SOURCE automake conditional rather than compile-time define to disable the feature. It ensures we do not invoke "git describe" when configure --disable-git-version has been requested. - Use git describe rather than git describe --long --all. Based on the last tag, and adds the first numbers of git revision. Last tag is useful both to the developer and in a bug report, whereas the branch name returned by --long --all is meaningless in a bug report. - We want to ship version.h.tmpl in the tarball (make dist), not version.h which is generated. Someone could very well do a git init on the extracted tarball and want to have git tracking support. - Fix the git prefix " - " that is incorrectly printed in some situations, e.g. when GIT_SOURCE was active, but we are in a non-git tree (or git is not available). - Fix incorrect handling of out of tree build. Invoke git describe from top_srcdir. Changelog since v1: - Add missing comma for lttng usage output. Signed-off-by: Mathieu Desnoyers Signed-off-by: David Goulet --- configure.ac | 8 ++--- include/Makefile.am | 60 +++++++++++++++++--------------- include/version.h.tmpl | 14 +++----- src/bin/lttng/commands/version.c | 3 +- src/bin/lttng/lttng.c | 8 +++-- 5 files changed, 47 insertions(+), 46 deletions(-) diff --git a/configure.ac b/configure.ac index bd49df7ba..a8e04f5ab 100644 --- a/configure.ac +++ b/configure.ac @@ -262,11 +262,11 @@ AC_CHECK_LIB([c], [open_memstream], AC_ARG_ENABLE([git-version], [AC_HELP_STRING([--disable-git-version], [Do not use the git version for the build])], - [disable_git_version=yes], [disable_git_version=no] + [have_git_version=$enableval], [have_git_version=yes] ) -if test "x${disable_git_version:-no}" = xno; then - AC_DEFINE_UNQUOTED([GIT_SOURCE], 1, [Disable git version.]) -fi + +AM_CONDITIONAL([LTTNG_TOOLS_BUILD_GIT_SOURCE], + [test "x${have_git_version}" = "xyes"]) # For Python # SWIG version needed or newer: diff --git a/include/Makefile.am b/include/Makefile.am index 767b05b5d..4b59e72d8 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -1,3 +1,9 @@ +if LTTNG_TOOLS_BUILD_GIT_SOURCE +GIT_DESCRIBE_CMD = (cd $(top_srcdir); git describe) +else +GIT_DESCRIBE_CMD = /bin/true +endif + ## ## The version.h file must be verified and generated or updated if the ## git commit id (called git version here) changed since the last build @@ -6,49 +12,44 @@ version.h: ## ## We first create variables for the current git version and - ## the locations of the version.h and version.h.tmpl files + ## the locations of the version.h and version.h.tmpl files. ## - @echo -n "Generating version.h ... " + @echo -n "Generating version.h... " @(version_h_tmpl="$(top_srcdir)/include/version.h.tmpl"; \ if [ -f "$${version_h_tmpl}" ]; then \ version_h="$(top_builddir)/include/version.h"; \ ## - ## We check the git version format we will use depending on - ## whether or not we are in the master branch or on a tag + ## Check whether we are in a git repo. ## - git_branch="$$(git describe --all 2>/dev/null)"; \ - if [ -z "$${git_branch}" ]; then \ - git_version=""; \ + git_describe="$$($(GIT_DESCRIBE_CMD) 2>/dev/null)"; \ + if [ $$? -eq 0 ]; then \ + git_version="$${git_describe}"; \ else \ - git_describe="$$(git describe)"; \ - if [ "$${git_branch}" == "$${git_describe}" ]; then \ - git_version="$${git_describe}"; \ - else \ - git_version="$$(git describe --long --all)"; \ - fi; \ + git_version=""; \ fi; \ ## ## If the version.h file doesn't exist or is not up to date, - ## We replace it by the version.h.tmpl file + ## We replace it by the version.h.tmpl file. ## if [ ! -e "$${version_h}" ] || \ [ "$${version_h_tmpl}" -nt "$${version_h}" ]; then \ cp "$${version_h_tmpl}" "$${version_h}"; \ fi; \ - if [ -n "$${git_version}" ]; then \ - ## - ## We remove the leading "v" for the version number - ## - git_version="$$(echo "$${git_version}" | sed -r "s/^v([0-9])/\1/")"; \ - ## - ## If we have a git version, we verify that it isn't the same - ## as the one currently in the file (if there is one), as we - ## don't want to update the file if it is already up to date - ## - if [ $$(grep -cE "^#define GIT_VERSION_SED \"?$${git_version}\"?$$" "$${version_h}") -eq 0 ]; then \ - sed -i "s'^#define GIT_VERSION_SED.*$$'#define GIT_VERSION \"$${git_version}\"'" "$${version_h}"; \ - fi; \ + echo -n "git version: \"$${git_version}\""; \ + ## + ## We verify that git_version isn't the same as the one + ## currently in the file (if there is one), as we don't + ## want to update the file if it is already up to date. + ## + version_match='^#define GIT_VERSION.*'; \ + old_version=$$(grep "$${version_match}" "$${version_h}"); \ + new_version="#define GIT_VERSION \"$${git_version}\""; \ + if [ x"$${old_version}" != x"$${new_version}" ]; then \ + sed -i "s'$${version_match}'$${new_version}'" "$${version_h}"; \ + else \ + echo -n " (cached)"; \ fi; \ + echo -n "... "; \ fi) @echo "ok" @@ -58,6 +59,9 @@ version.h: ## .PHONY: version.h +nodist_noinst_HEADERS = \ + version.h + lttnginclude_HEADERS = \ lttng/health.h \ lttng/lttng.h \ @@ -71,7 +75,7 @@ lttnginclude_HEADERS = \ lttng/snapshot.h \ lttng/save.h \ lttng/load.h \ - version.h + version.h.tmpl noinst_HEADERS = \ lttng/snapshot-internal.h \ diff --git a/include/version.h.tmpl b/include/version.h.tmpl index e2ce531d4..d3f33024a 100644 --- a/include/version.h.tmpl +++ b/include/version.h.tmpl @@ -1,3 +1,6 @@ +#ifndef VERSION_H +#define VERSION_H + /* * Copyright (C) 2013-2014 - Raphaël Beamonte * @@ -17,15 +20,6 @@ #include -#ifndef VERSION_H -#define VERSION_H - -#ifdef GIT_SOURCE -#define GIT_VERSION_PREFIX " - " -#define GIT_VERSION_SED "" -#else -#define GIT_VERSION_PREFIX "" -#define GIT_VERSION "" -#endif +#define GIT_VERSION "" #endif /* VERSION_H */ diff --git a/src/bin/lttng/commands/version.c b/src/bin/lttng/commands/version.c index 4e46d724f..f4d89631e 100644 --- a/src/bin/lttng/commands/version.c +++ b/src/bin/lttng/commands/version.c @@ -164,7 +164,8 @@ int cmd_version(int argc, const char **argv) if (lttng_opt_mi) { ret = print_mi(); } else { - MSG("lttng version " VERSION " - " VERSION_NAME GIT_VERSION_PREFIX GIT_VERSION); + MSG("lttng version " VERSION " - " VERSION_NAME "%s", + GIT_VERSION[0] == '\0' ? "" : " - " GIT_VERSION); MSG("\n" VERSION_DESCRIPTION "\n"); MSG("Web site: http://lttng.org"); MSG("\n%s", lttng_license); diff --git a/src/bin/lttng/lttng.c b/src/bin/lttng/lttng.c index 41232bef9..2df8b8740 100644 --- a/src/bin/lttng/lttng.c +++ b/src/bin/lttng/lttng.c @@ -90,7 +90,8 @@ static struct cmd_struct commands[] = { static void usage(FILE *ofp) { - fprintf(ofp, "LTTng Trace Control " VERSION " - " VERSION_NAME" - " GIT_VERSION "\n\n"); + fprintf(ofp, "LTTng Trace Control " VERSION " - " VERSION_NAME "%s\n\n", + GIT_VERSION[0] == '\0' ? "" : " - " GIT_VERSION); fprintf(ofp, "usage: lttng [OPTIONS] []\n"); fprintf(ofp, "\n"); fprintf(ofp, "Options:\n"); @@ -134,8 +135,9 @@ static void usage(FILE *ofp) static void version(FILE *ofp) { - fprintf(ofp, "%s (LTTng Trace Control) " VERSION" - " VERSION_NAME" - " GIT_VERSION "\n", - progname); + fprintf(ofp, "%s (LTTng Trace Control) " VERSION" - " VERSION_NAME "%s\n", + progname, + GIT_VERSION[0] == '\0' ? "" : " - " GIT_VERSION); } /* -- 2.34.1