From 90eb03801a1098801d04988a2e4bf477c7bf5103 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Thu, 25 May 2023 14:36:49 -0400 Subject: [PATCH] build: move script to generate version.i to its own file Move the script from src/common/Makefile.am to its own file. This will make it easier to read, modify and lint. I inlined the big comment from Makefile.am in the new script. I tried to keep the code as-is as much as possible, but I needed to tweak a few things. - Replace $(FOO) with $FOO - The script expects to get the top srcdir and the grep and sed binaries through the TOP_SRCDIR, GREP and SED env var. GREP and SED are optional, to make it easier to run the script by hand Change-Id: Iaa8948018785e0de4250285110b78ccea1abaedb Signed-off-by: Simon Marchi Reviewed-on: https://review.lttng.org/c/babeltrace/+/10095 Reviewed-by: Michael Jeanson --- src/common/Makefile.am | 77 ++----------------------------- src/common/gen-version-i.sh | 91 +++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 73 deletions(-) create mode 100755 src/common/gen-version-i.sh diff --git a/src/common/Makefile.am b/src/common/Makefile.am index da869ebd..36570540 100644 --- a/src/common/Makefile.am +++ b/src/common/Makefile.am @@ -19,90 +19,21 @@ noinst_HEADERS = \ mmap-align.h \ safe.h -# The following section is based on a similar feature in 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. -## -## 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 a "version.i" is present, for example when building -## from a distribution tarball, get the git_version using grep. -## -## Fetch the BT_VERSION_EXTRA_NAME define from "version/extra_version_name" and output it -## to "version.i.tmp". -## -## Fetch the BT_VERSION_EXTRA_DESCRIPTION define from "version/extra_version_description", -## sanitize and format it with a sed script to replace all non-alpha-numeric values -## with "-" and join all lines by replacing "\n" with litteral string c-style "\n" and -## output it to "version.i.tmp". -## -## Repeat the same logic for the "version/extra_patches" directory. -## Data fetched from "version/extra_patches" must be sanitized and -## formatted. -## The data is fetched using "ls" with an ignore pattern for the README.adoc file. -## The sanitize step uses sed with a script to replace all -## non-alpha-numeric values, except " " (space), to "-". -## The formatting step uses sed with a script to join all lines -## by replacing "\n" with litteral string c-style "\n". -## -## If we don't have a "version.i" or we have both files (version.i, version.i.tmp) -## and they are different, copy "version.i.tmp" over "version.i". -## This way the dependent targets are only rebuilt when the git version -## string or either one of extra version string change. -## + 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 ! -f version.i && test -f "$(top_srcdir)/include/version.i"); then \ - cp "$(top_srcdir)/include/version.i" version.i; \ - fi; \ - 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 BT_VERSION_GIT \"$$GIT_VERSION_STR\"" > version.i.tmp; \ - if ! $(GREP) -- "-dirty" version.i.tmp > /dev/null && \ - test "x$$GIT_CURRENT_TAG" != "x"; then \ - echo "#define BT_VERSION_GIT \"\"" > version.i.tmp; \ - fi; \ - fi; \ - if test ! -f version.i.tmp; then \ - if test -f version.i; then \ - $(GREP) "^#define \bBT_VERSION_GIT\b.*" version.i > version.i.tmp; \ - else \ - echo '#define BT_VERSION_GIT ""' > version.i.tmp; \ - fi; \ - fi; \ - echo "#define BT_VERSION_EXTRA_NAME \"`$(SED) -n '1p' "$(top_srcdir)/version/extra_version_name" 2> /dev/null`\"" >> version.i.tmp; \ - echo "#define BT_VERSION_EXTRA_DESCRIPTION \"`$(SED) -E ':a ; N ; $$!ba ; s/[^a-zA-Z0-9 \n\t\.,]/-/g ; s/\r{0,1}\n/\\\n/g' "$(top_srcdir)/version/extra_version_description" 2> /dev/null`\"" >> version.i.tmp; \ - echo "#define BT_VERSION_EXTRA_PATCHES \"`ls -1 "$(top_srcdir)/version/extra_patches" | $(GREP) -v '^README.adoc' | $(SED) -E ':a ; N ; $$!ba ; s/[^a-zA-Z0-9 \n\t\.]/-/g ; s/\r{0,1}\n/\\\n/g' 2> /dev/null`\"" >> version.i.tmp; \ - if 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_verbose)GREP=$(GREP) SED=$(SED) TOP_SRCDIR="$(top_srcdir)" $(SHELL) $(srcdir)/gen-version-i.sh + +dist_noinst_SCRIPTS = gen-version-i.sh ## ## version.i is defined as a .PHONY target even if it's a real file, diff --git a/src/common/gen-version-i.sh b/src/common/gen-version-i.sh new file mode 100755 index 00000000..481779ac --- /dev/null +++ b/src/common/gen-version-i.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env sh +# +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2023 EfficiOS, Inc. + +# This file 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 a tag starting with "v", consider this a +# release version and set an empty git version. + +set -o nounset + +if test "${TOP_SRCDIR:-}" = ""; then + echo "$0: TOP_SRCDIR is not set" >&2 + exit 1 +fi + +GREP=${GREP:-grep} +SED=${SED:-sed} + +# Delete any stale "version.i.tmp" file. +rm -f version.i.tmp + +if (test ! -f version.i && test -f "$TOP_SRCDIR/include/version.i"); then + cp "$TOP_SRCDIR/include/version.i" version.i +fi + +# 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 (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 || true 2> /dev/null`" + echo "#define BT_VERSION_GIT \"$GIT_VERSION_STR\"" > version.i.tmp + + if ! $GREP -- "-dirty" version.i.tmp > /dev/null && + test "x$GIT_CURRENT_TAG" != "x"; then + echo "#define BT_VERSION_GIT \"\"" > version.i.tmp + fi +fi + +# If we don't have a "version.i.tmp" nor a "version.i", generate an empty +# string as a failover. If a "version.i" is present, for example when building +# from a distribution tarball, get the git_version using grep. +if test ! -f version.i.tmp; then + if test -f version.i; then + $GREP "^#define \bBT_VERSION_GIT\b.*" version.i > version.i.tmp + else + echo '#define BT_VERSION_GIT ""' > version.i.tmp + fi +fi + +# Fetch the BT_VERSION_EXTRA_NAME define from "version/extra_version_name" and output it +# to "version.i.tmp". +echo "#define BT_VERSION_EXTRA_NAME \"`$SED -n '1p' "$TOP_SRCDIR/version/extra_version_name" 2> /dev/null`\"" >> version.i.tmp + +# Fetch the BT_VERSION_EXTRA_DESCRIPTION define from "version/extra_version_description", +# sanitize and format it with a sed script to replace all non-alpha-numeric values +# with "-" and join all lines by replacing "\n" with litteral string c-style "\n" and +# output it to "version.i.tmp". +echo "#define BT_VERSION_EXTRA_DESCRIPTION \"`$SED -E ':a ; N ; $!ba ; s/[^a-zA-Z0-9 \n\t\.,]/-/g ; s/\r{0,1}\n/\\\n/g' "$TOP_SRCDIR/version/extra_version_description" 2> /dev/null`\"" >> version.i.tmp + +# Repeat the same logic for the "version/extra_patches" directory. +# Data fetched from "version/extra_patches" must be sanitized and +# formatted. +# The data is fetched using "ls" with an ignore pattern for the README.adoc file. +# The sanitize step uses sed with a script to replace all +# non-alpha-numeric values, except " " (space), to "-". +# The formatting step uses sed with a script to join all lines +# by replacing "\n" with litteral string c-style "\n". +echo "#define BT_VERSION_EXTRA_PATCHES \"`ls -1 "$TOP_SRCDIR/version/extra_patches" | $GREP -v '^README.adoc' | $SED -E ':a ; N ; $!ba ; s/[^a-zA-Z0-9 \n\t\.]/-/g ; s/\r{0,1}\n/\\\n/g' 2> /dev/null`\"" >> version.i.tmp + +# If we don't have a "version.i" or we have both files (version.i, version.i.tmp) +# and they are different, copy "version.i.tmp" over "version.i". +# This way the dependent targets are only rebuilt when the git version +# string or either one of extra version string change. +if 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 -- 2.34.1