@@ -30,6 +30,22 @@ PEP517_INSTALL_PYTHON:class-native = "nativepython3"
# pypa/installer option to control the bytecode compilation
INSTALL_WHEEL_COMPILE_BYTECODE ?= "--compile-bytecode=0"
+# Force the wheel's platform tag to reflect the target machine rather than the
+# build host. Without this, extension-module wheels bake the build host's arch
+# (e.g. linux_x86_64) into <pkg>.dist-info/WHEEL via distutils/sysconfig's
+# get_platform(), which breaks reproducibility across autobuilder workers of
+# different architectures. Pure-python wheels ignore this variable and remain
+# tagged "any".
+#
+# HOST_ARCH is class-scoped by bitbake:
+# - target: HOST_ARCH == TARGET_ARCH (reproducible across workers)
+# - native: HOST_ARCH == BUILD_ARCH (matches worker arch, unpackaged)
+# - cross: HOST_ARCH == BUILD_ARCH
+# - nativesdk: HOST_ARCH == SDK_ARCH
+# so a single expression covers every class without producing an empty tag
+# (which python 3.14 + wheel >=0.44 rejects with "Bad wheel filename").
+export _PYTHON_HOST_PLATFORM = "linux-${HOST_ARCH}"
+
# PEP517 doesn't have a specific configure step, so set an empty do_configure to avoid
# running base_do_configure.
python_pep517_do_configure () {
python distutils/sysconfig.get_platform() falls back to distutils.util.get_platform() when the _PYTHON_HOST_PLATFORM environment variable is unset, and returns the *build host* arch. The result is baked into the produced wheel's filename (pkg-<ver>-cp3XX-cp3XX-<PLAT>.whl) and its <pkg>.dist-info/WHEEL metadata. Without this export, extension-module wheels tag themselves with whichever arch the autobuilder worker happens to have, which makes the resulting rpm non-reproducible across mixed-arch autobuilder pools. Since python 3.14 + wheel >=0.44 also rejects wheels with an empty platform tag ("Bad wheel filename"), the value has to be non-empty in every class scope. HOST_ARCH is class-scoped by bitbake (target/native/cross/nativesdk), so `linux-${HOST_ARCH}` covers every case with a single unconditional assignment. Setting per-class overrides to "" (as an earlier draft did) trips the wheel filename check and must be avoided. Pure-python wheels ignore _PYTHON_HOST_PLATFORM and remain tagged "any", so this change only affects wheels that ship compiled extensions (cffi, cryptography, numpy, bcrypt, markupsafe, psutil, rpds-py, websockets, ...). Assisted-by: AI - OpenAI Signed-off-by: Alejandro Hernandez <alhe@linux.microsoft.com> --- meta/classes-recipe/python_pep517.bbclass | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)