-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Description
Summary
TL;DR: TOML-table-based project.license is deprecated in the newest setuptools. But the highest supported setuptools on Python 3.8 only supports TOML-table-based project.license.
For Python 3.9+, developers need to migrate to v77 to suppress the setuptools warning (see below). But then the pyproject.toml is not compatible with setuptools on Python 3.8.
# Work with Python 3.9+ without warnings
# Does not work with either:
# - Python 3.8
# - build with no-build-isolation with setuptools<77 on Python 3.9+
[build-system]
requires = ["setuptools>=77"]
build-backend = "setuptools.build_meta"
[project]
name = "xxx"
description = "YYY"
readme = "README.md"
requires-python = ">= 3.9"
license = "Apache-2.0" # PEP 639: SPDX expression# Work with Python 3.8+ but setuptools emits a warning
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"
[project]
name = "xxx"
description = "YYY"
readme = "README.md"
requires-python = ">= 3.8"
license = { text = "Apache-2.0" } # TOML-tablesetuptools v77.0.0 adds license expression (PEP 639) support in:
For pyproject.toml with license = { text = "expression" }:
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"
[project]
name = "xxx"
description = "XXX"
readme = "README.md"
requires-python = ">= 3.8"
license = { text = "Apache-2.0" }It will emit a warning during installation:
/.../site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated
!!
********************************************************************************
Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`.
By 2026-Feb-18, you need to update your project and remove deprecated calls
or your builds will no longer be supported.
See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.
********************************************************************************
!!
However, setuptools v77.0.0 does not support Python 3.8. The maximum supported version of Python 3.8 is v75.3.2 (v75.4.0 removed Python 3.8 support).
If developers change project.license = "Apache-2.0" as the warning suggested (emitted on a Python >=3.9 environment).
[project]
requires-python = ">= 3.8"
- license = { text = "Apache-2.0" }
+ license = "Apache-2.0"The build will break on Python 3.8 due to the lack of PEP-639-supported setuptools (maximum is v75.3.2).
Processing /.../xxx
Installing build dependencies ... done
Getting requirements to build wheel ... error
error: subprocess-exited-with-error
× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─> [87 lines of output]
configuration error: `project.license` must be valid exactly by one definition (2 matches found):
- keys:
'file': {type: string}
required: ['file']
- keys:
'text': {type: string}
required: ['text']
DESCRIPTION:
`Project license <https://peps.python.org/pep-0621/#license>`_.
GIVEN VALUE:
"Apache-2.0"
OFFENDING RULE: 'oneOf'
DEFINITION:
{
"oneOf": [
{
"properties": {
"file": {
"type": "string",
"$$description": [
"Relative path to the file (UTF-8) which contains the license for the",
"project."
]
}
},
"required": [
"file"
]
},
{
"properties": {
"text": {
"type": "string",
"$$description": [
"The license of the project whose meaning is that of the",
"`License field from the core metadata",
"<https://packaging.python.org/specifications/core-metadata/#license>`_."
]
}
},
"required": [
"text"
]
}
]
}
OS / Environment
Not related.
Additional Information
pyproject.toml is a static configuration file. It is impossible for packages that can support multiple Python versions (including EOLs) and also do not emit warnings during building. The warning can suggest developers use setup.py but I don't think it is encouraged since they are already using pyproject.toml.
I'd suggest to do not deprecate TOML-table-based project.license with only a text key. Make the following equivalent:
[project]
license = { text = "SPDX expression" }[project]
license = "SPDX expression"Code of Conduct
- I agree to follow the PSF Code of Conduct