On Wed, Nov 24, 2021 at 12:15 PM Konrad Weihmann <kweihm...@outlook.com> wrote:
> add a bbclass to disutils3 that generates a fallback setup.py in case > there is no setup.py available in the source dir, but a setup.cfg. > I’ll check this out later, but I do want to highlight that we will be deprecating distutils bbclasses (and moving them to meta-python for continuity). https://bugzilla.yoctoproject.org/show_bug.cgi?id=14610 We can refactor this series into the refactored setuptools3.bbclass (sans distutils). I will do this if we merge these changes. https://git.yoctoproject.org/poky-contrib/log/?h=timo/nodistutils_14610 I’d like to hear what concerns others have. > Use the mapping provided by > https://setuptools.pypa.io/en/latest/userguide/declarative_config.html > to translate the most essential items to legacy setuptools.setup > dictitonary. > > Signed-off-by: Konrad Weihmann <kweihm...@outlook.com> > --- > meta/classes/distutils3-legacy.bbclass | 112 +++++++++++++++++++++++++ > meta/classes/distutils3.bbclass | 1 + > 2 files changed, 113 insertions(+) > create mode 100644 meta/classes/distutils3-legacy.bbclass > > diff --git a/meta/classes/distutils3-legacy.bbclass > b/meta/classes/distutils3-legacy.bbclass > new file mode 100644 > index 0000000000..266d30138f > --- /dev/null > +++ b/meta/classes/distutils3-legacy.bbclass > @@ -0,0 +1,112 @@ > +# Helper to create a trimmed down setup.py from information found in > +# setup.cfg, in case there is no setup.py shipped with the sources > + > +# this functionality can be safely removed once the pypa community > +# comes up with a safe replacement for the functionality found in > distutils3.bbclass > + > +def distutils_legacy_package_name(d): > + # use pypi name or fall back to BPN > + return d.getVar("PYPI_PACKAGE") or d.getVar('BPN').replace('python-', > '').replace('python3-', '') > + > +DISTUTILS_LEGACY_VERSION ?= "${PV}" > +DISTUTILS_LEGACY_NAME ?= "${@distutils_legacy_package_name(d)}" > + > +python do_create_setup_py_legacy() { > + import os > + > + if os.path.exists(os.path.join(d.getVar("DISTUTILS_SETUP_PATH"), > "setup.py")): > + return > + > + from configparser import ConfigParser, NoOptionError, NoSectionError, > ParsingError > + import re > + > + config = ConfigParser() > + try: > + config.read(os.path.join(d.getVar("DISTUTILS_SETUP_PATH"), > "setup.cfg")) > + except FileNotFoundError: > + return > + > + def _strip(x): > + return re.sub(r"\s|\t|\n", "", x) > + > + def get_section(section): > + try: > + return dict(config.items(section=section)) > + except (NoSectionError, ParsingError): > + return None > + > + def get_option(section, option): > + try: > + return config.get(section=section, option=option) > + except (NoOptionError, NoSectionError, ParsingError): > + return None > + > + def extract_bool(section, option, default): > + _option = get_option(section, option) > + if _option is None: > + return default > + return bool(_strip(_option)) > + > + def extract_str(section, option, default): > + _option = get_option(section, option) > + if _option is None: > + return default > + return _strip(_option) > + > + def extract_dict_vallist(section, default, delim=""): > + _section = get_section(section) > + if _section is None: > + return default > + return {_strip(k): [_strip(x) for x in re.split(delim, v)] if > delim else [ _strip(v) ] for k, v in _section.items()} > + > + def extract_dict(section, default): > + _section = get_section(section) > + if _section is None: > + return default > + return {_strip(k): _strip(v) for k, v in _section.items()} > + > + def extract_list(section, option, default, delim): > + _option = get_option(section, option) > + if _option is None: > + return default > + bb.warn("%s:%s -> %s" % (section, option, _option)) > + _listitems = re.split(delim, _option) if delim else [_option] > + return [_strip(x) for x in _listitems] > + > + def quote(x): > + return '"%s"' % x > + > + _pkginfo = { > + "entry_points": extract_dict_vallist("options.entry_points", {}), > + "include_package_data": extract_bool("options", > "include_package_data", False), > + "name": quote(extract_str("options", "name", > d.getVar("DISTUTILS_LEGACY_NAME"))), > + "package_data": extract_dict_vallist("options.package_data", {}, > r"\s+|,"), > + "packages": extract_list("options", "packages", [], ""), > + "version": quote(d.getVar("DISTUTILS_LEGACY_VERSION")), > + "zip_safe": extract_bool("options", "zip_safe", False), > + "install_requires": extract_list("options", "install_requires", > [], r"\t+|\n+"), > + "python_requires": quote(extract_str("options", > "python_requires", ">0.0")), > + "package_dir": extract_dict("package_dir", {}), > + "py_modules": extract_list("options", "py_modules", [], r"\s+|,"), > + } > + > + # In case packages is using :find module > + # we need to look for top level directories containing a __init__.py > + if _pkginfo["packages"] == ["find:"]: > + # top level search dir can be adjusted by options.packages.find > option > + _path = extract_str("options.packages.find", "where", "") > + _pkginfo["packages"] = set(x.name for x in > os.scandir(os.path.join( > + d.getVar("DISTUTILS_SETUP_PATH"), _path)) if os.path.isdir(x) > and os.path.exists(os.path.join(x, "__init__.py"))) > + > + with open(os.path.join(d.getVar("DISTUTILS_SETUP_PATH"), "setup.py"), > "w") as o: > + o.write("import setuptools\n") > + o.write("setuptools.setup(\n") > + for k, v in _pkginfo.items(): > + o.write("%s = %s,\n" % (str(k), str(v))) > + o.write(")") > + > + > +} > + > +do_create_setup_py_legacy[doc] = "Create a fallback version of legacy > setup.py if not existing" > +addtask do_create_setup_py_legacy before do_configure after do_patch > do_prepare_recipe_sysroot > diff --git a/meta/classes/distutils3.bbclass > b/meta/classes/distutils3.bbclass > index be645d37bd..f26f0d5184 100644 > --- a/meta/classes/distutils3.bbclass > +++ b/meta/classes/distutils3.bbclass > @@ -1,4 +1,5 @@ > inherit distutils3-base > +inherit distutils3-legacy > > B = "${WORKDIR}/build" > distutils_do_configure[cleandirs] = "${B}" > -- > 2.25.1 > > > > >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#158745): https://lists.openembedded.org/g/openembedded-core/message/158745 Mute This Topic: https://lists.openembedded.org/mt/87289428/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-