Bump oldest supported Python to 3.10, eliminate setuptools-scm (#1842)

* Supply MacOS deployment target to delocate, use build+uv frontend

This shaves off multiple minutes from the wheel builds alone.

Also revert to trusted publishing for wheel uploads as it is now set up.

* Bump oldest supported Python to 3.10, eliminate setuptools-scm

The version is now a string again, under the same attribute as it was
before. This is a pragmatic decision in order to be able to upload wheels
again, possibly directly from main.

We could in the future also set the Python version to a development version
if we want to avoid accidental uploads of `main`.

* Add a note on supported Python versions in the docs

Also fixes the setuptools failure observed in the latest CI by pinning
to the last version before v73 until the problem is identified and resolved.
This commit is contained in:
Nicholas Junge 2024-09-04 18:42:07 +02:00 committed by GitHub
parent c19cfee61e
commit 986423a62d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 47 additions and 93 deletions

View File

@ -18,7 +18,7 @@ jobs:
- name: Install Python 3.12 - name: Install Python 3.12
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: 3.12 python-version: "3.12"
- run: python -m pip install build - run: python -m pip install build
- name: Build sdist - name: Build sdist
run: python -m build --sdist run: python -m build --sdist
@ -40,68 +40,23 @@ jobs:
with: with:
fetch-depth: 0 fetch-depth: 0
- uses: actions/setup-python@v5
name: Install Python 3.12
with:
python-version: "3.12"
- run: pip install --upgrade pip uv
- name: Set up QEMU - name: Set up QEMU
if: runner.os == 'Linux' if: runner.os == 'Linux'
uses: docker/setup-qemu-action@v3 uses: docker/setup-qemu-action@v3
with: with:
platforms: all platforms: all
- name: Build 3.8 wheels on ${{ matrix.os }} using cibuildwheel - name: Build wheels on ${{ matrix.os }} using cibuildwheel
uses: pypa/cibuildwheel@v2.20 uses: pypa/cibuildwheel@v2.20
env: env:
CIBW_BUILD: "cp38-*" CIBW_BUILD: "cp310-* cp311-* cp312-*"
CIBW_SKIP: "*-musllinux_*" CIBW_BUILD_FRONTEND: "build[uv]"
CIBW_TEST_SKIP: "cp38-macosx_*:arm64"
CIBW_ARCHS_LINUX: auto64 aarch64
CIBW_ARCHS_WINDOWS: auto64
CIBW_BEFORE_ALL_LINUX: bash .github/install_bazel.sh
# Grab the rootless Bazel installation inside the container.
CIBW_ENVIRONMENT_LINUX: PATH=$PATH:$HOME/bin
CIBW_TEST_COMMAND: python {project}/bindings/python/google_benchmark/example.py
- name: Build 3.9 wheels on ${{ matrix.os }} using cibuildwheel
uses: pypa/cibuildwheel@v2.20
env:
CIBW_BUILD: "cp39-*"
CIBW_SKIP: "*-musllinux_*"
CIBW_TEST_SKIP: "cp38-macosx_*:arm64"
CIBW_ARCHS_LINUX: auto64 aarch64
CIBW_ARCHS_WINDOWS: auto64
CIBW_BEFORE_ALL_LINUX: bash .github/install_bazel.sh
# Grab the rootless Bazel installation inside the container.
CIBW_ENVIRONMENT_LINUX: PATH=$PATH:$HOME/bin
CIBW_TEST_COMMAND: python {project}/bindings/python/google_benchmark/example.py
- name: Build 3.10 wheels on ${{ matrix.os }} using cibuildwheel
uses: pypa/cibuildwheel@v2.20
env:
CIBW_BUILD: "cp310-*"
CIBW_SKIP: "*-musllinux_*"
CIBW_TEST_SKIP: "cp38-macosx_*:arm64"
CIBW_ARCHS_LINUX: auto64 aarch64
CIBW_ARCHS_WINDOWS: auto64
CIBW_BEFORE_ALL_LINUX: bash .github/install_bazel.sh
# Grab the rootless Bazel installation inside the container.
CIBW_ENVIRONMENT_LINUX: PATH=$PATH:$HOME/bin
CIBW_TEST_COMMAND: python {project}/bindings/python/google_benchmark/example.py
- name: Build 3.11 wheels on ${{ matrix.os }} using cibuildwheel
uses: pypa/cibuildwheel@v2.20
env:
CIBW_BUILD: "cp311-*"
CIBW_SKIP: "*-musllinux_*"
CIBW_TEST_SKIP: "cp38-macosx_*:arm64"
CIBW_ARCHS_LINUX: auto64 aarch64
CIBW_ARCHS_WINDOWS: auto64
CIBW_BEFORE_ALL_LINUX: bash .github/install_bazel.sh
# Grab the rootless Bazel installation inside the container.
CIBW_ENVIRONMENT_LINUX: PATH=$PATH:$HOME/bin
CIBW_TEST_COMMAND: python {project}/bindings/python/google_benchmark/example.py
- name: Build 3.12 wheels on ${{ matrix.os }} using cibuildwheel
uses: pypa/cibuildwheel@v2.20
env:
CIBW_BUILD: "cp312-*"
CIBW_SKIP: "*-musllinux_*" CIBW_SKIP: "*-musllinux_*"
CIBW_TEST_SKIP: "cp38-macosx_*:arm64" CIBW_TEST_SKIP: "cp38-macosx_*:arm64"
CIBW_ARCHS_LINUX: auto64 aarch64 CIBW_ARCHS_LINUX: auto64 aarch64
@ -110,6 +65,8 @@ jobs:
# Grab the rootless Bazel installation inside the container. # Grab the rootless Bazel installation inside the container.
CIBW_ENVIRONMENT_LINUX: PATH=$PATH:$HOME/bin CIBW_ENVIRONMENT_LINUX: PATH=$PATH:$HOME/bin
CIBW_TEST_COMMAND: python {project}/bindings/python/google_benchmark/example.py CIBW_TEST_COMMAND: python {project}/bindings/python/google_benchmark/example.py
# unused by Bazel, but needed explicitly by delocate on MacOS.
MACOSX_DEPLOYMENT_TARGET: "10.14"
- name: Upload Google Benchmark ${{ matrix.os }} wheels - name: Upload Google Benchmark ${{ matrix.os }} wheels
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
@ -133,11 +90,11 @@ jobs:
name: Publish google-benchmark wheels to PyPI name: Publish google-benchmark wheels to PyPI
needs: [merge_wheels] needs: [merge_wheels]
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.event_name == 'release' && github.event.action == 'published'
permissions:
id-token: write
steps: steps:
- uses: actions/download-artifact@v4 - uses: actions/download-artifact@v4
with: with:
path: dist path: dist
- uses: pypa/gh-action-pypi-publish@release/v1 - uses: pypa/gh-action-pypi-publish@release/v1
with:
user: __token__
password: ${{ secrets.PYPI_PASSWORD }}

View File

@ -1,17 +1,17 @@
repos: repos:
- repo: https://github.com/keith/pre-commit-buildifier - repo: https://github.com/keith/pre-commit-buildifier
rev: 6.4.0 rev: 7.1.2
hooks: hooks:
- id: buildifier - id: buildifier
- id: buildifier-lint - id: buildifier-lint
- repo: https://github.com/pre-commit/mirrors-mypy - repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.11.0 rev: v1.11.1
hooks: hooks:
- id: mypy - id: mypy
types_or: [ python, pyi ] types_or: [ python, pyi ]
args: [ "--ignore-missing-imports", "--scripts-are-modules" ] args: [ "--ignore-missing-imports", "--scripts-are-modules" ]
- repo: https://github.com/astral-sh/ruff-pre-commit - repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.4.10 rev: v0.6.1
hooks: hooks:
- id: ruff - id: ruff
args: [ --fix, --exit-non-zero-on-fix ] args: [ --fix, --exit-non-zero-on-fix ]

View File

@ -49,7 +49,8 @@ from google_benchmark._benchmark import (
oNone as oNone, oNone as oNone,
oNSquared as oNSquared, oNSquared as oNSquared,
) )
from google_benchmark.version import __version__ as __version__
__version__ = "1.9.0"
class __OptionMaker: class __OptionMaker:

View File

@ -1,7 +0,0 @@
from importlib.metadata import PackageNotFoundError, version
try:
__version__ = version("google-benchmark")
except PackageNotFoundError:
# package is not installed
pass

View File

@ -11,3 +11,9 @@ distributions include newer versions, for example:
* Ubuntu 20.04 provides CMake 3.16.3 * Ubuntu 20.04 provides CMake 3.16.3
* Debian 11.4 provides CMake 3.18.4 * Debian 11.4 provides CMake 3.18.4
* Ubuntu 22.04 provides CMake 3.22.1 * Ubuntu 22.04 provides CMake 3.22.1
## Python
The Python bindings require Python 3.10+ as of v1.9.0 (2024-08-16) for installation from PyPI.
Building from source for older versions probably still works, though. See the [user guide](python_bindings.md) for details on how to build from source.
The minimum theoretically supported version is Python 3.8, since the used bindings generator (nanobind) only supports Python 3.8+.

View File

@ -8,16 +8,24 @@
* `git log $(git describe --abbrev=0 --tags)..HEAD` gives you the list of * `git log $(git describe --abbrev=0 --tags)..HEAD` gives you the list of
commits between the last annotated tag and HEAD commits between the last annotated tag and HEAD
* Pick the most interesting. * Pick the most interesting.
* Create one last commit that updates the version saved in `CMakeLists.txt` and `MODULE.bazel` * Create one last commit that updates the version saved in `CMakeLists.txt`, `MODULE.bazel`,
to the release version you're creating. (This version will be used if benchmark is installed and `bindings/python/google_benchmark/__init__.py` to the release version you're creating.
from the archive you'll be creating in the next step.) (This version will be used if benchmark is installed from the archive you'll be creating
in the next step.)
``` ```
project (benchmark VERSION 1.8.0 LANGUAGES CXX) # CMakeLists.txt
project (benchmark VERSION 1.9.0 LANGUAGES CXX)
``` ```
``` ```
module(name = "com_github_google_benchmark", version="1.8.0") # MODULE.bazel
module(name = "com_github_google_benchmark", version="1.9.0")
```
```
# google_benchmark/__init__.py
__version__ = "1.9.0"
``` ```
* Create a release through github's interface * Create a release through github's interface
@ -28,4 +36,3 @@ module(name = "com_github_google_benchmark", version="1.8.0")
* `git push --force --tags origin` * `git push --force --tags origin`
* Confirm that the "Build and upload Python wheels" action runs to completion * Confirm that the "Build and upload Python wheels" action runs to completion
* Run it manually if it hasn't run. * Run it manually if it hasn't run.
* IMPORTANT: When re-running manually, make sure to select the newly created `<tag>` as the workflow version in the "Run workflow" tab on the GitHub Actions page.

View File

@ -1,25 +1,21 @@
[build-system] [build-system]
requires = ["setuptools", "setuptools-scm[toml]", "wheel"] requires = ["setuptools<73"]
build-backend = "setuptools.build_meta" build-backend = "setuptools.build_meta"
[project] [project]
name = "google_benchmark" name = "google_benchmark"
description = "A library to benchmark code snippets." description = "A library to benchmark code snippets."
requires-python = ">=3.8" requires-python = ">=3.10"
license = { file = "LICENSE" } license = { file = "LICENSE" }
keywords = ["benchmark"] keywords = ["benchmark"]
authors = [ authors = [{ name = "Google", email = "benchmark-discuss@googlegroups.com" }]
{name = "Google", email = "benchmark-discuss@googlegroups.com"},
]
classifiers = [ classifiers = [
"Development Status :: 4 - Beta", "Development Status :: 4 - Beta",
"Intended Audience :: Developers", "Intended Audience :: Developers",
"Intended Audience :: Science/Research", "Intended Audience :: Science/Research",
"License :: OSI Approved :: Apache Software License", "License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.12",
@ -29,14 +25,10 @@ classifiers = [
dynamic = ["readme", "version"] dynamic = ["readme", "version"]
dependencies = [ dependencies = ["absl-py>=0.7.1"]
"absl-py>=0.7.1",
]
[project.optional-dependencies] [project.optional-dependencies]
dev = [ dev = ["pre-commit>=3.3.3"]
"pre-commit>=3.3.3",
]
[project.urls] [project.urls]
Homepage = "https://github.com/google/benchmark" Homepage = "https://github.com/google/benchmark"
@ -53,8 +45,7 @@ where = ["bindings/python"]
[tool.setuptools.dynamic] [tool.setuptools.dynamic]
readme = { file = "README.md", content-type = "text/markdown" } readme = { file = "README.md", content-type = "text/markdown" }
version = { attr = "google_benchmark.__version__" }
[tool.setuptools_scm]
[tool.mypy] [tool.mypy]
check_untyped_defs = true check_untyped_defs = true

View File

@ -138,7 +138,6 @@ class BuildBazelExtension(build_ext.build_ext):
dirs[:] = [d for d in dirs if "runfiles" not in d] dirs[:] = [d for d in dirs if "runfiles" not in d]
for f in files: for f in files:
print(f)
fp = Path(f) fp = Path(f)
should_copy = False should_copy = False
# we do not want the bare .so file included # we do not want the bare .so file included