meson: restore tools/meson-vcs-tag.sh

This conceptually reverts e95acdfe1d,
but the actual contents of the script are taken from the command invocation
in meson with all the updates that happened in the meantime.

One small change is that I replaced () by {}: this avoids one subprocess spawn.
People were worried about the cost of vcs_tag(), and this microoptimization may
help a bit. I measured the speed on machine, and noop rebuilds are still about
100–120 ms.

The logic is entirely moved to the script. This makes the meson config simpler
and also makes it easier to use it externally.

The script is needed for in-place rpm builds, see README.build-in-place.md [1],
where it is invoked from the spec file to determine the project version.

[1] https://src.fedoraproject.org/rpms/systemd/blob/rawhide/f/README.build-in-place.md
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2023-09-11 16:46:04 +02:00
parent ba4d7e8029
commit 1a71ac07ad
2 changed files with 31 additions and 16 deletions

View file

@ -1808,26 +1808,13 @@ xml_helper_py = find_program('tools/xml_helper.py')
############################################################
version_tag = get_option('version-tag')
# Check that we have either .git/ (a normal clone) or a .git file (a work-tree) and that we don't
# get confused if a tarball is extracted in a higher-level git repository.
if version_tag == '' and git.found() and fs.exists(project_source_root / '.git')
# If the working tree has no tags (CI builds), the first git-describe will fail
# and we fall back to project_version-commitid instead.
version_cmd = '''(git -C "$1" describe --abbrev=7 --dirty=^ 2>/dev/null ||
echo "$2-$(git -C "$1" describe --always --abbrev=7)") |
sed 's/^v//; s/-rc/~rc/' '''
else
version_cmd = '''echo "$2" '''
endif
version_h = vcs_tag(
input : 'src/version/version.h.in',
output : 'version.h',
# TODO: Use 'sh' variable with meson >= 0.63.0
command: ['sh', '-euc', version_cmd,
'_',
command: [project_source_root / 'tools/meson-vcs-tag.sh',
project_source_root,
version_tag == '' ? meson.project_version() : version_tag,
meson.project_version(),
version_tag,
])
shared_lib_tag = get_option('shared-lib-tag')

28
tools/meson-vcs-tag.sh Executable file
View file

@ -0,0 +1,28 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later
set -eu
set -o pipefail
dir="${1:?}"
fallback="${2:?}"
version_tag="$3"
if [ -n "${version_tag}" ]; then
# If -Dversion_tag= was used, just use that without further changes.
echo "${version_tag}"
else
# Check that we have either .git/ (a normal clone) or a .git file (a work-tree)
# and that we don't get confused if a tarball is extracted in a higher-level
# git repository.
#
# If the working tree has no tags (CI builds), the first git-describe will fail
# and we fall back to project_version-commitid instead.
if [ -e "${dir}/.git" ]; then
c="$(git -C "$dir" describe --abbrev=7 --dirty=^ 2>/dev/null ||
echo "${fallback}-$(git -C "$dir" describe --always --abbrev=7)")"
else
c="${fallback}"
fi
echo "$c" | sed 's/^v//; s/-rc/~rc/'
fi