From 8aa29447aab7e18fb6c1f2b151dfeca090428297 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Thu, 19 Mar 2026 04:52:33 +0300 Subject: [PATCH 1/4] Generate version.py file for sdist Closes #327 (cherry picked from commit 72a0a5a9aeb01bdaf91cb1c5dd0fe915f237e1dc) --- .gitignore | 1 + meson.build | 18 +++++++++ scripts/gitversion.py | 89 ++++++++++++++++++++++++++++++------------- 3 files changed, 81 insertions(+), 27 deletions(-) mode change 100644 => 100755 scripts/gitversion.py diff --git a/.gitignore b/.gitignore index a3a45188..26d421f7 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ venv/ *.swp build/ .local/ +version.py diff --git a/meson.build b/meson.build index 3f4f9c4f..45c0096f 100644 --- a/meson.build +++ b/meson.build @@ -6,3 +6,21 @@ py = import('python').find_installation(pure: false) libzz = dependency('zz', version: '>= 0.7.0') py.extension_module('gmp', ['fmt.c', 'gmp.c', 'utils.c'], install: true, dependencies: libzz) +install_dir = py.get_install_dir() + +# Generate version.py for sdist +meson.add_dist_script(['scripts/gitversion.py', '--meson-dist', + '--write', 'version.py']) +fs = import('fs') +if not fs.exists('version.py') + generate_version = custom_target('generate-version', + install: true, + build_always_stale: true, + build_by_default: true, + output: 'version.py', + input: 'scripts/gitversion.py', + command: [py, '@INPUT@', '--write', + '@OUTPUT@'], + install_dir: install_dir, + install_tag: 'python-runtime') +endif diff --git a/scripts/gitversion.py b/scripts/gitversion.py old mode 100644 new mode 100755 index edafffa5..2d121d65 --- a/scripts/gitversion.py +++ b/scripts/gitversion.py @@ -1,39 +1,74 @@ #!/usr/bin/env python3 + +import argparse import os import re import subprocess +import sys +import textwrap def git_version(): - # Append last commit date and hash to dev version information, - # if available - return version, git_hash - + p = subprocess.Popen(["git", "describe"], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + cwd=os.path.dirname(__file__)) + out, err = p.communicate() + if p.returncode: + raise RuntimeError("Non-zero return code from git-describe: " + f"{p.returncode}") + out = out.decode("ascii").removesuffix("\n") -if __name__ == "__main__": - try: - p = subprocess.Popen(["git", "describe"], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - cwd=os.path.dirname(__file__)) - except FileNotFoundError: - exit(1) + version, *other = out.removesuffix("\n").split("-") + if other: + g, h = other + m = re.match("(.*)([0-9]+)", version) + version = m[1] + str(int(m[2])+1) + ".dev" + g + git_hash = h else: - out, err = p.communicate() - if p.returncode: - exit(p.returncode) - out = out.decode("ascii").removesuffix("\n") - - version, *other = out.removesuffix("\n").split("-") - if other: - g, h = other - m = re.match("(.*)([0-9]+)", version) - version = m[1] + str(int(m[2])+1) + ".dev" + g - git_hash = h - else: - git_hash = "" + git_hash = "" if git_hash: version += "+" + git_hash - print(version) - exit(0) + return version + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--write", help="Save version to this file") + parser.add_argument( + "--meson-dist", + help="Output path is relative to MESON_DIST_ROOT", + action="store_true" + ) + args = parser.parse_args() + + try: + version = git_version() + except (FileNotFoundError, RuntimeError): + sys.path.insert(0, os.getcwd()) + from version import version + + if args.write: + template = textwrap.dedent(f""" + version = "{version}" + __version__ = version + """) + + outfile = args.write + if args.meson_dist: + outfile = os.path.join( + os.environ.get("MESON_DIST_ROOT", ""), + outfile + ) + + # Print human readable output path + relpath = os.path.relpath(outfile) + if relpath.startswith("."): + relpath = outfile + + with open(outfile, "w") as f: + print(f"Saving version to {relpath}") + f.write(template) + else: + print(version) From 60de148f2e1c332c21c39d0d41f78e4f27a93115 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Thu, 19 Mar 2026 04:53:14 +0300 Subject: [PATCH 2/4] Ignore dist/ (cherry picked from commit 887a1dd8616c83868cb481772912d3af7567af84) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 26d421f7..59e5bd42 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,6 @@ venv/ *.egg-info/ *.swp build/ +dist/ .local/ version.py From 33937b9ca0bc48be4997c2cb56d6bc3edeb853e9 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Thu, 19 Mar 2026 05:46:04 +0300 Subject: [PATCH 3/4] Print module version in pytest_report_header() (cherry picked from commit 1d7e882526d7fe22d5b35203f0f3fac008375b60) --- tests/conftest.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index bd334309..5e638a67 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -23,6 +23,8 @@ def pytest_report_header(config): Bits per digit : {gmp.mpz_info.bits_per_digit} sizeof(zz_digit_t): {gmp.mpz_info.sizeof_digit} Maximal bit count : {gmp.mpz_info.bitcnt_max} + + The gmp module v{gmp.__version__} """) From 64a549ba12d6b35fcc6bdd2d02812dd31b3e4210 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Fri, 20 Mar 2026 00:24:03 +0300 Subject: [PATCH 4/4] Rename version.py -> _version.py (cherry picked from commit a474e5361c36ce45b39733327cb5966057b1e6e7) --- meson.build | 6 +++--- scripts/gitversion.py | 9 ++------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/meson.build b/meson.build index 45c0096f..b37af254 100644 --- a/meson.build +++ b/meson.build @@ -10,14 +10,14 @@ install_dir = py.get_install_dir() # Generate version.py for sdist meson.add_dist_script(['scripts/gitversion.py', '--meson-dist', - '--write', 'version.py']) + '--write', '_version.py']) fs = import('fs') -if not fs.exists('version.py') +if not fs.exists('_version.py') generate_version = custom_target('generate-version', install: true, build_always_stale: true, build_by_default: true, - output: 'version.py', + output: '_version.py', input: 'scripts/gitversion.py', command: [py, '@INPUT@', '--write', '@OUTPUT@'], diff --git a/scripts/gitversion.py b/scripts/gitversion.py index 2d121d65..6dac5ce3 100755 --- a/scripts/gitversion.py +++ b/scripts/gitversion.py @@ -5,7 +5,6 @@ import re import subprocess import sys -import textwrap def git_version(): @@ -47,14 +46,10 @@ def git_version(): version = git_version() except (FileNotFoundError, RuntimeError): sys.path.insert(0, os.getcwd()) - from version import version + from _version import version if args.write: - template = textwrap.dedent(f""" - version = "{version}" - __version__ = version - """) - + template = f'version = "{version}"' outfile = args.write if args.meson_dist: outfile = os.path.join(