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
.
setuptools 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