Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dnsdist: Generate tarballs via meson dist #15163

Merged
merged 3 commits into from
Feb 17, 2025
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion pdns/dnsdistdist/builder-support/gen-version

This file was deleted.

77 changes: 77 additions & 0 deletions pdns/dnsdistdist/builder-support/gen-version
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#!/bin/sh
if [ ! -z "${BUILDER_VERSION}" ]; then
printf ${BUILDER_VERSION}
exit 0
fi

VERSION="unknown"

DIRTY=""
git status | grep -q clean || DIRTY='.dirty'

# Special environment variable to signal that we are building a release, as this
# has consequenses for the version number.
if [ "${IS_RELEASE}" = "YES" ]; then
TAG="$(git describe --tags --exact-match 2> /dev/null | cut -d- -f 2-)"
if [ -n "${TAG}" ]; then
# We're on a tag
echo "${TAG}${DIRTY}" > .version
printf "${TAG}${DIRTY}"
exit 0
fi
echo 'This is not a tag, either tag this commit or do not set $IS_RELEASE' >&2
exit 1
fi

#
# Generate the version number based on the branch
#
if [ ! -z "$(git rev-parse --abbrev-ref HEAD 2> /dev/null)" ]; then
if [ -n "${BUILDER_MODULES}" ]; then
match=${BUILDER_MODULES}
[ $match = "authoritative" ] && match='auth'
[ $match = "recursor" ] && match='rec'
GIT_VERSION="$(git describe --match=${match}-* --tags | cut -d- -f2-)"
if [ $(echo ${GIT_VERSION} | awk -F"-" '{print NF-1}') = '3' ]; then
# A prerelease happened before
LAST_TAG="$(echo ${GIT_VERSION} | cut -d- -f1-2)"
COMMITS_SINCE_TAG="$(echo ${GIT_VERSION} | cut -d- -f3)"
GIT_HASH="$(echo ${GIT_VERSION} | cut -d- -f4)"
elif [ $(echo ${GIT_VERSION} | awk -F"-" '{print NF-1}') = '1' ]; then
# Exactly on a pre-release
LAST_TAG="$(echo ${GIT_VERSION} | cut -d- -f1-2)"
else
LAST_TAG="$(echo ${GIT_VERSION} | cut -d- -f1)"
COMMITS_SINCE_TAG="$(echo ${GIT_VERSION} | cut -d- -f2)"
GIT_HASH="$(echo ${GIT_VERSION} | cut -d- -f3)"
fi
fi

if [ -z "${GIT_VERSION}" ]; then
# BUILDER_SUPPORT has more than one product listed, fall back to the 0.0.0 logic

# We used 0.0.XXXXgHASH for master in the previous incarnation of our build pipeline.
# This now becomes 0.0.XXXX.0.gHASH, as 0.0.0.XXXX.gHASH (which is more correct)
# would break upgrades for those running master
# This _should_ be ok for forever is we stick to X.Y.Z for version numbers
LAST_TAG=0.0
COMMITS_SINCE_TAG="$(git rev-list --count 12c868770afc20b6cc0da439d881105151d557dd..HEAD 2> /dev/null).0"
[ "${COMMITS_SINCE_TAG}" = ".0" ] && COMMITS_SINCE_TAG=0.0
GIT_HASH="g$(git rev-parse HEAD | cut -c1-10 2> /dev/null)"
fi

BRANCH=".$(git rev-parse --abbrev-ref HEAD | perl -p -e 's/[^[:alnum:]]//g;')"

TAG="$(git describe --tags --exact-match 2> /dev/null | cut -d- -f 2-)"
if [ -n "${TAG}" ]; then # We're exactly on a tag
COMMITS_SINCE_TAG="0"
GIT_HASH="g$(git show --no-patch --format=format:%h HEAD 2>/dev/null)"
if [ -z "$GIT_HASH" ]; then
GIT_HASH="g$(git show --format=format:%h HEAD | head -n1)"
fi
fi

VERSION="${LAST_TAG}.${COMMITS_SINCE_TAG}${BRANCH}.${GIT_HASH}${DIRTY}"
fi

printf $VERSION
36 changes: 36 additions & 0 deletions pdns/dnsdistdist/meson-dist-script.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#!/bin/sh -e

echo Running meson-dist-script
echo PWD=$(pwd)
echo MESON_SOURCE_ROOT=$MESON_SOURCE_ROOT
echo MESON_PROJECT_DIST_ROOT=$MESON_PROJECT_DIST_ROOT

cd "$MESON_PROJECT_DIST_ROOT"

# Get all symlinks
symlinks=$(find . -type l)

# If these two get out-of-sync, fix it! It used to be a symlink but that can no longer be as we are
# working with a partial checkout in the dist root dir.
cmp "$MESON_SOURCE_ROOT"/../../builder-support/gen-version "$MESON_PROJECT_DIST_ROOT"/builder-support/gen-version

# Get the dereffed symbolic links (the actual files being pointed to) from the source dir
# Extract them over the existing symbolic links
tar -C "$MESON_SOURCE_ROOT" -hcf - $symlinks | tar -xf - -C "$MESON_PROJECT_DIST_ROOT"

# Run autoconf for people using autotools to build, this creates a configure script with VERSION set
echo Running autoreconf -vi so distfile is still usable for autotools building
# Run autoconf for people using autotools to build, this creates a configure sc
autoreconf -vi

# Generate man pages
cd "$MESON_PROJECT_BUILD_ROOT"
meson compile man-pages
cp -vp *.1 "$MESON_PROJECT_DIST_ROOT"

rm -rf "$MESON_PROJECT_DIST_ROOT"/autom4te.cache

# Generate a few files to reduce build dependencies
echo 'If the below command generates an error, remove dnslabeltext.cc from source dir (remains of an autotools build?) and start again with a clean meson setup'
ninja libdnsdist-dnslabeltext.a.p/dnslabeltext.cc
cp -vp libdnsdist-dnslabeltext.a.p/dnslabeltext.cc "$MESON_PROJECT_DIST_ROOT"
51 changes: 32 additions & 19 deletions pdns/dnsdistdist/meson.build
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
project(
'dnsdist',
['c', 'cpp'],
version: run_command('../../builder-support' / 'gen-version', check: true).stdout().strip(),
version: run_command('version.sh', 'get-vcs', check: true).stdout().strip(),
license: 'GPLv2',
license_files: 'NOTICE',
meson_version: '>= 1.3.0',
Expand All @@ -12,6 +12,12 @@ project(
'b_pie=true',
],
)
meson.add_dist_script('meson-dist-script.sh')

# When running meson dist, the command below produces multiple lines on stderr:
# Unable to evaluate subdir([]) in AstInterpreter --> Skipping
meson.add_dist_script('version.sh', 'set-dist', meson.project_version())

add_project_arguments('-DDNSDIST', language: 'cpp')


Expand Down Expand Up @@ -568,27 +574,34 @@ if get_option('man-pages') and python.found()
foreach tool, info: tools
if 'manpages' in info
foreach man_page: info['manpages']
generated_man_pages += man_page
if not fs.is_file(man_page)
generated_man_pages += man_page
endif
endforeach
endif
endforeach
custom_target(
'man-pages',
input: man_pages,
output: generated_man_pages,
install: true,
install_dir: join_paths(get_option('mandir'), 'man1'),
command: [
python,
product_source_dir / docs_dir / 'generate-man-pages.py',
'--build-root', '@BUILD_ROOT@',
'--source-root', '@SOURCE_ROOT@',
'--venv-name', 'venv-dnsdist-man-pages',
'--requirements-file', docs_dir / 'requirements.txt',
'--source-directory', docs_dir,
'--target-directory', '@BUILD_ROOT@',
] + man_pages,
)
if generated_man_pages.length() != 0
summary('Generating man pages', true, section: 'Manual Pages')
custom_target(
'man-pages',
input: man_pages,
output: generated_man_pages,
install: true,
install_dir: join_paths(get_option('mandir'), 'man1'),
command: [
python,
product_source_dir / docs_dir / 'generate-man-pages.py',
'--build-root', '@BUILD_ROOT@',
'--source-root', '@SOURCE_ROOT@',
'--venv-name', 'venv-dnsdist-man-pages',
'--requirements-file', docs_dir / 'requirements.txt',
'--source-directory', docs_dir,
'--target-directory', '@BUILD_ROOT@',
] + man_pages,
)
else
summary('Generating man pages', false, section: 'Manual Pages')
endif
endif

if dep_systemd_prog.found()
Expand Down
1 change: 1 addition & 0 deletions pdns/dnsdistdist/version.sh