From 60c880f34117611ebb0e04aba1380b2a3c8a7225 Mon Sep 17 00:00:00 2001 From: Maxim Averyanov Date: Wed, 26 Aug 2026 22:52:59 +0200 Subject: [PATCH] Say the licence once, so anything can be built at all Every CI job on main is failing, and so would every release job, on a repository nobody had changed. setuptools 77 implemented PEP 639: a project may state its licence as an SPDX expression or as a classifier, and stating it both ways is now an error rather than a redundancy. pyproject.toml did both. The classifier goes; the expression stays, because it is the one that is not deprecated. The build-system floor moves from setuptools 68 to 77 at the same time, for the other half of the same problem: below 77 that same line is read as the legacy licence field, which wants a table and not a string, and the build fails from the other direction. Pinning the floor makes which of the two happens a decision rather than a property of whichever setuptools a runner happened to cache. Co-Authored-By: Claude Opus 5 --- pyproject.toml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 48b53ee..b5b8c68 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,8 @@ [build-system] -requires = ["setuptools>=68", "wheel"] +# 77 is where PEP 639 landed, and the licence below is written as a PEP 639 +# expression. Older setuptools reads that line as the legacy field, which +# wants a table rather than a string, and refuses the build. +requires = ["setuptools>=77", "wheel"] build-backend = "setuptools.build_meta" [project] @@ -15,9 +18,11 @@ keywords = [ "mobile-automation", "testing", "qa", "getevent", "sendevent", "autoclicker", "drawing", "emulator", "gesture", "screen-recording", ] +# No licence classifier here. The licence is stated once, above, as a PEP 639 +# expression, and setuptools 77 and later refuse a build that says it twice - +# which is why every CI job started failing on a repository nobody had touched. classifiers = [ "Development Status :: 4 - Beta", - "License :: OSI Approved :: GNU Affero General Public License v3", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "Operating System :: OS Independent",