Print the git version used to build from a distribution tarball
authorMichael Jeanson <mjeanson@efficios.com>
Fri, 27 Apr 2018 21:27:29 +0000 (17:27 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 1 May 2018 19:35:07 +0000 (15:35 -0400)
The git version is omitted when building from a distribution
tarball. This will cause 'lttng version' and 'lttng --version'
to print the state of the git tree which produced the tarball.

git describe is used to produce the description of the tree's
state, along with the "dirty" state (whether or not local
changes were present in the tree).

Note that the 'git version' will not be printed when the
distribution tarball was produced at a release tag (a tag
starting with v[0-9]).

This patch simplifies the generation of the version.h file by
generating a file that is merely included by version.h.

It also ensures that version.tmpl is no longer installed on the
system by the install target.

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
.gitignore
configure.ac
include/Makefile.am
include/version.h [new file with mode: 0644]
include/version.h.tmpl [deleted file]

index 7600cf6d565285e7a83075e6cd3bfd51eef2125b..675b44e82b4d110383a4fe065ebbe12aeb78e1ae 100644 (file)
@@ -131,6 +131,7 @@ health_check
 
 /benchmark/
 
 
 /benchmark/
 
-/include/version.h
+/include/version.i
+/include/version.i.tmp
 
 classnoinst.stamp
 
 classnoinst.stamp
index 07ebecd0fdeb40752b32dc7b480db97b84f30077..f5b105e4babdd41b945cc4d17c788e0069c804ab 100644 (file)
@@ -593,15 +593,6 @@ AC_CHECK_LIB([pfm], [pfm_initialize],
              ])
 AM_CONDITIONAL([LTTNG_TOOLS_BUILD_WITH_LIBPFM], [test "x$have_libpfm" = "xyes"])
 
              ])
 AM_CONDITIONAL([LTTNG_TOOLS_BUILD_WITH_LIBPFM], [test "x$have_libpfm" = "xyes"])
 
-AC_ARG_ENABLE([git-version],
-              [AC_HELP_STRING([--disable-git-version],
-                              [Do not use the git version for the build])],
-              [have_git_version=$enableval], [have_git_version=yes]
-)
-
-AM_CONDITIONAL([LTTNG_TOOLS_BUILD_GIT_SOURCE],
-       [test "x${have_git_version}" = "xyes"])
-
 # For Python
 # SWIG version needed or newer:
 swig_version=2.0.0
 # For Python
 # SWIG version needed or newer:
 swig_version=2.0.0
index 5eeb0caff8a7aca7c20fc40b7dd09909a6f7c641..2c0019870f205787f940be1453dc286e953cdbe0 100644 (file)
@@ -1,68 +1,71 @@
-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
-## of lttng-tools.
+## This target generates an include file that contains the git version
+## string of the current branch, it must be continuously updated when
+## we build in the git repo and shipped in dist tarballs to reflect the
+## status of the tree when it was generated. If the tree is clean and
+## the current commit is tag a starting with "v", consider this a
+## release version and set an empty git version.
 ##
 ##
-version.h:
-       ##
-       ## We first create variables for the current git version and
-       ## the locations of the version.h and version.h.tmpl files.
-       ##
-       @echo $(ECHO_N) "Generating version.h... $(ECHO_C)"
-       @(version_h_tmpl="$(top_srcdir)/include/version.h.tmpl"; \
-       if [ -f "$${version_h_tmpl}" ]; then \
-               version_h="$(top_builddir)/include/version.h"; \
-               ##
-               ## Check whether we are in a git repo.
-               ##
-               git_describe="`$(GIT_DESCRIBE_CMD) 2>/dev/null`"; \
-               if [ $$? -eq 0 ]; then \
-                       git_version="$${git_describe}"; \
-               else \
-                       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.
-               ##
-               if [ ! -e "$${version_h}" ] || \
-                       [ "$${version_h_tmpl}" -nt "$${version_h}" ]; then \
-                       cp "$${version_h_tmpl}" "$${version_h}"; \
+## Here is what the inline script does:
+##
+## First, delete any stale "version.i.tmp" file.
+##
+## If "bootstrap" and ".git" exists in the top source directory and the git
+## executable is available, get the current git version string in the form:
+##
+##  "latest_tag"(-"number_of_commits_on_top")(-g"latest_commit_hash")(-dirty)
+##
+## And store it in "version.i.tmp", if the current commit is tagged, the tag
+## starts with "v" and the tree is clean, consider this a release version and
+## overwrite the git version with an empty string in "version.i.tmp".
+##
+## If we don't have a "version.i.tmp" nor a "version.i", generate an empty
+## string as a failover.
+##
+## If we don't have a "version.i" or we have both files and they are different,
+## copy "version.i.tmp" over "version.i". This way the dependent targets are
+## only rebuilt when the version string changes.
+##
+version_verbose = $(version_verbose_@AM_V@)
+version_verbose_ = $(version_verbose_@AM_DEFAULT_V@)
+version_verbose_0 = @echo "  GEN       " $@;
+
+version.i:
+       $(version_verbose)rm -f version.i.tmp; \
+       if (test -r "$(top_srcdir)/bootstrap" && test -r "$(top_srcdir)/.git") && \
+                       test -x "`which git 2>&1;true`"; then \
+               GIT_VERSION_STR="`cd "$(top_srcdir)" && git describe --tags --dirty`"; \
+               GIT_CURRENT_TAG="`cd "$(top_srcdir)" && git describe --tags --exact-match --match="v[0-9]*" HEAD 2> /dev/null`"; \
+               echo "#define GIT_VERSION \"$$GIT_VERSION_STR\"" > version.i.tmp; \
+               if ! $(GREP) -- "-dirty" version.i.tmp > /dev/null && \
+                               test "x$$GIT_CURRENT_TAG" != "x"; then \
+                       echo "#define GIT_VERSION \"\"" > version.i.tmp; \
                fi; \
                fi; \
-               echo $(ECHO_N) "git version: \"$${git_version}\"$(ECHO_C)"; \
-               ##
-               ## 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 -e "s'$${version_match}'$${new_version}'" "$${version_h}"; \
-               else \
-                       echo $(ECHO_N) " (cached)$(ECHO_C)"; \
+       fi; \
+       if test ! -f version.i.tmp; then \
+               if test ! -f version.i; then \
+                       echo '#define GIT_VERSION ""' > version.i; \
                fi; \
                fi; \
-               echo $(ECHO_N) "... $(ECHO_C)"; \
-       fi)
-       @echo "$(ECHO_T)ok"
+       elif test ! -f version.i || \
+                       test x"`cat version.i.tmp`" != x"`cat version.i`"; then \
+               mv version.i.tmp version.i; \
+       fi; \
+       rm -f version.i.tmp; \
+       true
 
 ##
 
 ##
-## version.h is defined as a .PHONY file even if it's a real file as
-## we want our routine to be ran for each build.
+## version.i is defined as a .PHONY target even if it's a real file,
+## we want the target to be re-run on every make.
 ##
 ##
-.PHONY: version.h
+.PHONY: version.i
 
 
-CLEANFILES = version.h
+CLEANFILES = version.i.tmp
 
 
-nodist_noinst_HEADERS = \
-       version.h
+##
+## Only clean "version.i" on dist-clean, we need to keep it on regular
+## clean when it's part of a dist tarball.
+##
+DISTCLEANFILES = version.i
 
 lttnginclude_HEADERS = \
        lttng/health.h \
 
 lttnginclude_HEADERS = \
        lttng/health.h \
@@ -79,8 +82,7 @@ lttnginclude_HEADERS = \
        lttng/load.h \
        lttng/endpoint.h \
        lttng/rotation.h \
        lttng/load.h \
        lttng/endpoint.h \
        lttng/rotation.h \
-       lttng/location.h \
-       version.h.tmpl
+       lttng/location.h
 
 lttngactioninclude_HEADERS= \
        lttng/action/action.h \
 
 lttngactioninclude_HEADERS= \
        lttng/action/action.h \
@@ -117,4 +119,6 @@ noinst_HEADERS = \
        lttng/channel-internal.h \
        lttng/rotate-internal.h \
        lttng/ref-internal.h \
        lttng/channel-internal.h \
        lttng/rotate-internal.h \
        lttng/ref-internal.h \
-       lttng/location-internal.h
+       lttng/location-internal.h \
+       version.h \
+       version.i
diff --git a/include/version.h b/include/version.h
new file mode 100644 (file)
index 0000000..0f3f7c8
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef VERSION_H
+#define VERSION_H
+
+/*
+ * Copyright (C) 2013-2014 - Raphaël Beamonte <raphael.beamonte@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2 only,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "version.i"
+
+#endif /* VERSION_H */
diff --git a/include/version.h.tmpl b/include/version.h.tmpl
deleted file mode 100644 (file)
index 133a90a..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef VERSION_H
-#define VERSION_H
-
-/*
- * Copyright (C) 2013-2014 - Raphaël Beamonte <raphael.beamonte@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#define GIT_VERSION    ""
-
-#endif /* VERSION_H */
This page took 0.03029 seconds and 5 git commands to generate.