[PATCH 1/2] classes/setuptools: use tomllib instead of regex to parse pyproject.toml
COLD25d
From: Ross Burton <hidden>
Date: 2026-09-09 15:19:15
Subsystem:
the rest · Maintainer:
Linus Torvalds
BitBake now vendors in tomli[1] for when the host Python is older than
3.11 so doesn't have tomllib. Rewrite the pyproject.toml parsing from
regexs to tomllib.
Also ensure that the functions in setuptools3 and setuptools_legacy are
identical, as they had diverged.
[1] bitbake 69810e0c0a ("lib/bb/_vendor: resync to add tomli")
Signed-off-by: Ross Burton <redacted>
---
meta/classes-recipe/setuptools3.bbclass | 24 +++++++++++----
.../classes-recipe/setuptools3_legacy.bbclass | 29 ++++++++++++++-----
2 files changed, 40 insertions(+), 13 deletions(-)
diff --git a/meta/classes-recipe/setuptools3.bbclass b/meta/classes-recipe/setuptools3.bbclass
index b0e4ab5208c..8e0fdff9e9d 100644
--- a/meta/classes-recipe/setuptools3.bbclass
+++ b/meta/classes-recipe/setuptools3.bbclass@@ -13,19 +13,31 @@ SETUPTOOLS_BUILD_ARGS ?= "" SETUPTOOLS_SETUP_PATH ?= "${S}" python do_check_backend() { + """ + Check if this package has a pyproject.toml that specifies a PEP517 build backend, so should be + using a different build class. + """ + if "pep517-backend" in (d.getVar("INSANE_SKIP") or "").split(): return - import re + try: + import tomllib + except ImportError: + import bb._vendor_tomli as tomllib + filename = d.expand("${SETUPTOOLS_SETUP_PATH}/pyproject.toml") if os.path.exists(filename): - for line in open(filename): - match = re.match(r"build-backend\s*=\s*\W([\w.]+)\W", line) - if not match: continue + with open(filename, "rb") as f: + toml = tomllib.load(f) - msg = f"inherits setuptools3 but has pyproject.toml with {match[1]}, use the correct class" + try: + backend = toml["build-system"]["build-backend"] + msg = f"inherits setuptools3 but has pyproject.toml specifying backend {backend}, use the correct class" oe.qa.handle_error("pep517-backend", msg, d) - oe.qa.exit_if_errors(d) + oe.qa.exit_if_errors(d) + except KeyError: + return } addtask check_backend after do_patch before do_configure
diff --git a/meta/classes-recipe/setuptools3_legacy.bbclass b/meta/classes-recipe/setuptools3_legacy.bbclass
index 6b51b9796bc..102d0827538 100644
--- a/meta/classes-recipe/setuptools3_legacy.bbclass
+++ b/meta/classes-recipe/setuptools3_legacy.bbclass@@ -31,16 +31,31 @@ SETUPTOOLS_PYTHON:class-native = "nativepython3" SETUPTOOLS_SETUP_PATH ?= "${S}" python do_check_backend() { - import re + """ + Check if this package has a pyproject.toml that specifies a PEP517 build backend, so should be + using a different build class. + """ + + if "pep517-backend" in (d.getVar("INSANE_SKIP") or "").split(): + return + + try: + import tomllib + except ImportError: + import bb._vendor_tomli as tomllib + filename = d.expand("${SETUPTOOLS_SETUP_PATH}/pyproject.toml") if os.path.exists(filename): - for line in open(filename): - match = re.match(r"build-backend\s*=\s*\W([\w.]+)\W", line) - if not match: continue + with open(filename, "rb") as f: + toml = tomllib.load(f) - msg = f"inherits setuptools3_legacy but has pyproject.toml with {match[1]}, use the correct class" - if "pep517-backend" not in (d.getVar("INSANE_SKIP") or "").split(): - oe.qa.handle_error("pep517-backend", msg, d) + try: + backend = toml["build-system"]["build-backend"] + msg = f"inherits setuptools3_legacy but has pyproject.toml specifying backend {backend}, use the correct class" + oe.qa.handle_error("pep517-backend", msg, d) + oe.qa.exit_if_errors(d) + except KeyError: + return } addtask check_backend after do_patch before do_configure
--
2.43.0