From 337d64f0c475bd9617f2fb86417071b65cae8330 Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Fri, 27 Apr 2018 17:27:29 -0400 Subject: [PATCH] Print the git version used to build from a distribution tarball MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Jérémie Galarneau --- .gitignore | 3 +- configure.ac | 9 -- include/Makefile.am | 122 +++++++++++++------------- include/{version.h.tmpl => version.h} | 2 +- 4 files changed, 66 insertions(+), 70 deletions(-) rename include/{version.h.tmpl => version.h} (97%) diff --git a/.gitignore b/.gitignore index 7600cf6d5..675b44e82 100644 --- a/.gitignore +++ b/.gitignore @@ -131,6 +131,7 @@ health_check /benchmark/ -/include/version.h +/include/version.i +/include/version.i.tmp classnoinst.stamp diff --git a/configure.ac b/configure.ac index 07ebecd0f..f5b105e4b 100644 --- a/configure.ac +++ b/configure.ac @@ -593,15 +593,6 @@ AC_CHECK_LIB([pfm], [pfm_initialize], ]) 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 diff --git a/include/Makefile.am b/include/Makefile.am index 5eeb0caff..2c0019870 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -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; \ - 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; \ - 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 \ @@ -79,8 +82,7 @@ lttnginclude_HEADERS = \ lttng/load.h \ lttng/endpoint.h \ lttng/rotation.h \ - lttng/location.h \ - version.h.tmpl + lttng/location.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/location-internal.h + lttng/location-internal.h \ + version.h \ + version.i diff --git a/include/version.h.tmpl b/include/version.h similarity index 97% rename from include/version.h.tmpl rename to include/version.h index 133a90ace..0f3f7c80c 100644 --- a/include/version.h.tmpl +++ b/include/version.h @@ -18,6 +18,6 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define GIT_VERSION "" +#include "version.i" #endif /* VERSION_H */ -- 2.34.1