python_pep517: use picobuild instead of manually calling the API

Calling the PEP-517 API directly mostly works, but sometimes doesn't.
For example we don't verify build dependencies, which led to the cbor2
ugprade silently failing to actually package anything.

The standard frontend is pypa/build, but for source-based distributions
that can be annoying to build as it depends on the following packages:

- tomli
- pep517
- packaging
- pyparsing

Manually bootstrapping those recipes is possible, but tedious.

Picobuild is another frontend (written by myself) which is designed
explicitly to be used programatically by source-based distributions: it
doesn't support builds inside virtual environments as we're building
distribution packages, and it vendors the dependencies for bootstrapping
if they're not available.

Over time more packages are expected to move to using Flit to build
which makes the bootstrapping process slightly easier, and tomli will be
integrated into Python 3.11, so it's possible that in the future we
drop picobuild and switch to build.

This change means the PEP517_BUILD_API variable is obsolete, so remove
it.

(From OE-Core rev: 35104958181d18fd67b73943b9310c813d62b14d)

Signed-off-by: Ross Burton <ross.burton@arm.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Ross Burton
2022-07-13 17:28:18 +01:00
committed by Richard Purdie
parent 511e2dfb49
commit c4b75fe913
4 changed files with 13 additions and 9 deletions

View File

@@ -4,17 +4,16 @@
# This class will build a wheel in do_compile, and use pypa/installer to install
# it in do_install.
DEPENDS:append = " python3-installer-native"
DEPENDS:append = " python3-picobuild-native python3-installer-native"
# Where to execute the build process from
PEP517_SOURCE_PATH ?= "${S}"
# The PEP517 build API entry point
PEP517_BUILD_API ?= "unset"
# The directory where wheels will be written
PEP517_WHEEL_PATH ?= "${WORKDIR}/dist"
PEP517_PICOBUILD_OPTS ?= ""
# The interpreter to use for installed scripts
PEP517_INSTALL_PYTHON = "python3"
PEP517_INSTALL_PYTHON:class-native = "nativepython3"
@@ -31,8 +30,7 @@ python_pep517_do_configure () {
# When we have Python 3.11 we can parse pyproject.toml to determine the build
# API entry point directly
python_pep517_do_compile () {
cd ${PEP517_SOURCE_PATH}
nativepython3 -c "import ${PEP517_BUILD_API} as api; api.build_wheel('${PEP517_WHEEL_PATH}')"
nativepython3 -m picobuild --source ${PEP517_SOURCE_PATH} --dest ${PEP517_WHEEL_PATH} --wheel ${PEP517_PICOBUILD_OPTS}
}
do_compile[cleandirs] += "${PEP517_WHEEL_PATH}"

View File

@@ -13,7 +13,7 @@ SRC_URI[sha256sum] = "3c9bd9c140515bfe62dd938c6610d10d6efb9e35cc647fc614fe5fb3a5
inherit pypi python_flit_core
# Need to install by hand as there's a dependency loop
DEPENDS:remove:class-native = " python3-installer-native"
DEPENDS:remove:class-native = " python3-picobuild-native python3-installer-native"
DEPENDS:append:class-native = " unzip-native"
# We need the full flit tarball

View File

@@ -12,11 +12,15 @@ SRC_URI[sha256sum] = "f970995ec2bb815e2fdaf7977b26b2091e1e386f0f42eafd5ac811953d
inherit pypi python_flit_core
# Bootstrap the native install by installing with ourself
DEPENDS:remove:class-native = "python3-installer-native"
# Bootstrap the native build
DEPENDS:remove:class-native = "python3-picobuild-native python3-installer-native"
INSTALL_WHEEL_COMPILE_BYTECODE:class-native = "--no-compile-bytecode"
do_compile:class-native () {
python_flit_core_do_manual_build
}
do_install:prepend:class-native() {
export PYTHONPATH="${S}/src"
}

View File

@@ -18,4 +18,6 @@ S = "${WORKDIR}/git"
inherit python_flit_core
DEPENDS:remove:class-native = "python3-picobuild-native"
BBCLASSEXTEND = "native nativesdk"