[OE-core] [oe-commits] [openembedded-core] 01/06: python: Restructure python packaging and replace it with autopackaging
Martin Jansa
martin.jansa at gmail.com
Mon Jan 22 19:10:22 UTC 2018
Thanks Alejandro,
Derek sent patches for all of these issues yesterday. Not it seems to build
fine again.
Regards,
On Mon, Jan 22, 2018 at 8:02 PM, Alejandro Enedino Hernandez Samaniego <
alejandro.enedino.hernandez-samaniego at xilinx.com> wrote:
> Hello Martin,
>
> On 01/21/2018 07:13 AM, Martin Jansa wrote:
>
> And few more detected in test-signatures.sh:
>
> ERROR: Nothing RPROVIDES 'python3-enum' (but meta-oe/meta-python/recipes-
> devtools/python/python3-automat_0.6.0.bb
> meta-oe/meta-python/recipes-devtools/python/python3-asn1crypto_0.24.0.bb
> meta-oe/meta-python/recipes-devtools/python/python3-pymongo_3.6.0.bb
> meta-oe/meta-python/recipes-devtools/python/python3-netaddr_0.7.19.bb
> meta-oe/meta-python/recipes-devtools/python/python3-pyserial_3.4.bb
> meta-oe/meta-python/recipes-devtools/python/python3-langtable_0.0.38.bb
> meta-oe/meta-python/recipes-devtools/python/python3-hyperlink_17.3.1.bb
> meta-oe/meta-python/recipes-devtools/python/python3-click_6.7.bb
> meta-oe/meta-python/recipes-devtools/python/python3-
> prompt-toolkit_1.0.15.bb
> meta-oe/meta-python/recipes-devtools/python/python3-decorator_4.1.2.bb
> meta-oe/meta-python/recipes-devtools/python/python3-serpent_1.23.bb
> meta-oe/meta-python/recipes-devtools/python/python3-dnspython_1.15.0.bb
> meta-oe/meta-python/recipes-devtools/python/python3-jsonpatch_1.21.bb
> meta-oe/meta-python/recipes-devtools/python/python3-sqlalchemy_1.1.15.bb
> meta-oe/meta-python/recipes-devtools/python/python3-ntplib_0.3.3.bb
> meta-oe/meta-python/recipes-devtools/python/python3-whoosh_2.7.4.bb
> meta-oe/meta-python/recipes-devtools/python/python3-ply_3.10.bb RDEPENDS
> on or otherwise requires it)
> NOTE: Runtime target 'python3-enum' is unbuildable, removing...
> Missing or unbuildable dependency chain was: ['python3-enum']
> ERROR: Required build target 'meta-world-pkgdata' has no buildable
> providers.
> Missing or unbuildable dependency chain was: ['meta-world-pkgdata',
> 'python3-automat', 'python3-enum']
>
> ERROR: Nothing RPROVIDES 'python3-importlib' (but
> meta-oe/meta-python/recipes-devtools/python/python3-django_1.11.9.bb
> meta-oe/meta-python/recipes-devtools/python/python3-pyroute2_0.4.21.bb
> meta-oe/meta-python/recipes-devtools/python/python3-can_2.0.0.bb RDEPENDS
> on or otherwise requires it)
> NOTE: Runtime target 'python3-importlib' is unbuildable, removing...
> Missing or unbuildable dependency chain was: ['python3-importlib']
> ERROR: Required build target 'meta-world-pkgdata' has no buildable
> providers.
> Missing or unbuildable dependency chain was: ['meta-world-pkgdata',
> 'python3-django', 'python3-importlib']
>
> ERROR: Nothing RPROVIDES 'python-importlib' (but
> meta-oe/meta-python/recipes-devtools/python/python-django_1.11.9.bb
> meta-oe/meta-python/recipes-devtools/python/python-pyroute2_0.4.21.bb
> meta-oe/meta-python/recipes-devtools/python/python-pandas_0.22.0.bb
> meta-oe/meta-python/recipes-devtools/python/python-astroid_1.6.0.bb
> meta-oe/meta-python/recipes-devtools/python/python-dbusmock_0.16.7.bb
> meta-oe/meta-python/recipes-devtools/python/python-can_2.0.0.bb
> meta-oe/meta-python/recipes-devtools/python/python-pyserial_3.4.bb
> meta-oe/meta-oe/recipes-devtools/python/python-pygobject_3.22.0.bb
> meta-oe/meta-python/recipes-devtools/python/python-behave_1.2.5.bb
> RDEPENDS on or otherwise requires it)
> NOTE: Runtime target 'python-importlib' is unbuildable, removing...
> Missing or unbuildable dependency chain was: ['python-importlib']
> ERROR: Required build target 'meta-world-pkgdata' has no buildable
> providers.
> Missing or unbuildable dependency chain was: ['meta-world-pkgdata',
> 'python-django', 'python-importlib']
>
>
> On Sun, Jan 21, 2018 at 10:00 AM, Martin Jansa <martin.jansa at gmail.com>
> wrote:
>
>> Hello,
>>
>> The last paragraph in commit message looks like it should be backwards
>> compatible right?
>>
>> Then there might be some bug somewhere, because in my builds (which use
>> only very few python packages) there are few runtime dependencies which
>> cannot be satisfied anymore:
>> python-man
>> python-readline
>> python3-textutils
>>
>
> Its backwards compatible, in the way that the usage should be the same, in
> this case, this sort of failures are expected, since the mentioned
> packages: enum, readline, textutils no longer exist, and they should never
> have existed in the first place, they were always required to get a minimal
> python working, so they are now part of python(3)-core, which means the
> dependencies are actually met but recipes which RDEPEND on them should be
> modified , please see https://git.yoctoproject.org/
> cgit/cgit.cgi/poky/commit/?id=7aaffbede46ce352b91c7a5c5f825a6f3b5b1c2e
> regarding some of the RDEPEND fixes on oe-core, I expect there should be
> several like this for meta-python.
>
>
>> Also probably related to this I've seen python(3)-smbus recipes failing
>> to build now with:
>> smbusmodule.c:192:48: error: 'I2C_SMBUS_WRITE' undeclared (first use in
>> this function); did you mean 'I2C_SMBUS'?
>>
>
> I dont know if the same applies for smbus but I will check.
>
> Cheers,
>
> Alejandro
>
>
>> Regards,
>>
>> On Sat, Jan 20, 2018 at 11:32 PM, <git at git.openembedded.org> wrote:
>>
>>> This is an automated email from the git hooks/post-receive script.
>>>
>>> rpurdie pushed a commit to branch master
>>> in repository openembedded-core.
>>>
>>> commit 6959e2e4dba5bbfa6ffd49c44e738cc1c38bc280
>>> Author: Alejandro Hernandez <alejandro.hernandez at linux.intel.com>
>>> AuthorDate: Tue Jun 20 14:11:44 2017 -0700
>>>
>>> python: Restructure python packaging and replace it with
>>> autopackaging
>>>
>>> The reason we have a manifest file for python is that our goal is to
>>> keep python-core as small as posible and add other python packages
>>> only
>>> when the user needs them, hence why we split upstream python into
>>> several
>>> packages.
>>>
>>> Although our manifest file has several issues:
>>> - Its unorganized and hard to read and understand it for an average
>>> human being.
>>> - When a new package needs to be added, the user actually has to
>>> modify
>>> the script that creates the manifest, then call the script to
>>> create
>>> a new manifest, and then submit a patch for both the script and
>>> the
>>> manifest, so its a little convoluted.
>>> - Git complains every single time a patch is submitted to the
>>> manifest,
>>> since it violates some of its guidelines.
>>> - It changes or may change with every release of python, its
>>> impossible
>>> to know if the required files for a certain package have changed
>>> (it could have more or less dependencies), the only way of doing
>>> so
>>> would be to install and test them all one by one on separate
>>> individual
>>> images, and even then we wouldnt know if they require less
>>> dependencies,
>>> we would just know if an extra dependency is required since it
>>> would
>>> complain, lets face it, this isnt feasible.
>>> - The same thing happens for new packages, if someone wants to add a
>>> new package, its dependencies need to be checked manually one by
>>> one.
>>>
>>> This patch fixes those issues, while adding some additional features.
>>>
>>> Features/Fixes:
>>>
>>> - A new manifest format is used (JSON), easy to read and understand.
>>> This file is parsed by the python recipe and python packages read
>>> from here are passed directly to bitbake during parsing time.
>>> - It provides an automatic manifest creation task (explained below),
>>> which automagically checks for every package dependencies and adds
>>> them to the new manifest, hence we will have on each package
>>> exactly
>>> what that package needs to be run, providing finer granularity.
>>> - Dependencies are also checked automagically for new packages
>>> (explained below).
>>> - Fixes the manifest in the following ways:
>>> * python-core should be base and all packages should depend on it,
>>> fixes lang, string, codecs, etc.
>>> * Fixes packages with repeated files (e.g. bssdb and db, or
>>> netclient and mime, and many others).
>>> - Sitecustomize was fixed since encoding was deprecated.
>>> - The JSON manifest file invalidates bitbake's cache, so if it
>>> changes
>>> the python package will be rebuilt.
>>> - It creates a solution for users that want precompiled bytecode
>>> files
>>> (*.pyc) INCLUDE_PYCS = "1" can be set by the user on their
>>> local.conf to
>>> include such files, some argument they get faster boot time, even
>>> when the
>>> files would be created on their first run?, but they also
>>> sometimes give a
>>> magic number error and take up space, so we leave it to the user
>>> to
>>> decide if they want them or not.
>>> - Fixes python-core dependencies, e.g.
>>> When python is run on an image, it TRIES to import everything it
>>> needs,
>>> but it doesnt necessarily fails when it doesnt find something, so
>>> even if
>>> we didnt know, we had errors like (trimmed on purpose):
>>> # trying /usr/lib/python2.7/_locale.so
>>> # trying /usr/lib/python2.7/lib-dynload/_locale.so
>>> # trying /usr/lib/python2.7/_sysconfigdata.so
>>>
>>> while it didnt complain about _locale it should have imported it,
>>> after creating a new manifest with the automated script we get:
>>>
>>> # trying /usr/lib/python2.7/lib-dynload/_locale.so
>>> dlopen("/usr/lib/python2.7/lib-dynload/_locale.so", 2);
>>> import _locale # dynamically loaded from
>>> /usr/lib/python2.7/lib-dynload/_locale.so
>>>
>>> How to use (after a new release of python, or maybe before every OE
>>> release):
>>> - A new task called create_manifest was added to the python package,
>>> which may be invoked via:
>>>
>>> $ bitbake python -c create_manifest
>>>
>>> This task runs a script on native python on our HOST system, and
>>> since
>>> the python and python-native packages come from the same source, we
>>> can
>>> use it to know the dependencies of each module as if we were doing
>>> it
>>> on an image, this script is called create_manifest.py and in a very
>>> simplistic way it does the following:
>>>
>>> 1. Reads the JSON manifest file and creates a dictionary data
>>> structure
>>> with all of our python packages, their FILES, RDEPENDS and
>>> SUMMARY.
>>> 2. Loops through all of them and runs every module listed on them
>>> asynchronously, determining every dependency that they have.
>>> 3. These module dependencies are then handled, to be able to know
>>> which
>>> packages contain those files and which should RDEPEND on one
>>> another.
>>> 4. The data structure that comes out of this, is then used to
>>> create a
>>> new manifest file which is automatically copied onto the user's
>>> python
>>> directory replacing the old one.
>>>
>>> Create_manifest script features:
>>> - Handles modules which dont exist anymore (new release for
>>> example).
>>> - Handles modules that are builtin.
>>> - Deals with modules which were not compiled (e.g. bsddb or
>>> ossaudiodev)
>>> - Deals with packages which include folders.
>>> - Deals with packages which include FILES with a wildcard.
>>> - The manifest can be constructed on a multilib environment as well.
>>> - This method works for both python modules and shared libraries
>>> used
>>> by python.
>>>
>>> How to add a new package:
>>> - If a user wants to add a new package all that has to be done is
>>> modify the python2-manifest.json file, and add the required
>>> file(s)
>>> to the FILES list, the script should handle all the rest.
>>> Real example:
>>> We want to add a web browser package, including the file
>>> webbrowser.py
>>> which at the moment is on python-misc.
>>> "webbrowser": {
>>> "files": ["${libdir}/python2.7/lib-dynload/webbrowser.py"],
>>> "rdepends": [],
>>> "summary": "Python Web Browser support"}
>>>
>>> Run bitbake python -c create_manifest and the resulting manifest
>>> should be completed after a few seconds, showing something like:
>>> "webbrowser": {
>>> "files": ["${libdir}/python2.7/webbrowser.py"],
>>> "rdepends": ["core","fcntl","io","pickle",
>>> "shell","subprocess"],
>>> "summary": "Python Web Browser support"}
>>>
>>> Known errors/issues:
>>> - Some special packages are handled differently: core, misc,
>>> modules,dev, staticdev.
>>> All these should be handled manually, because they either include
>>> binaries, static libraries, include files, etc. (something that we
>>> cant import).
>>> Specifically static libraries are not not supported by this method
>>> and have to be handled by the user.
>>> - The change should be transparent to the user, other than the fact
>>> that now we CANT build python-foo (it was pretty dumb anyway,
>>> since
>>> what building python-foo actually did was building the whole
>>> python
>>> package anyway), but doing IMAGE_INSTALL_append = " python-foo"
>>> would create an image with the requested package with no issues.
>>>
>>> [YOCTO #11510] [YOCTO #11694] [YOCTO #11695]
>>>
>>> Signed-off-by: Alejandro Hernandez <alejandro.hernandez at linux.int
>>> el.com>
>>> Signed-off-by: Ross Burton <ross.burton at intel.com>
>>> ---
>>> .../python/python-2.7-manifest.inc | 840
>>> ----------------
>>> .../python/python-native-2.7-manifest.inc | 9 -
>>> .../python/python-native_2.7.13.bb | 24 +-
>>> .../python/python/create_manifest2.py | 277 ++++++
>>> .../python/python/get_module_deps2.py | 112 +++
>>> .../python/python/python2-manifest.json | 1032
>>> ++++++++++++++++++++
>>> .../python/python/sitecustomize.py | 8 -
>>> meta/recipes-devtools/python/python_2.7.13.bb | 88 +-
>>> scripts/contrib/python/generate-manifest-2.7.py | 426 --------
>>> 9 files changed, 1528 insertions(+), 1288 deletions(-)
>>>
>>> diff --git a/meta/recipes-devtools/python/python-2.7-manifest.inc
>>> b/meta/recipes-devtools/python/python-2.7-manifest.inc
>>> deleted file mode 100644
>>> index 7c3fc1b..0000000
>>> --- a/meta/recipes-devtools/python/python-2.7-manifest.inc
>>> +++ /dev/null
>>> @@ -1,840 +0,0 @@
>>> -
>>> -# WARNING: This file is AUTO GENERATED: Manual edits will be lost next
>>> time I regenerate the file.
>>> -# Generator: './scripts/contrib/python/generate-manifest-2.7.py'
>>> Version 20110222.2 (C) 2002-2010 Michael 'Mickey' Lauer <
>>> mlauer at vanille-media.de>
>>> -
>>> -
>>> -
>>> -PROVIDES+=" \
>>> - ${PN}-2to3 \
>>> - ${PN}-argparse \
>>> - ${PN}-audio \
>>> - ${PN}-bsddb \
>>> - ${PN}-codecs \
>>> - ${PN}-compile \
>>> - ${PN}-compiler \
>>> - ${PN}-compression \
>>> - ${PN}-contextlib \
>>> - ${PN}-core \
>>> - ${PN}-crypt \
>>> - ${PN}-ctypes \
>>> - ${PN}-curses \
>>> - ${PN}-datetime \
>>> - ${PN}-db \
>>> - ${PN}-debugger \
>>> - ${PN}-dev \
>>> - ${PN}-difflib \
>>> - ${PN}-distutils \
>>> - ${PN}-distutils-staticdev \
>>> - ${PN}-doctest \
>>> - ${PN}-email \
>>> - ${PN}-fcntl \
>>> - ${PN}-gdbm \
>>> - ${PN}-hotshot \
>>> - ${PN}-html \
>>> - ${PN}-idle \
>>> - ${PN}-image \
>>> - ${PN}-importlib \
>>> - ${PN}-io \
>>> - ${PN}-json \
>>> - ${PN}-lang \
>>> - ${PN}-logging \
>>> - ${PN}-mailbox \
>>> - ${PN}-math \
>>> - ${PN}-mime \
>>> - ${PN}-mmap \
>>> - ${PN}-multiprocessing \
>>> - ${PN}-netclient \
>>> - ${PN}-netserver \
>>> - ${PN}-numbers \
>>> - ${PN}-pickle \
>>> - ${PN}-pkgutil \
>>> - ${PN}-plistlib \
>>> - ${PN}-pprint \
>>> - ${PN}-profile \
>>> - ${PN}-pydoc \
>>> - ${PN}-re \
>>> - ${PN}-readline \
>>> - ${PN}-resource \
>>> - ${PN}-robotparser \
>>> - ${PN}-runpy \
>>> - ${PN}-shell \
>>> - ${PN}-smtpd \
>>> - ${PN}-sqlite3 \
>>> - ${PN}-sqlite3-tests \
>>> - ${PN}-stringold \
>>> - ${PN}-subprocess \
>>> - ${PN}-syslog \
>>> - ${PN}-terminal \
>>> - ${PN}-tests \
>>> - ${PN}-textutils \
>>> - ${PN}-threading \
>>> - ${PN}-tkinter \
>>> - ${PN}-unittest \
>>> - ${PN}-unixadmin \
>>> - ${PN}-xml \
>>> - ${PN}-xmlrpc \
>>> - ${PN}-zlib \
>>> -"
>>> -
>>> -PACKAGES=" \
>>> - ${PN}-dbg \
>>> - ${PN}-2to3 \
>>> - ${PN}-argparse \
>>> - ${PN}-audio \
>>> - ${PN}-bsddb \
>>> - ${PN}-codecs \
>>> - ${PN}-compile \
>>> - ${PN}-compiler \
>>> - ${PN}-compression \
>>> - ${PN}-contextlib \
>>> - ${PN}-core \
>>> - ${PN}-crypt \
>>> - ${PN}-ctypes \
>>> - ${PN}-curses \
>>> - ${PN}-datetime \
>>> - ${PN}-db \
>>> - ${PN}-debugger \
>>> - ${PN}-dev \
>>> - ${PN}-difflib \
>>> - ${PN}-distutils-staticdev ${PN}-distutils \
>>> - ${PN}-doctest \
>>> - ${PN}-email \
>>> - ${PN}-fcntl \
>>> - ${PN}-gdbm \
>>> - ${PN}-hotshot \
>>> - ${PN}-html \
>>> - ${PN}-idle \
>>> - ${PN}-image \
>>> - ${PN}-importlib \
>>> - ${PN}-io \
>>> - ${PN}-json \
>>> - ${PN}-lang \
>>> - ${PN}-logging \
>>> - ${PN}-mailbox \
>>> - ${PN}-math \
>>> - ${PN}-mime \
>>> - ${PN}-mmap \
>>> - ${PN}-multiprocessing \
>>> - ${PN}-netclient \
>>> - ${PN}-netserver \
>>> - ${PN}-numbers \
>>> - ${PN}-pickle \
>>> - ${PN}-pkgutil \
>>> - ${PN}-plistlib \
>>> - ${PN}-pprint \
>>> - ${PN}-profile \
>>> - ${PN}-pydoc \
>>> - ${PN}-re \
>>> - ${PN}-readline \
>>> - ${PN}-resource \
>>> - ${PN}-robotparser \
>>> - ${PN}-runpy \
>>> - ${PN}-shell \
>>> - ${PN}-smtpd \
>>> - ${PN}-sqlite3 \
>>> - ${PN}-sqlite3-tests \
>>> - ${PN}-stringold \
>>> - ${PN}-subprocess \
>>> - ${PN}-syslog \
>>> - ${PN}-terminal \
>>> - ${PN}-tests \
>>> - ${PN}-textutils \
>>> - ${PN}-threading \
>>> - ${PN}-tkinter \
>>> - ${PN}-unittest \
>>> - ${PN}-unixadmin \
>>> - ${PN}-xml \
>>> - ${PN}-xmlrpc \
>>> - ${PN}-zlib \
>>> - ${PN}-modules\
>>> -"
>>> -
>>> -SUMMARY_${PN}-2to3="Python automated Python 2 to 3 code translator"
>>> -RDEPENDS_${PN}-2to3="${PN}-core"
>>> -FILES_${PN}-2to3=" \
>>> - ${bindir}/2to3 \
>>> - ${libdir}/python2.7/lib2to3 \
>>> -"
>>> -
>>> -SUMMARY_${PN}-argparse="Python command line argument parser"
>>> -RDEPENDS_${PN}-argparse="${PN}-core ${PN}-codecs ${PN}-textutils"
>>> -FILES_${PN}-argparse=" \
>>> - ${libdir}/python2.7/argparse.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-audio="Python Audio Handling"
>>> -RDEPENDS_${PN}-audio="${PN}-core"
>>> -FILES_${PN}-audio=" \
>>> - ${libdir}/python2.7/wave.* \
>>> - ${libdir}/python2.7/chunk.* \
>>> - ${libdir}/python2.7/sndhdr.* \
>>> - ${libdir}/python2.7/lib-dynload/ossaudiodev.so \
>>> - ${libdir}/python2.7/lib-dynload/audioop.so \
>>> - ${libdir}/python2.7/audiodev.* \
>>> - ${libdir}/python2.7/sunaudio.* \
>>> - ${libdir}/python2.7/sunau.* \
>>> - ${libdir}/python2.7/toaiff.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-bsddb="Python bindings for the Berkeley Database"
>>> -RDEPENDS_${PN}-bsddb="${PN}-core"
>>> -FILES_${PN}-bsddb=" \
>>> - ${libdir}/python2.7/bsddb \
>>> - ${libdir}/python2.7/lib-dynload/_bsddb.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-codecs="Python codecs, encodings & i18n support"
>>> -RDEPENDS_${PN}-codecs="${PN}-core ${PN}-lang"
>>> -FILES_${PN}-codecs=" \
>>> - ${libdir}/python2.7/codecs.* \
>>> - ${libdir}/python2.7/encodings \
>>> - ${libdir}/python2.7/gettext.* \
>>> - ${libdir}/python2.7/locale.* \
>>> - ${libdir}/python2.7/lib-dynload/_locale.so \
>>> - ${libdir}/python2.7/lib-dynload/_codecs* \
>>> - ${libdir}/python2.7/lib-dynload/_multibytecodec.so \
>>> - ${libdir}/python2.7/lib-dynload/unicodedata.so \
>>> - ${libdir}/python2.7/stringprep.* \
>>> - ${libdir}/python2.7/xdrlib.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-compile="Python bytecode compilation support"
>>> -RDEPENDS_${PN}-compile="${PN}-core"
>>> -FILES_${PN}-compile=" \
>>> - ${libdir}/python2.7/py_compile.* \
>>> - ${libdir}/python2.7/compileall.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-compiler="Python compiler support"
>>> -RDEPENDS_${PN}-compiler="${PN}-core"
>>> -FILES_${PN}-compiler=" \
>>> - ${libdir}/python2.7/compiler \
>>> -"
>>> -
>>> -SUMMARY_${PN}-compression="Python high-level compression support"
>>> -RDEPENDS_${PN}-compression="${PN}-core ${PN}-zlib"
>>> -FILES_${PN}-compression=" \
>>> - ${libdir}/python2.7/gzip.* \
>>> - ${libdir}/python2.7/zipfile.* \
>>> - ${libdir}/python2.7/tarfile.* \
>>> - ${libdir}/python2.7/lib-dynload/bz2.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-contextlib="Python utilities for with-statementcontexts."
>>> -RDEPENDS_${PN}-contextlib="${PN}-core"
>>> -FILES_${PN}-contextlib=" \
>>> - ${libdir}/python${PYTHON_MAJMIN}/contextlib.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-core="Python interpreter and core modules"
>>> -RDEPENDS_${PN}-core="${PN}-lang ${PN}-re"
>>> -FILES_${PN}-core=" \
>>> - ${libdir}/python2.7/__future__.* \
>>> - ${libdir}/python2.7/_abcoll.* \
>>> - ${libdir}/python2.7/abc.* \
>>> - ${libdir}/python2.7/ast.* \
>>> - ${libdir}/python2.7/copy.* \
>>> - ${libdir}/python2.7/copy_reg.* \
>>> - ${libdir}/python2.7/ConfigParser.* \
>>> - ${libdir}/python2.7/genericpath.* \
>>> - ${libdir}/python2.7/getopt.* \
>>> - ${libdir}/python2.7/linecache.* \
>>> - ${libdir}/python2.7/new.* \
>>> - ${libdir}/python2.7/os.* \
>>> - ${libdir}/python2.7/posixpath.* \
>>> - ${libdir}/python2.7/struct.* \
>>> - ${libdir}/python2.7/warnings.* \
>>> - ${libdir}/python2.7/site.* \
>>> - ${libdir}/python2.7/stat.* \
>>> - ${libdir}/python2.7/UserDict.* \
>>> - ${libdir}/python2.7/UserList.* \
>>> - ${libdir}/python2.7/UserString.* \
>>> - ${libdir}/python2.7/lib-dynload/binascii.so \
>>> - ${libdir}/python2.7/lib-dynload/_struct.so \
>>> - ${libdir}/python2.7/lib-dynload/time.so \
>>> - ${libdir}/python2.7/lib-dynload/xreadlines.so \
>>> - ${libdir}/python2.7/types.* \
>>> - ${libdir}/python2.7/platform.* \
>>> - ${bindir}/python* \
>>> - ${libdir}/python2.7/_weakrefset.* \
>>> - ${libdir}/python2.7/sysconfig.* \
>>> - ${libdir}/python2.7/_sysconfigdata.* \
>>> - ${includedir}/python${PYTHON_MAJMIN}/pyconfig*.h \
>>> - ${libdir}/python${PYTHON_MAJMIN}/sitecustomize.py \
>>> -"
>>> -
>>> -SUMMARY_${PN}-crypt="Python basic cryptographic and hashing support"
>>> -RDEPENDS_${PN}-crypt="${PN}-core"
>>> -FILES_${PN}-crypt=" \
>>> - ${libdir}/python2.7/hashlib.* \
>>> - ${libdir}/python2.7/md5.* \
>>> - ${libdir}/python2.7/sha.* \
>>> - ${libdir}/python2.7/lib-dynload/crypt.so \
>>> - ${libdir}/python2.7/lib-dynload/_hashlib.so \
>>> - ${libdir}/python2.7/lib-dynload/_sha256.so \
>>> - ${libdir}/python2.7/lib-dynload/_sha512.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-ctypes="Python C types support"
>>> -RDEPENDS_${PN}-ctypes="${PN}-core"
>>> -FILES_${PN}-ctypes=" \
>>> - ${libdir}/python2.7/ctypes \
>>> - ${libdir}/python2.7/lib-dynload/_ctypes.so \
>>> - ${libdir}/python2.7/lib-dynload/_ctypes_test.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-curses="Python curses support"
>>> -RDEPENDS_${PN}-curses="${PN}-core"
>>> -FILES_${PN}-curses=" \
>>> - ${libdir}/python2.7/curses \
>>> - ${libdir}/python2.7/lib-dynload/_curses.so \
>>> - ${libdir}/python2.7/lib-dynload/_curses_panel.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-datetime="Python calendar and time support"
>>> -RDEPENDS_${PN}-datetime="${PN}-core ${PN}-codecs"
>>> -FILES_${PN}-datetime=" \
>>> - ${libdir}/python2.7/_strptime.* \
>>> - ${libdir}/python2.7/calendar.* \
>>> - ${libdir}/python2.7/lib-dynload/datetime.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-db="Python file-based database support"
>>> -RDEPENDS_${PN}-db="${PN}-core"
>>> -FILES_${PN}-db=" \
>>> - ${libdir}/python2.7/anydbm.* \
>>> - ${libdir}/python2.7/dumbdbm.* \
>>> - ${libdir}/python2.7/whichdb.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-debugger="Python debugger"
>>> -RDEPENDS_${PN}-debugger="${PN}-core ${PN}-io ${PN}-lang ${PN}-re
>>> ${PN}-stringold ${PN}-shell ${PN}-pprint"
>>> -FILES_${PN}-debugger=" \
>>> - ${libdir}/python2.7/bdb.* \
>>> - ${libdir}/python2.7/pdb.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-dev="Python development package"
>>> -RDEPENDS_${PN}-dev="${PN}-core"
>>> -FILES_${PN}-dev=" \
>>> - ${includedir} \
>>> - ${libdir}/lib*${SOLIBSDEV} \
>>> - ${libdir}/*.la \
>>> - ${libdir}/*.a \
>>> - ${libdir}/*.o \
>>> - ${libdir}/pkgconfig \
>>> - ${base_libdir}/*.a \
>>> - ${base_libdir}/*.o \
>>> - ${datadir}/aclocal \
>>> - ${datadir}/pkgconfig \
>>> - ${libdir}/python2.7/config/Makefile \
>>> -"
>>> -
>>> -SUMMARY_${PN}-difflib="Python helpers for computing deltas between
>>> objects"
>>> -RDEPENDS_${PN}-difflib="${PN}-lang ${PN}-re"
>>> -FILES_${PN}-difflib=" \
>>> - ${libdir}/python2.7/difflib.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-distutils="Python Distribution Utilities"
>>> -RDEPENDS_${PN}-distutils="${PN}-core ${PN}-email"
>>> -FILES_${PN}-distutils=" \
>>> - ${libdir}/python2.7/config \
>>> - ${libdir}/python2.7/distutils \
>>> -"
>>> -
>>> -SUMMARY_${PN}-distutils-staticdev="Python distribution utilities
>>> (static libraries)"
>>> -RDEPENDS_${PN}-distutils-staticdev="${PN}-distutils"
>>> -FILES_${PN}-distutils-staticdev=" \
>>> - ${libdir}/python2.7/config/lib*.a \
>>> -"
>>> -
>>> -SUMMARY_${PN}-doctest="Python framework for running examples in
>>> docstrings"
>>> -RDEPENDS_${PN}-doctest="${PN}-core ${PN}-lang ${PN}-io ${PN}-re
>>> ${PN}-unittest ${PN}-debugger ${PN}-difflib"
>>> -FILES_${PN}-doctest=" \
>>> - ${libdir}/python2.7/doctest.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-email="Python email support"
>>> -RDEPENDS_${PN}-email="${PN}-core ${PN}-io ${PN}-re ${PN}-mime
>>> ${PN}-audio ${PN}-image ${PN}-netclient"
>>> -FILES_${PN}-email=" \
>>> - ${libdir}/python2.7/imaplib.* \
>>> - ${libdir}/python2.7/email \
>>> -"
>>> -
>>> -SUMMARY_${PN}-fcntl="Python's fcntl interface"
>>> -RDEPENDS_${PN}-fcntl="${PN}-core"
>>> -FILES_${PN}-fcntl=" \
>>> - ${libdir}/python2.7/lib-dynload/fcntl.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-gdbm="Python GNU database support"
>>> -RDEPENDS_${PN}-gdbm="${PN}-core"
>>> -FILES_${PN}-gdbm=" \
>>> - ${libdir}/python2.7/lib-dynload/gdbm.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-hotshot="Python hotshot performance profiler"
>>> -RDEPENDS_${PN}-hotshot="${PN}-core"
>>> -FILES_${PN}-hotshot=" \
>>> - ${libdir}/python2.7/hotshot \
>>> - ${libdir}/python2.7/lib-dynload/_hotshot.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-html="Python HTML processing support"
>>> -RDEPENDS_${PN}-html="${PN}-core"
>>> -FILES_${PN}-html=" \
>>> - ${libdir}/python2.7/formatter.* \
>>> - ${libdir}/python2.7/htmlentitydefs.* \
>>> - ${libdir}/python2.7/htmllib.* \
>>> - ${libdir}/python2.7/markupbase.* \
>>> - ${libdir}/python2.7/sgmllib.* \
>>> - ${libdir}/python2.7/HTMLParser.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-idle="Python Integrated Development Environment"
>>> -RDEPENDS_${PN}-idle="${PN}-core ${PN}-tkinter"
>>> -FILES_${PN}-idle=" \
>>> - ${bindir}/idle \
>>> - ${libdir}/python2.7/idlelib \
>>> -"
>>> -
>>> -SUMMARY_${PN}-image="Python graphical image handling"
>>> -RDEPENDS_${PN}-image="${PN}-core"
>>> -FILES_${PN}-image=" \
>>> - ${libdir}/python2.7/colorsys.* \
>>> - ${libdir}/python2.7/imghdr.* \
>>> - ${libdir}/python2.7/lib-dynload/imageop.so \
>>> - ${libdir}/python2.7/lib-dynload/rgbimg.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-importlib="Python import implementation library"
>>> -RDEPENDS_${PN}-importlib="${PN}-core"
>>> -FILES_${PN}-importlib=" \
>>> - ${libdir}/python2.7/importlib \
>>> -"
>>> -
>>> -SUMMARY_${PN}-io="Python low-level I/O"
>>> -RDEPENDS_${PN}-io="${PN}-core ${PN}-math ${PN}-textutils
>>> ${PN}-netclient ${PN}-contextlib"
>>> -FILES_${PN}-io=" \
>>> - ${libdir}/python2.7/lib-dynload/_socket.so \
>>> - ${libdir}/python2.7/lib-dynload/_io.so \
>>> - ${libdir}/python2.7/lib-dynload/_ssl.so \
>>> - ${libdir}/python2.7/lib-dynload/select.so \
>>> - ${libdir}/python2.7/lib-dynload/termios.so \
>>> - ${libdir}/python2.7/lib-dynload/cStringIO.so \
>>> - ${libdir}/python2.7/pipes.* \
>>> - ${libdir}/python2.7/socket.* \
>>> - ${libdir}/python2.7/ssl.* \
>>> - ${libdir}/python2.7/tempfile.* \
>>> - ${libdir}/python2.7/StringIO.* \
>>> - ${libdir}/python2.7/io.* \
>>> - ${libdir}/python2.7/_pyio.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-json="Python JSON support"
>>> -RDEPENDS_${PN}-json="${PN}-core ${PN}-math ${PN}-re ${PN}-codecs"
>>> -FILES_${PN}-json=" \
>>> - ${libdir}/python2.7/json \
>>> - ${libdir}/python2.7/lib-dynload/_json.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-lang="Python low-level language support"
>>> -RDEPENDS_${PN}-lang="${PN}-core"
>>> -FILES_${PN}-lang=" \
>>> - ${libdir}/python2.7/lib-dynload/_bisect.so \
>>> - ${libdir}/python2.7/lib-dynload/_collections.so \
>>> - ${libdir}/python2.7/lib-dynload/_heapq.so \
>>> - ${libdir}/python2.7/lib-dynload/_weakref.so \
>>> - ${libdir}/python2.7/lib-dynload/_functools.so \
>>> - ${libdir}/python2.7/lib-dynload/array.so \
>>> - ${libdir}/python2.7/lib-dynload/itertools.so \
>>> - ${libdir}/python2.7/lib-dynload/operator.so \
>>> - ${libdir}/python2.7/lib-dynload/parser.so \
>>> - ${libdir}/python2.7/atexit.* \
>>> - ${libdir}/python2.7/bisect.* \
>>> - ${libdir}/python2.7/code.* \
>>> - ${libdir}/python2.7/codeop.* \
>>> - ${libdir}/python2.7/collections.* \
>>> - ${libdir}/python2.7/dis.* \
>>> - ${libdir}/python2.7/functools.* \
>>> - ${libdir}/python2.7/heapq.* \
>>> - ${libdir}/python2.7/inspect.* \
>>> - ${libdir}/python2.7/keyword.* \
>>> - ${libdir}/python2.7/opcode.* \
>>> - ${libdir}/python2.7/symbol.* \
>>> - ${libdir}/python2.7/repr.* \
>>> - ${libdir}/python2.7/token.* \
>>> - ${libdir}/python2.7/tokenize.* \
>>> - ${libdir}/python2.7/traceback.* \
>>> - ${libdir}/python2.7/weakref.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-logging="Python logging support"
>>> -RDEPENDS_${PN}-logging="${PN}-core ${PN}-io ${PN}-lang ${PN}-pickle
>>> ${PN}-stringold"
>>> -FILES_${PN}-logging=" \
>>> - ${libdir}/python2.7/logging \
>>> -"
>>> -
>>> -SUMMARY_${PN}-mailbox="Python mailbox format support"
>>> -RDEPENDS_${PN}-mailbox="${PN}-core ${PN}-mime"
>>> -FILES_${PN}-mailbox=" \
>>> - ${libdir}/python2.7/mailbox.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-math="Python math support"
>>> -RDEPENDS_${PN}-math="${PN}-core ${PN}-crypt"
>>> -FILES_${PN}-math=" \
>>> - ${libdir}/python2.7/lib-dynload/cmath.so \
>>> - ${libdir}/python2.7/lib-dynload/math.so \
>>> - ${libdir}/python2.7/lib-dynload/_random.so \
>>> - ${libdir}/python2.7/random.* \
>>> - ${libdir}/python2.7/sets.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-mime="Python MIME handling APIs"
>>> -RDEPENDS_${PN}-mime="${PN}-core ${PN}-io"
>>> -FILES_${PN}-mime=" \
>>> - ${libdir}/python2.7/mimetools.* \
>>> - ${libdir}/python2.7/uu.* \
>>> - ${libdir}/python2.7/quopri.* \
>>> - ${libdir}/python2.7/rfc822.* \
>>> - ${libdir}/python2.7/MimeWriter.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-mmap="Python memory-mapped file support"
>>> -RDEPENDS_${PN}-mmap="${PN}-core ${PN}-io"
>>> -FILES_${PN}-mmap=" \
>>> - ${libdir}/python2.7/lib-dynload/mmap.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-multiprocessing="Python multiprocessing support"
>>> -RDEPENDS_${PN}-multiprocessing="${PN}-core ${PN}-io ${PN}-lang
>>> ${PN}-pickle ${PN}-threading ${PN}-ctypes ${PN}-mmap"
>>> -FILES_${PN}-multiprocessing=" \
>>> - ${libdir}/python2.7/lib-dynload/_multiprocessing.so \
>>> - ${libdir}/python2.7/multiprocessing \
>>> -"
>>> -
>>> -SUMMARY_${PN}-netclient="Python Internet Protocol clients"
>>> -RDEPENDS_${PN}-netclient="${PN}-core ${PN}-crypt ${PN}-datetime
>>> ${PN}-io ${PN}-lang ${PN}-logging ${PN}-mime"
>>> -FILES_${PN}-netclient=" \
>>> - ${libdir}/python2.7/*Cookie*.* \
>>> - ${libdir}/python2.7/base64.* \
>>> - ${libdir}/python2.7/cookielib.* \
>>> - ${libdir}/python2.7/ftplib.* \
>>> - ${libdir}/python2.7/gopherlib.* \
>>> - ${libdir}/python2.7/hmac.* \
>>> - ${libdir}/python2.7/httplib.* \
>>> - ${libdir}/python2.7/mimetypes.* \
>>> - ${libdir}/python2.7/nntplib.* \
>>> - ${libdir}/python2.7/poplib.* \
>>> - ${libdir}/python2.7/smtplib.* \
>>> - ${libdir}/python2.7/telnetlib.* \
>>> - ${libdir}/python2.7/urllib.* \
>>> - ${libdir}/python2.7/urllib2.* \
>>> - ${libdir}/python2.7/urlparse.* \
>>> - ${libdir}/python2.7/uuid.* \
>>> - ${libdir}/python2.7/rfc822.* \
>>> - ${libdir}/python2.7/mimetools.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-netserver="Python Internet Protocol servers"
>>> -RDEPENDS_${PN}-netserver="${PN}-core ${PN}-netclient ${PN}-shell
>>> ${PN}-threading"
>>> -FILES_${PN}-netserver=" \
>>> - ${libdir}/python2.7/cgi.* \
>>> - ${libdir}/python2.7/*HTTPServer.* \
>>> - ${libdir}/python2.7/SocketServer.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-numbers="Python number APIs"
>>> -RDEPENDS_${PN}-numbers="${PN}-core ${PN}-lang ${PN}-re"
>>> -FILES_${PN}-numbers=" \
>>> - ${libdir}/python2.7/decimal.* \
>>> - ${libdir}/python2.7/fractions.* \
>>> - ${libdir}/python2.7/numbers.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-pickle="Python serialisation/persistence support"
>>> -RDEPENDS_${PN}-pickle="${PN}-core ${PN}-codecs ${PN}-io ${PN}-re"
>>> -FILES_${PN}-pickle=" \
>>> - ${libdir}/python2.7/pickle.* \
>>> - ${libdir}/python2.7/shelve.* \
>>> - ${libdir}/python2.7/lib-dynload/cPickle.so \
>>> - ${libdir}/python2.7/pickletools.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-pkgutil="Python package extension utility support"
>>> -RDEPENDS_${PN}-pkgutil="${PN}-core"
>>> -FILES_${PN}-pkgutil=" \
>>> - ${libdir}/python2.7/pkgutil.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-plistlib="Generate and parse Mac OS X .plist files"
>>> -RDEPENDS_${PN}-plistlib="${PN}-core ${PN}-datetime ${PN}-io"
>>> -FILES_${PN}-plistlib=" \
>>> - ${libdir}/python2.7/plistlib.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-pprint="Python pretty-print support"
>>> -RDEPENDS_${PN}-pprint="${PN}-core ${PN}-io"
>>> -FILES_${PN}-pprint=" \
>>> - ${libdir}/python2.7/pprint.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-profile="Python basic performance profiling support"
>>> -RDEPENDS_${PN}-profile="${PN}-core ${PN}-textutils"
>>> -FILES_${PN}-profile=" \
>>> - ${libdir}/python2.7/profile.* \
>>> - ${libdir}/python2.7/pstats.* \
>>> - ${libdir}/python2.7/cProfile.* \
>>> - ${libdir}/python2.7/lib-dynload/_lsprof.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-pydoc="Python interactive help support"
>>> -RDEPENDS_${PN}-pydoc="${PN}-core ${PN}-lang ${PN}-stringold ${PN}-re"
>>> -FILES_${PN}-pydoc=" \
>>> - ${bindir}/pydoc \
>>> - ${libdir}/python2.7/pydoc.* \
>>> - ${libdir}/python2.7/pydoc_data \
>>> -"
>>> -
>>> -SUMMARY_${PN}-re="Python Regular Expression APIs"
>>> -RDEPENDS_${PN}-re="${PN}-core"
>>> -FILES_${PN}-re=" \
>>> - ${libdir}/python2.7/re.* \
>>> - ${libdir}/python2.7/sre.* \
>>> - ${libdir}/python2.7/sre_compile.* \
>>> - ${libdir}/python2.7/sre_constants* \
>>> - ${libdir}/python2.7/sre_parse.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-readline="Python readline support"
>>> -RDEPENDS_${PN}-readline="${PN}-core"
>>> -FILES_${PN}-readline=" \
>>> - ${libdir}/python2.7/lib-dynload/readline.so \
>>> - ${libdir}/python2.7/rlcompleter.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-resource="Python resource control interface"
>>> -RDEPENDS_${PN}-resource="${PN}-core"
>>> -FILES_${PN}-resource=" \
>>> - ${libdir}/python2.7/lib-dynload/resource.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-robotparser="Python robots.txt parser"
>>> -RDEPENDS_${PN}-robotparser="${PN}-core ${PN}-netclient"
>>> -FILES_${PN}-robotparser=" \
>>> - ${libdir}/python2.7/robotparser.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-runpy="Python script for locating/executing scripts in
>>> module namespace"
>>> -RDEPENDS_${PN}-runpy="${PN}-core ${PN}-pkgutil"
>>> -FILES_${PN}-runpy=" \
>>> - ${libdir}/python2.7/runpy.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-shell="Python shell-like functionality"
>>> -RDEPENDS_${PN}-shell="${PN}-core ${PN}-re"
>>> -FILES_${PN}-shell=" \
>>> - ${libdir}/python2.7/cmd.* \
>>> - ${libdir}/python2.7/commands.* \
>>> - ${libdir}/python2.7/dircache.* \
>>> - ${libdir}/python2.7/fnmatch.* \
>>> - ${libdir}/python2.7/glob.* \
>>> - ${libdir}/python2.7/popen2.* \
>>> - ${libdir}/python2.7/shlex.* \
>>> - ${libdir}/python2.7/shutil.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-smtpd="Python Simple Mail Transport Daemon"
>>> -RDEPENDS_${PN}-smtpd="${PN}-core ${PN}-netserver ${PN}-email
>>> ${PN}-mime"
>>> -FILES_${PN}-smtpd=" \
>>> - ${bindir}/smtpd.* \
>>> - ${libdir}/python2.7/smtpd.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-sqlite3="Python Sqlite3 database support"
>>> -RDEPENDS_${PN}-sqlite3="${PN}-core ${PN}-datetime ${PN}-lang
>>> ${PN}-crypt ${PN}-io ${PN}-threading ${PN}-zlib"
>>> -FILES_${PN}-sqlite3=" \
>>> - ${libdir}/python2.7/lib-dynload/_sqlite3.so \
>>> - ${libdir}/python2.7/sqlite3/dbapi2.* \
>>> - ${libdir}/python2.7/sqlite3/__init__.* \
>>> - ${libdir}/python2.7/sqlite3/dump.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-sqlite3-tests="Python Sqlite3 database support tests"
>>> -RDEPENDS_${PN}-sqlite3-tests="${PN}-core ${PN}-sqlite3"
>>> -FILES_${PN}-sqlite3-tests=" \
>>> - ${libdir}/python2.7/sqlite3/test \
>>> -"
>>> -
>>> -SUMMARY_${PN}-stringold="Python string APIs [deprecated]"
>>> -RDEPENDS_${PN}-stringold="${PN}-core ${PN}-re"
>>> -FILES_${PN}-stringold=" \
>>> - ${libdir}/python2.7/lib-dynload/strop.so \
>>> - ${libdir}/python2.7/string.* \
>>> - ${libdir}/python2.7/stringold.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-subprocess="Python subprocess support"
>>> -RDEPENDS_${PN}-subprocess="${PN}-core ${PN}-io ${PN}-re ${PN}-fcntl
>>> ${PN}-pickle"
>>> -FILES_${PN}-subprocess=" \
>>> - ${libdir}/python2.7/subprocess.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-syslog="Python syslog interface"
>>> -RDEPENDS_${PN}-syslog="${PN}-core"
>>> -FILES_${PN}-syslog=" \
>>> - ${libdir}/python2.7/lib-dynload/syslog.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-terminal="Python terminal controlling support"
>>> -RDEPENDS_${PN}-terminal="${PN}-core ${PN}-io"
>>> -FILES_${PN}-terminal=" \
>>> - ${libdir}/python2.7/pty.* \
>>> - ${libdir}/python2.7/tty.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-tests="Python tests"
>>> -RDEPENDS_${PN}-tests="${PN}-core ${PN}-modules"
>>> -FILES_${PN}-tests=" \
>>> - ${libdir}/python2.7/test \
>>> -"
>>> -
>>> -SUMMARY_${PN}-textutils="Python option parsing, text wrapping and CSV
>>> support"
>>> -RDEPENDS_${PN}-textutils="${PN}-core ${PN}-io ${PN}-re ${PN}-stringold"
>>> -FILES_${PN}-textutils=" \
>>> - ${libdir}/python2.7/lib-dynload/_csv.so \
>>> - ${libdir}/python2.7/csv.* \
>>> - ${libdir}/python2.7/optparse.* \
>>> - ${libdir}/python2.7/textwrap.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-threading="Python threading & synchronization support"
>>> -RDEPENDS_${PN}-threading="${PN}-core ${PN}-lang"
>>> -FILES_${PN}-threading=" \
>>> - ${libdir}/python2.7/_threading_local.* \
>>> - ${libdir}/python2.7/dummy_thread.* \
>>> - ${libdir}/python2.7/dummy_threading.* \
>>> - ${libdir}/python2.7/mutex.* \
>>> - ${libdir}/python2.7/threading.* \
>>> - ${libdir}/python2.7/Queue.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-tkinter="Python Tcl/Tk bindings"
>>> -RDEPENDS_${PN}-tkinter="${PN}-core"
>>> -FILES_${PN}-tkinter=" \
>>> - ${libdir}/python2.7/lib-dynload/_tkinter.so \
>>> - ${libdir}/python2.7/lib-tk \
>>> -"
>>> -
>>> -SUMMARY_${PN}-unittest="Python unit testing framework"
>>> -RDEPENDS_${PN}-unittest="${PN}-core ${PN}-stringold ${PN}-lang
>>> ${PN}-io ${PN}-difflib ${PN}-pprint ${PN}-shell"
>>> -FILES_${PN}-unittest=" \
>>> - ${libdir}/python2.7/unittest/ \
>>> -"
>>> -
>>> -SUMMARY_${PN}-unixadmin="Python Unix administration support"
>>> -RDEPENDS_${PN}-unixadmin="${PN}-core"
>>> -FILES_${PN}-unixadmin=" \
>>> - ${libdir}/python2.7/lib-dynload/nis.so \
>>> - ${libdir}/python2.7/lib-dynload/grp.so \
>>> - ${libdir}/python2.7/lib-dynload/pwd.so \
>>> - ${libdir}/python2.7/getpass.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-xml="Python basic XML support"
>>> -RDEPENDS_${PN}-xml="${PN}-core ${PN}-re"
>>> -FILES_${PN}-xml=" \
>>> - ${libdir}/python2.7/lib-dynload/_elementtree.so \
>>> - ${libdir}/python2.7/lib-dynload/pyexpat.so \
>>> - ${libdir}/python2.7/xml \
>>> - ${libdir}/python2.7/xmllib.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-xmlrpc="Python XML-RPC support"
>>> -RDEPENDS_${PN}-xmlrpc="${PN}-core ${PN}-xml ${PN}-netserver ${PN}-lang"
>>> -FILES_${PN}-xmlrpc=" \
>>> - ${libdir}/python2.7/xmlrpclib.* \
>>> - ${libdir}/python2.7/SimpleXMLRPCServer.* \
>>> - ${libdir}/python2.7/DocXMLRPCServer.* \
>>> -"
>>> -
>>> -SUMMARY_${PN}-zlib="Python zlib compression support"
>>> -RDEPENDS_${PN}-zlib="${PN}-core"
>>> -FILES_${PN}-zlib=" \
>>> - ${libdir}/python2.7/lib-dynload/zlib.so \
>>> -"
>>> -
>>> -SUMMARY_${PN}-modules="All Python modules"
>>> -RDEPENDS_${PN}-modules=" \
>>> - ${PN}-2to3 \
>>> - ${PN}-argparse \
>>> - ${PN}-audio \
>>> - ${PN}-bsddb \
>>> - ${PN}-codecs \
>>> - ${PN}-compile \
>>> - ${PN}-compiler \
>>> - ${PN}-compression \
>>> - ${PN}-contextlib \
>>> - ${PN}-core \
>>> - ${PN}-crypt \
>>> - ${PN}-ctypes \
>>> - ${PN}-curses \
>>> - ${PN}-datetime \
>>> - ${PN}-db \
>>> - ${PN}-debugger \
>>> - ${PN}-difflib \
>>> - ${PN}-distutils \
>>> - ${PN}-doctest \
>>> - ${PN}-email \
>>> - ${PN}-fcntl \
>>> - ${PN}-gdbm \
>>> - ${PN}-hotshot \
>>> - ${PN}-html \
>>> - ${PN}-idle \
>>> - ${PN}-image \
>>> - ${PN}-importlib \
>>> - ${PN}-io \
>>> - ${PN}-json \
>>> - ${PN}-lang \
>>> - ${PN}-logging \
>>> - ${PN}-mailbox \
>>> - ${PN}-math \
>>> - ${PN}-mime \
>>> - ${PN}-mmap \
>>> - ${PN}-multiprocessing \
>>> - ${PN}-netclient \
>>> - ${PN}-netserver \
>>> - ${PN}-numbers \
>>> - ${PN}-pickle \
>>> - ${PN}-pkgutil \
>>> - ${PN}-plistlib \
>>> - ${PN}-pprint \
>>> - ${PN}-profile \
>>> - ${PN}-pydoc \
>>> - ${PN}-re \
>>> - ${PN}-readline \
>>> - ${PN}-resource \
>>> - ${PN}-robotparser \
>>> - ${PN}-runpy \
>>> - ${PN}-shell \
>>> - ${PN}-smtpd \
>>> - ${PN}-sqlite3 \
>>> - ${PN}-sqlite3-tests \
>>> - ${PN}-stringold \
>>> - ${PN}-subprocess \
>>> - ${PN}-syslog \
>>> - ${PN}-terminal \
>>> - ${PN}-textutils \
>>> - ${PN}-threading \
>>> - ${PN}-tkinter \
>>> - ${PN}-unittest \
>>> - ${PN}-unixadmin \
>>> - ${PN}-xml \
>>> - ${PN}-xmlrpc \
>>> - ${PN}-zlib \
>>> -"
>>> -ALLOW_EMPTY_${PN}-modules = "1"
>>> -
>>> -
>>> diff --git a/meta/recipes-devtools/python/python-native-2.7-manifest.inc
>>> b/meta/recipes-devtools/python/python-native-2.7-manifest.inc
>>> deleted file mode 100644
>>> index b05aae0..0000000
>>> --- a/meta/recipes-devtools/python/python-native-2.7-manifest.inc
>>> +++ /dev/null
>>> @@ -1,9 +0,0 @@
>>> -
>>> -# WARNING: This file is AUTO GENERATED: Manual edits will be lost next
>>> time I regenerate the file.
>>> -# Generator: '../scripts/contrib/python/generate-manifest-2.7.py
>>> --native' Version 20110222.2 (C) 2002-2010 Michael 'Mickey' Lauer <
>>> mlauer at vanille-media.de>
>>> -
>>> -
>>> -
>>> -RPROVIDES += "python-modules-native python-2to3-native
>>> python-argparse-native python-audio-native python-bsddb-native
>>> python-codecs-native python-compile-native python-compiler-native
>>> python-compression-native python-contextlib-native python-core-native
>>> python-crypt-native python-ctypes-native python-curses-native
>>> python-datetime-native python-db-native python-debugger-native
>>> python-dev-native python-difflib-native python-distutils-native
>>> python-distutils-staticdev-native python-doctest- [...]
>>> -
>>> -
>>> diff --git a/meta/recipes-devtools/python/python-native_2.7.13.bb
>>> b/meta/recipes-devtools/python/python-native_2.7.13.bb
>>> index 7edf153..2b74003 100644
>>> --- a/meta/recipes-devtools/python/python-native_2.7.13.bb
>>> +++ b/meta/recipes-devtools/python/python-native_2.7.13.bb
>>> @@ -1,5 +1,4 @@
>>> require python.inc
>>> -
>>> EXTRANATIVEPATH += "bzip2-native"
>>> DEPENDS = "openssl-native bzip2-replacement-native zlib-native
>>> readline-native sqlite3-native expat-native"
>>> PR = "${INC_PR}.1"
>>> <https://maps.google.com/?q=PR%7D.1%22+%0D+@@+-25,8&entry=gmail&source=g>
>>> @@ -25,8 +24,6 @@ FILESEXTRAPATHS =. "${FILE_DIRNAME}/${PN}:"
>>>
>>> inherit native
>>>
>>> -require python-native-${PYTHON_MAJMIN}-manifest.inc
>>> -
>>> EXTRA_OECONF_append = " --bindir=${bindir}/${PN}
>>> --with-system-expat=${STAGING_DIR_HOST}"
>>>
>>> EXTRA_OEMAKE = '\
>>> @@ -59,3 +56,24 @@ do_install() {
>>> # installed in the native sysroot, so disable user site support.
>>> sed -i -e 's,^\(ENABLE_USER_SITE = \).*,\1False,'
>>> ${D}${libdir}/python${PYTHON_MAJMIN}/site.py
>>> }
>>> +
>>> +python(){
>>> +
>>> + # Read JSON manifest
>>> + import json
>>> + pythondir = d.getVar('THISDIR',True)
>>> + with open(pythondir+'/python/python2-manifest.json') as
>>> manifest_file:
>>> + python_manifest=json.load(manifest_file)
>>> +
>>> + rprovides = d.getVar('RPROVIDES').split()
>>> +
>>> + # Hardcoded since it cant be python-native-foo, should be
>>> python-foo-native
>>> + pn = 'python'
>>> +
>>> + for key in python_manifest:
>>> + pypackage = pn + '-' + key + '-native'
>>> + if pypackage not in rprovides:
>>> + rprovides.append(pypackage)
>>> +
>>> + d.setVar('RPROVIDES', ' '.join(rprovides))
>>> +}
>>> diff --git a/meta/recipes-devtools/python/python/create_manifest2.py
>>> b/meta/recipes-devtools/python/python/create_manifest2.py
>>> new file mode 100644
>>> index 0000000..bd64ec3
>>> --- /dev/null
>>> +++ b/meta/recipes-devtools/python/python/create_manifest2.py
>>> @@ -0,0 +1,277 @@
>>> +# This script is used as a bitbake task to create a new python manifest
>>> +# $ bitbake python -c create_manifest
>>> +#
>>> +# Our goal is to keep python-core as small as posible and add other
>>> python
>>> +# packages only when the user needs them, hence why we split upstream
>>> python
>>> +# into several packages.
>>> +#
>>> +# In a very simplistic way what this does is:
>>> +# Launch python and see specifically what is required for it to run at
>>> a minimum
>>> +#
>>> +# Go through the python-manifest file and launch a separate task for
>>> every single
>>> +# one of the files on each package, this task will check what was
>>> required for that
>>> +# specific module to run, these modules will be called dependencies.
>>> +# The output of such task will be a list of the modules or dependencies
>>> that were
>>> +# found for that file.
>>> +#
>>> +# Such output will be parsed by this script, we will look for each
>>> dependency on the
>>> +# manifest and if we find that another package already includes it,
>>> then we will add
>>> +# that package as an RDEPENDS to the package we are currently checking;
>>> in case we dont
>>> +# find the current dependency on any other package we will add it to
>>> the current package
>>> +# as part of FILES.
>>> +#
>>> +#
>>> +# This way we will create a new manifest from the data structure that
>>> was built during
>>> +# this process, ont this new manifest each package will contain
>>> specifically only
>>> +# what it needs to run.
>>> +#
>>> +# There are some caveats which we try to deal with, such as repeated
>>> files on different
>>> +# packages, packages that include folders, wildcards, and special
>>> packages.
>>> +# Its also important to note that this method only works for python
>>> files, and shared
>>> +# libraries. Static libraries, header files and binaries need to be
>>> dealt with manually.
>>> +#
>>> +# Author: Alejandro Enedino Hernandez Samaniego "aehs29" <
>>> aehs29 at gmail.com>
>>> +
>>> +
>>> +import sys
>>> +import subprocess
>>> +import json
>>> +import os
>>> +
>>> +# Hack to get native python search path (for folders), not fond of it
>>> but it works for now
>>> +pivot='recipe-sysroot-native'
>>> +for p in sys.path:
>>> + if pivot in p:
>>> + nativelibfolder=p[:p.find(pivot)+len(pivot)]
>>> +
>>> +# Empty dict to hold the whole manifest
>>> +new_manifest = {}
>>> +
>>> +# Check for repeated files, folders and wildcards
>>> +allfiles=[]
>>> +repeated=[]
>>> +wildcards=[]
>>> +
>>> +hasfolders=[]
>>> +allfolders=[]
>>> +
>>> +def isFolder(value):
>>> + if os.path.isdir(value.replace('${libdir}',nativelibfolder+'/usr/lib'))
>>> or os.path.isdir(value.replace('${libdir}',nativelibfolder+'/usr/lib64'))
>>> or os.path.isdir(value.replace('${libdir}',nativelibfolder+'/us
>>> r/lib32')):
>>> + return True
>>> + else:
>>> + return False
>>> +
>>> +# Read existing JSON manifest
>>> +with open('python2-manifest.json') as manifest:
>>> + old_manifest=json.load(manifest)
>>> +
>>> +
>>> +# First pass to get core-package functionality, because we base
>>> everything on the fact that core is actually working
>>> +# Not exactly the same so it should not be a function
>>> +print ("Getting dependencies for core package:")
>>> +
>>> +# Special call to check for core package
>>> +output = subprocess.check_output([sys.executable,
>>> 'get_module_deps2.py', 'python-core-package'])
>>> +for item in output.split():
>>> + # We append it so it doesnt hurt what we currently have:
>>> + if item not in old_manifest['core']['files']:
>>> + # We use the same data structure since its the one which will
>>> be used to check
>>> + # dependencies for other packages
>>> + old_manifest['core']['files'].append(item)
>>> +
>>> +for value in old_manifest['core']['files']:
>>> + # Ignore folders, since we don't import those, difficult to handle
>>> multilib
>>> + if isFolder(value):
>>> + # Pass it directly
>>> + if value not in old_manifest['core']['files']:
>>> + old_manifest['core']['files'].append(value)
>>> + # Ignore binaries, since we don't import those, assume it was added
>>> correctly (manually)
>>> + if '${bindir}' in value:
>>> + # Pass it directly
>>> + if value not in old_manifest['core']['files']:
>>> + old_manifest['core']['files'].append(value)
>>> + continue
>>> + # Ignore empty values
>>> + if value == '':
>>> + continue
>>> + if '${includedir}' in value:
>>> + if value not in old_manifest['core']['files']:
>>> + old_manifest['core']['files'].append(value)
>>> + continue
>>> + # Get module name , shouldnt be affected by libdir/bindir
>>> + value = os.path.splitext(os.path.basename(os.path.normpath(value)))[
>>> 0]
>>> +
>>> +
>>> + # Launch separate task for each module for deterministic behavior
>>> + # Each module will only import what is necessary for it to work in
>>> specific
>>> + print ('Getting dependencies for module: %s' % value)
>>> + output = subprocess.check_output([sys.executable,
>>> 'get_module_deps2.py', '%s' % value])
>>> + for item in output.split():
>>> + # We append it so it doesnt hurt what we currently have:
>>> + if item not in old_manifest['core']['files']:
>>> + old_manifest['core']['files'].append(item)
>>> +
>>> +# We check which packages include folders
>>> +for key in old_manifest:
>>> + for value in old_manifest[key]['files']:
>>> + # Ignore folders, since we don't import those, difficult to
>>> handle multilib
>>> + if isFolder(value):
>>> + print ('%s is a folder' % value)
>>> + if key not in hasfolders:
>>> + hasfolders.append(key)
>>> + if value not in allfolders:
>>> + allfolders.append(value)
>>> +
>>> +for key in old_manifest:
>>> + # Use an empty dict as data structure to hold data for each package
>>> and fill it up
>>> + new_manifest[key]={}
>>> + new_manifest[key]['files']=[]
>>> + new_manifest[key]['rdepends']=[]
>>> + # All packages should depend on core
>>> + if key != 'core':
>>> + new_manifest[key]['rdepends'].append('core')
>>> + new_manifest[key]['summary']=old_manifest[key]['summary']
>>> +
>>> + # Handle special cases, we assume that when they were manually added
>>> + # to the manifest we knew what we were doing.
>>> + print ('Handling package %s' % key)
>>> + special_packages=['misc', 'modules', 'dev']
>>> + if key in special_packages or 'staticdev' in key:
>>> + print('Passing %s package directly' % key)
>>> + new_manifest[key]=old_manifest[key]
>>> + continue
>>> +
>>> + for value in old_manifest[key]['files']:
>>> + # We already handled core on the first pass
>>> + if key == 'core':
>>> + new_manifest[key]['files'].append(value)
>>> + continue
>>> + # Ignore folders, since we don't import those, difficult to
>>> handle multilib
>>> + if isFolder(value):
>>> + # Pass folders directly
>>> + new_manifest[key]['files'].append(value)
>>> + # Ignore binaries, since we don't import those
>>> + if '${bindir}' in value:
>>> + # Pass it directly to the new manifest data structure
>>> + if value not in new_manifest[key]['files']:
>>> + new_manifest[key]['files'].append(value)
>>> + continue
>>> + # Ignore empty values
>>> + if value == '':
>>> + continue
>>> + if '${includedir}' in value:
>>> + if value not in new_manifest[key]['files']:
>>> + new_manifest[key]['files'].append(value)
>>> + continue
>>> + # Get module name , shouldnt be affected by libdir/bindir
>>> + value = os.path.splitext(os.path.basen
>>> ame(os.path.normpath(value)))[0]
>>> +
>>> + # Launch separate task for each module for deterministic
>>> behavior
>>> + # Each module will only import what is necessary for it to work
>>> in specific
>>> + print ('Getting dependencies for module: %s' % value)
>>> + output = subprocess.check_output([sys.executable,
>>> 'get_module_deps2.py', '%s' % value])
>>> +
>>> + # We can print dependencies for debugging purposes
>>> + #print (output)
>>> + # Output will have all dependencies
>>> + for item in output.split():
>>> +
>>> + # Warning: This first part is ugly
>>> + # One of the dependencies that was found, could be inside
>>> of one of the folders included by another package
>>> + # We need to check if this happens so we can add the
>>> package containing the folder as an RDEPENDS
>>> + # e.g. Folder encodings contained in codecs
>>> + # This would be solved if no packages included any folders
>>> +
>>> + # This can be done in two ways:
>>> + # 1 - We assume that if we take out the filename from the
>>> path we would get
>>> + # the folder string, then we would check if folder string
>>> is in the list of folders
>>> + # This would not work if a package contains a folder
>>> which contains another folder
>>> + # e.g. path/folder1/folder2/filename folder_string=
>>> path/folder1/folder2
>>> + # folder_string would not match any value contained in
>>> the list of folders
>>> + #
>>> + # 2 - We do it the other way around, checking if the folder
>>> is contained in the path
>>> + # e.g. path/folder1/folder2/filename folder_string=
>>> path/folder1/folder2
>>> + # is folder_string inside path/folder1/folder2/filename?,
>>> + # Yes, it works, but we waste a couple of milliseconds.
>>> +
>>> + inFolders=False
>>> + for folder in allfolders:
>>> + if folder in item:
>>> + inFolders = True # Did we find a folder?
>>> + folderFound = False # Second flag to break inner for
>>> + # Loop only through packages which contain folders
>>> + for keyfolder in hasfolders:
>>> + if (folderFound == False):
>>> + #print("Checking folder %s on package %s" %
>>> (item,keyfolder))
>>> + for file_folder in
>>> old_manifest[keyfolder]['files']:
>>> + if file_folder==folder:
>>> + print ('%s found in %s' % (folder,
>>> keyfolder))
>>> + folderFound = True
>>> + if keyfolder not in
>>> new_manifest[key]['rdepends'] and keyfolder != key:
>>> + new_manifest[key]['rdepends'].
>>> append(keyfolder)
>>> + else:
>>> + break
>>> +
>>> + # A folder was found so we're done with this item, we can
>>> go on
>>> + if inFolders:
>>> + continue
>>> +
>>> + # We might already have it on the dictionary since it could
>>> depend on a (previously checked) module
>>> + if item not in new_manifest[key]['files']:
>>> + # Handle core as a special package, we already did it
>>> so we pass it to NEW data structure directly
>>> + if key=='core':
>>> + print('Adding %s to %s FILES' % (item, key))
>>> + if item.endswith('*'):
>>> + wildcards.append(item)
>>> + new_manifest[key]['files'].append(item)
>>> +
>>> + # Check for repeated files
>>> + if item not in allfiles:
>>> + allfiles.append(item)
>>> + else:
>>> + repeated.append(item)
>>> +
>>> + else:
>>> +
>>> + # Check if this dependency is already contained on
>>> another package, so we add it
>>> + # as an RDEPENDS, or if its not, it means it should
>>> be contained on the current
>>> + # package, so we should add it to FILES
>>> + for newkey in old_manifest:
>>> + # Debug
>>> + #print("Checking %s " % item + " in %s" %
>>> newkey)
>>> + if item in old_manifest[newkey]['files']:
>>> + # Since were nesting, we need to check
>>> its not the same key
>>> + if(newkey!=key):
>>> + if newkey not in
>>> new_manifest[key]['rdepends']:
>>> + # Add it to the new manifest
>>> data struct
>>> + # Debug
>>> + print('Adding %s to %s RDEPENDS,
>>> because it contains %s' % (newkey, key, item))
>>> + new_manifest[key]['rdepends']
>>> .append(newkey)
>>> + break
>>> + else:
>>> + # Debug
>>> + print('Adding %s to %s FILES' % (item, key))
>>> + # Since it wasnt found on another package, its
>>> not an RDEP, so add it to FILES for this package
>>> + new_manifest[key]['files'].append(item)
>>> + if item.endswith('*'):
>>> + wildcards.append(item)
>>> + if item not in allfiles:
>>> + allfiles.append(item)
>>> + else:
>>> + repeated.append(item)
>>> +
>>> +print ('The following files are repeated (contained in more than one
>>> package), please check which package should get it:')
>>> +print (repeated)
>>> +print('The following files contain wildcards, please check they are
>>> necessary')
>>> +print(wildcards)
>>> +print('The following files contain folders, please check they are
>>> necessary')
>>> +print(hasfolders)
>>> +
>>> +# Sort it just so it looks nice
>>> +for key in new_manifest:
>>> + new_manifest[key]['files'].sort()
>>> + new_manifest[key]['rdepends'].sort()
>>> +
>>> +# Create the manifest from the data structure that was built
>>> +with open('python2-manifest.json.new','w') as outfile:
>>> + json.dump(new_manifest,outfile,sort_keys=True, indent=4)
>>> diff --git a/meta/recipes-devtools/python/python/get_module_deps2.py
>>> b/meta/recipes-devtools/python/python/get_module_deps2.py
>>> new file mode 100644
>>> index 0000000..73e7c6f
>>> --- /dev/null
>>> +++ b/meta/recipes-devtools/python/python/get_module_deps2.py
>>> @@ -0,0 +1,112 @@
>>> +# This script is launched on separate task for each python module
>>> +# It checks for dependencies for that specific module and prints
>>> +# them out, the output of this execution will have all dependencies
>>> +# for a specific module, which will be parsed an dealt on
>>> create_manifest.py
>>> +#
>>> +# Author: Alejandro Enedino Hernandez Samaniego "aehs29" <
>>> aehs29 at gmail.com>
>>> +
>>> +
>>> +# We can get a log per module, for all the dependencies that were
>>> found, but its messy.
>>> +debug=False
>>> +
>>> +import sys
>>> +
>>> +# We can get a list of the modules which are currently required to run
>>> python
>>> +# so we run python-core and get its modules, we then import what we need
>>> +# and check what modules are currently running, if we substract them
>>> from the
>>> +# modules we had initially, we get the dependencies for the module we
>>> imported.
>>> +
>>> +# We use importlib to achieve this, so we also need to know what
>>> modules importlib needs
>>> +import importlib
>>> +
>>> +core_deps=set(sys.modules)
>>> +
>>> +def fix_path(dep_path):
>>> + import os
>>> + # We DONT want the path on our HOST system
>>> + pivot='recipe-sysroot-native'
>>> + dep_path=dep_path[dep_path.find(pivot)+len(pivot):]
>>> +
>>> + if '/usr/bin' in dep_path:
>>> + dep_path = dep_path.replace('/usr/bin''${bindir}')
>>> +
>>> + # Handle multilib, is there a better way?
>>> + if '/usr/lib32' in dep_path:
>>> + dep_path = dep_path.replace('/usr/lib32','${libdir}')
>>> + if '/usr/lib64' in dep_path:
>>> + dep_path = dep_path.replace('/usr/lib64','${libdir}')
>>> + if '/usr/lib' in dep_path:
>>> + dep_path = dep_path.replace('/usr/lib','${libdir}')
>>> + if '/usr/include' in dep_path:
>>> + dep_path = dep_path.replace('/usr/include','${includedir}')
>>> + if '__init__.' in dep_path:
>>> + dep_path = os.path.split(dep_path)[0]
>>> +
>>> + # If a *.pyc file was imported, we replace it with *.py (since we
>>> deal with PYCs on create_manifest)
>>> + if '.pyc' in dep_path:
>>> + dep_path = dep_path.replace('.pyc','.py')
>>> +
>>> + return dep_path
>>> +
>>> +# Module to import was passed as an argument
>>> +current_module = str(sys.argv[1]).rstrip()
>>> +if(debug==True):
>>> + log = open('log_%s' % current_module,'w')
>>> + log.write('Module %s generated the following dependencies:\n' %
>>> current_module)
>>> +try:
>>> + importlib.import_module('%s' % current_module)
>>> +except ImportError as e:
>>> + if (debug==True):
>>> + log.write('Module was not found')
>>> + pass
>>> +
>>> +
>>> +# Get current module dependencies, dif will contain a list of specific
>>> deps for this module
>>> +module_deps=set(sys.modules)
>>> +
>>> +# We handle the core package (1st pass on create_manifest.py) as a
>>> special case
>>> +if current_module == 'python-core-package':
>>> + dif = core_deps
>>> +else:
>>> + dif = module_deps-core_deps
>>> +
>>> +
>>> +# Check where each dependency came from
>>> +for item in dif:
>>> + dep_path=''
>>> + try:
>>> + if (debug==True):
>>> + log.write('Calling: sys.modules[' + '%s' % item +
>>> '].__file__\n')
>>> + dep_path = sys.modules['%s' % item].__file__
>>> + except AttributeError as e:
>>> + # Deals with thread (builtin module) not having __file__
>>> attribute
>>> + if debug==True:
>>> + log.write(item + ' ')
>>> + log.write(str(e))
>>> + log.write('\n')
>>> + pass
>>> + except NameError as e:
>>> + # Deals with NameError: name 'dep_path' is not defined
>>> + # because module is not found (wasn't compiled?), e.g. bddsm
>>> + if (debug==True):
>>> + log.write(item+' ')
>>> + log.write(str(e))
>>> + pass
>>> +
>>> + # Site-customize is a special case since we (OpenEmbedded) put it
>>> there manually
>>> + if 'sitecustomize' in dep_path:
>>> + dep_path = '${libdir}/python2.7/sitecustomize.py'
>>> + # Prints out result, which is what will be used by
>>> create_manifest
>>> + print (dep_path)
>>> + continue
>>> +
>>> + dep_path = fix_path(dep_path)
>>> +
>>> + if (debug==True):
>>> + log.write(dep_path+'\n')
>>> +
>>> + # Prints out result, which is what will be used by create_manifest
>>> + print (dep_path)
>>> +
>>> +if debug==True:
>>> + log.close()
>>> diff --git a/meta/recipes-devtools/python/python/python2-manifest.json
>>> b/meta/recipes-devtools/python/python/python2-manifest.json
>>> new file mode 100644
>>> index 0000000..8ebc715
>>> --- /dev/null
>>> +++ b/meta/recipes-devtools/python/python/python2-manifest.json
>>> @@ -0,0 +1,1032 @@
>>> +{
>>> + "2to3": {
>>> + "files": [
>>> + "${bindir}/2to3",
>>> + "${libdir}/python2.7/lib2to3"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python automated Python 2 to 3 code translator"
>>> + },
>>> + "argparse": {
>>> + "files": [
>>> + "${libdir}/python2.7/argparse.py"
>>> + ],
>>> + "rdepends": [
>>> + "codecs",
>>> + "core",
>>> + "lang",
>>> + "textutils"
>>> + ],
>>> + "summary": "Python command line argument parser"
>>> + },
>>> + "audio": {
>>> + "files": [
>>> + "${libdir}/python2.7/audiodev.py",
>>> + "${libdir}/python2.7/chunk.py",
>>> + "${libdir}/python2.7/lib-dynload/audioop.so",
>>> + "${libdir}/python2.7/lib-dynload/ossaudiodev.so",
>>> + "${libdir}/python2.7/sndhdr.py",
>>> + "${libdir}/python2.7/sunau.py",
>>> + "${libdir}/python2.7/sunaudio.py",
>>> + "${libdir}/python2.7/toaiff.py",
>>> + "${libdir}/python2.7/wave.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "crypt",
>>> + "fcntl",
>>> + "io",
>>> + "math"
>>> + ],
>>> + "summary": "Python Audio Handling"
>>> + },
>>> + "bsddb": {
>>> + "files": [
>>> + "${libdir}/python2.7/bsddb",
>>> + "${libdir}/python2.7/lib-dynload/_bsddb.so"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python bindings for the Berkeley Database"
>>> + },
>>> + "codecs": {
>>> + "files": [
>>> + "${libdir}/python2.7/gettext.py",
>>> + "${libdir}/python2.7/lib-dynload/_codecs_cn.so",
>>> + "${libdir}/python2.7/lib-dynload/_codecs_hk.so",
>>> + "${libdir}/python2.7/lib-dynload/_codecs_iso2022.so",
>>> + "${libdir}/python2.7/lib-dynload/_codecs_jp.so",
>>> + "${libdir}/python2.7/lib-dynload/_codecs_kr.so",
>>> + "${libdir}/python2.7/lib-dynload/_codecs_tw.so",
>>> + "${libdir}/python2.7/lib-dynload/_multibytecodec.so",
>>> + "${libdir}/python2.7/lib-dynload/unicodedata.so",
>>> + "${libdir}/python2.7/locale.py",
>>> + "${libdir}/python2.7/stringprep.py",
>>> + "${libdir}/python2.7/xdrlib.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "io",
>>> + "lang"
>>> + ],
>>> + "summary": "Python codec"
>>> + },
>>> + "compile": {
>>> + "files": [
>>> + "${libdir}/python2.7/compileall.py",
>>> + "${libdir}/python2.7/py_compile.py"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python bytecode compilation support"
>>> + },
>>> + "compiler": {
>>> + "files": [
>>> + "${libdir}/python2.7/compiler"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "io",
>>> + "lang"
>>> + ],
>>> + "summary": "Python compiler support"
>>> + },
>>> + "compression": {
>>> + "files": [
>>> + "${libdir}/python2.7/gzip.py",
>>> + "${libdir}/python2.7/lib-dynload/bz2.so",
>>> + "${libdir}/python2.7/tarfile.py",
>>> + "${libdir}/python2.7/zipfile.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "io",
>>> + "shell",
>>> + "unixadmin",
>>> + "zlib"
>>> + ],
>>> + "summary": "Python high-level compression support"
>>> + },
>>> + "contextlib": {
>>> + "files": [
>>> + "${libdir}/python2.7/contextlib.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "lang"
>>> + ],
>>> + "summary": "Python utilities for with-statementcontexts."
>>> + },
>>> + "core": {
>>> + "files": [
>>> + "${bindir}/python*",
>>> + "${includedir}/python2.7/pyconfig*.h",
>>> + "${libdir}/python2.7/ConfigParser.py",
>>> + "${libdir}/python2.7/UserDict.py",
>>> + "${libdir}/python2.7/UserList.py",
>>> + "${libdir}/python2.7/UserString.py",
>>> + "${libdir}/python2.7/__future__.py",
>>> + "${libdir}/python2.7/_abcoll.py",
>>> + "${libdir}/python2.7/_sysconfigdata.py",
>>> + "${libdir}/python2.7/_weakrefset.py",
>>> + "${libdir}/python2.7/abc.py",
>>> + "${libdir}/python2.7/ast.py",
>>> + "${libdir}/python2.7/atexit.py",
>>> + "${libdir}/python2.7/codecs.py",
>>> + "${libdir}/python2.7/collections.py",
>>> + "${libdir}/python2.7/copy.py",
>>> + "${libdir}/python2.7/copy_reg.py",
>>> + "${libdir}/python2.7/encodings",
>>> + "${libdir}/python2.7/encodings/aliases.py",
>>> + "${libdir}/python2.7/encodings/utf_8.py",
>>> + "${libdir}/python2.7/genericpath.py",
>>> + "${libdir}/python2.7/getopt.py",
>>> + "${libdir}/python2.7/heapq.py",
>>> + "${libdir}/python2.7/importlib",
>>> + "${libdir}/python2.7/keyword.py",
>>> + "${libdir}/python2.7/lib-dynload/_collections.so",
>>> + "${libdir}/python2.7/lib-dynload/_heapq.so",
>>> + "${libdir}/python2.7/lib-dynload/_locale.so",
>>> + "${libdir}/python2.7/lib-dynload/_struct.so",
>>> + "${libdir}/python2.7/lib-dynload/binascii.so",
>>> + "${libdir}/python2.7/lib-dynload/itertools.so",
>>> + "${libdir}/python2.7/lib-dynload/operator.so",
>>> + "${libdir}/python2.7/lib-dynload/readline.so",
>>> + "${libdir}/python2.7/lib-dynload/strop.so",
>>> + "${libdir}/python2.7/lib-dynload/time.so",
>>> + "${libdir}/python2.7/lib-dynload/xreadlines.so",
>>> + "${libdir}/python2.7/linecache.py",
>>> + "${libdir}/python2.7/new.py",
>>> + "${libdir}/python2.7/os.py",
>>> + "${libdir}/python2.7/platform.py",
>>> + "${libdir}/python2.7/posixpath.py",
>>> + "${libdir}/python2.7/re.py",
>>> + "${libdir}/python2.7/rlcompleter.py",
>>> + "${libdir}/python2.7/site.py",
>>> + "${libdir}/python2.7/sitecustomize.py",
>>> + "${libdir}/python2.7/sre_compile.py",
>>> + "${libdir}/python2.7/sre_constants.py",
>>> + "${libdir}/python2.7/sre_parse.py",
>>> + "${libdir}/python2.7/stat.py",
>>> + "${libdir}/python2.7/string.py",
>>> + "${libdir}/python2.7/struct.py",
>>> + "${libdir}/python2.7/sysconfig.py",
>>> + "${libdir}/python2.7/traceback.py",
>>> + "${libdir}/python2.7/types.py",
>>> + "${libdir}/python2.7/warnings.py",
>>> + "${libdir}/python2.7/weakref.py"
>>> + ],
>>> + "rdepends": [],
>>> + "summary": "Python interpreter and core modules"
>>> + },
>>> + "crypt": {
>>> + "files": [
>>> + "${libdir}/python2.7/hashlib.py",
>>> + "${libdir}/python2.7/lib-dynload/_hashlib.so",
>>> + "${libdir}/python2.7/lib-dynload/crypt.so",
>>> + "${libdir}/python2.7/md5.py",
>>> + "${libdir}/python2.7/sha.py"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python basic cryptographic and hashing support"
>>> + },
>>> + "ctypes": {
>>> + "files": [
>>> + "${libdir}/python2.7/ctypes",
>>> + "${libdir}/python2.7/lib-dynload/_ctypes.so",
>>> + "${libdir}/python2.7/lib-dynload/_ctypes_test.so"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python C types support"
>>> + },
>>> + "curses": {
>>> + "files": [
>>> + "${libdir}/python2.7/curses",
>>> + "${libdir}/python2.7/lib-dynload/_curses.so",
>>> + "${libdir}/python2.7/lib-dynload/_curses_panel.so"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python curses support"
>>> + },
>>> + "datetime": {
>>> + "files": [
>>> + "${libdir}/python2.7/_strptime.py",
>>> + "${libdir}/python2.7/calendar.py",
>>> + "${libdir}/python2.7/lib-dynload/datetime.so"
>>> + ],
>>> + "rdepends": [
>>> + "codecs",
>>> + "core",
>>> + "lang"
>>> + ],
>>> + "summary": "Python calendar and time support"
>>> + },
>>> + "db": {
>>> + "files": [
>>> + "${libdir}/python2.7/anydbm.py",
>>> + "${libdir}/python2.7/dbhash.py",
>>> + "${libdir}/python2.7/dumbdbm.py",
>>> + "${libdir}/python2.7/lib-dynload/dbm.so",
>>> + "${libdir}/python2.7/whichdb.py"
>>> + ],
>>> + "rdepends": [
>>> + "bsddb",
>>> + "core",
>>> + "gdbm"
>>> + ],
>>> + "summary": "Python file-based database support"
>>> + },
>>> + "debugger": {
>>> + "files": [
>>> + "${libdir}/python2.7/bdb.py",
>>> + "${libdir}/python2.7/pdb.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "io",
>>> + "lang",
>>> + "pprint",
>>> + "shell"
>>> + ],
>>> + "summary": "Python debugger"
>>> + },
>>> + "dev": {
>>> + "files": [
>>> + "${base_libdir}/*.a",
>>> + "${base_libdir}/*.o",
>>> + "${datadir}/aclocal",
>>> + "${datadir}/pkgconfig",
>>> + "${includedir}",
>>> + "${libdir}/*.a",
>>> + "${libdir}/*.la",
>>> + "${libdir}/*.o",
>>> + "${libdir}/lib*${SOLIBSDEV}",
>>> + "${libdir}/pkgconfig",
>>> + "${libdir}/python2.7/config/Makefile"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python development package"
>>> + },
>>> + "difflib": {
>>> + "files": [
>>> + "${libdir}/python2.7/difflib.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "lang"
>>> + ],
>>> + "summary": "Python helpers for computing deltas between objects"
>>> + },
>>> + "distutils": {
>>> + "files": [
>>> + "${libdir}/python2.7/config",
>>> + "${libdir}/python2.7/distutils"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python Distribution Utilities"
>>> + },
>>> + "distutils-staticdev": {
>>> + "files": [
>>> + "${libdir}/python2.7/config/lib*.a"
>>> + ],
>>> + "rdepends": [
>>> + "distutils"
>>> + ],
>>> + "summary": "Python distribution utilities (static libraries)"
>>> + },
>>> + "doctest": {
>>> + "files": [
>>> + "${libdir}/python2.7/doctest.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "crypt",
>>> + "debugger",
>>> + "difflib",
>>> + "fcntl",
>>> + "io",
>>> + "lang",
>>> + "math",
>>> + "pprint",
>>> + "shell",
>>> + "unittest"
>>> + ],
>>> + "summary": "Python framework for running examples in docstrings"
>>> + },
>>> + "email": {
>>> + "files": [
>>> + "${libdir}/python2.7/email",
>>> + "${libdir}/python2.7/imaplib.py"
>>> + ],
>>> + "rdepends": [
>>> + "contextlib",
>>> + "core",
>>> + "crypt",
>>> + "fcntl",
>>> + "io",
>>> + "lang",
>>> + "math",
>>> + "netclient",
>>> + "pickle",
>>> + "subprocess",
>>> + "textutils"
>>> + ],
>>> + "summary": "Python email support"
>>> + },
>>> + "fcntl": {
>>> + "files": [
>>> + "${libdir}/python2.7/lib-dynload/fcntl.so"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python's fcntl interface"
>>> + },
>>> + "gdbm": {
>>> + "files": [
>>> + "${libdir}/python2.7/lib-dynload/gdbm.so"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python GNU database support"
>>> + },
>>> + "hotshot": {
>>> + "files": [
>>> + "${libdir}/python2.7/hotshot",
>>> + "${libdir}/python2.7/lib-dynload/_hotshot.so"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python hotshot performance profiler"
>>> + },
>>> + "html": {
>>> + "files": [
>>> + "${libdir}/python2.7/HTMLParser.py",
>>> + "${libdir}/python2.7/formatter.py",
>>> + "${libdir}/python2.7/htmlentitydefs.py",
>>> + "${libdir}/python2.7/htmllib.py",
>>> + "${libdir}/python2.7/markupbase.py",
>>> + "${libdir}/python2.7/sgmllib.py"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python HTML processing support"
>>> + },
>>> + "idle": {
>>> + "files": [
>>> + "${bindir}/idle",
>>> + "${libdir}/python2.7/idlelib"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python Integrated Development Environment"
>>> + },
>>> + "image": {
>>> + "files": [
>>> + "${libdir}/python2.7/colorsys.py",
>>> + "${libdir}/python2.7/imghdr.py"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python graphical image handling"
>>> + },
>>> + "io": {
>>> + "files": [
>>> + "${libdir}/python2.7/StringIO.py",
>>> + "${libdir}/python2.7/_pyio.py",
>>> + "${libdir}/python2.7/io.py",
>>> + "${libdir}/python2.7/lib-dynload/_io.so",
>>> + "${libdir}/python2.7/lib-dynload/_socket.so",
>>> + "${libdir}/python2.7/lib-dynload/_ssl.so",
>>> + "${libdir}/python2.7/lib-dynload/cStringIO.so",
>>> + "${libdir}/python2.7/lib-dynload/select.so",
>>> + "${libdir}/python2.7/lib-dynload/termios.so",
>>> + "${libdir}/python2.7/pipes.py",
>>> + "${libdir}/python2.7/socket.py",
>>> + "${libdir}/python2.7/ssl.py",
>>> + "${libdir}/python2.7/tempfile.py"
>>> + ],
>>> + "rdepends": [
>>> + "contextlib",
>>> + "core",
>>> + "crypt",
>>> + "fcntl",
>>> + "lang",
>>> + "math",
>>> + "netclient",
>>> + "textutils"
>>> + ],
>>> + "summary": "Python low-level I/O"
>>> + },
>>> + "json": {
>>> + "files": [
>>> + "${libdir}/python2.7/json",
>>> + "${libdir}/python2.7/lib-dynload/_json.so"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python JSON support"
>>> + },
>>> + "lang": {
>>> + "files": [
>>> + "${libdir}/python2.7/bisect.py",
>>> + "${libdir}/python2.7/code.py",
>>> + "${libdir}/python2.7/codeop.py",
>>> + "${libdir}/python2.7/dis.py",
>>> + "${libdir}/python2.7/functools.py",
>>> + "${libdir}/python2.7/inspect.py",
>>> + "${libdir}/python2.7/lib-dynload/_bisect.so",
>>> + "${libdir}/python2.7/lib-dynload/_functools.so",
>>> + "${libdir}/python2.7/lib-dynload/array.so",
>>> + "${libdir}/python2.7/lib-dynload/parser.so",
>>> + "${libdir}/python2.7/opcode.py",
>>> + "${libdir}/python2.7/repr.py",
>>> + "${libdir}/python2.7/symbol.py",
>>> + "${libdir}/python2.7/token.py",
>>> + "${libdir}/python2.7/tokenize.py"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python low-level language support"
>>> + },
>>> + "logging": {
>>> + "files": [
>>> + "${libdir}/python2.7/logging"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "io",
>>> + "threading"
>>> + ],
>>> + "summary": "Python logging support"
>>> + },
>>> + "mailbox": {
>>> + "files": [
>>> + "${libdir}/python2.7/mailbox.py"
>>> + ],
>>> + "rdepends": [
>>> + "codecs",
>>> + "contextlib",
>>> + "core",
>>> + "crypt",
>>> + "datetime",
>>> + "email",
>>> + "fcntl",
>>> + "io",
>>> + "lang",
>>> + "math",
>>> + "mime",
>>> + "netclient",
>>> + "textutils"
>>> + ],
>>> + "summary": "Python mailbox format support"
>>> + },
>>> + "math": {
>>> + "files": [
>>> + "${libdir}/python2.7/lib-dynload/_random.so",
>>> + "${libdir}/python2.7/lib-dynload/cmath.so",
>>> + "${libdir}/python2.7/lib-dynload/math.so",
>>> + "${libdir}/python2.7/random.py",
>>> + "${libdir}/python2.7/sets.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "crypt"
>>> + ],
>>> + "summary": "Python math support"
>>> + },
>>> + "mime": {
>>> + "files": [
>>> + "${libdir}/python2.7/MimeWriter.py",
>>> + "${libdir}/python2.7/mimetools.py",
>>> + "${libdir}/python2.7/mimetypes.py",
>>> + "${libdir}/python2.7/quopri.py",
>>> + "${libdir}/python2.7/rfc822.py",
>>> + "${libdir}/python2.7/uu.py"
>>> + ],
>>> + "rdepends": [
>>> + "contextlib",
>>> + "core",
>>> + "crypt",
>>> + "fcntl",
>>> + "io",
>>> + "lang",
>>> + "math",
>>> + "netclient",
>>> + "textutils"
>>> + ],
>>> + "summary": "Python MIME handling APIs"
>>> + },
>>> + "mmap": {
>>> + "files": [
>>> + "${libdir}/python2.7/lib-dynload/mmap.so"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python memory-mapped file support"
>>> + },
>>> + "modules": {
>>> + "files": [],
>>> + "rdepends": [
>>> + "2to3",
>>> + "argparse",
>>> + "audio",
>>> + "bsddb",
>>> + "codecs",
>>> + "compile",
>>> + "compiler",
>>> + "compression",
>>> + "contextlib",
>>> + "core",
>>> + "crypt",
>>> + "ctypes",
>>> + "curses",
>>> + "datetime",
>>> + "db",
>>> + "debugger",
>>> + "difflib",
>>> + "distutils",
>>> + "doctest",
>>> + "email",
>>> + "fcntl",
>>> + "gdbm",
>>> + "hotshot",
>>> + "html",
>>> + "idle",
>>> + "image",
>>> + "io",
>>> + "json",
>>> + "lang",
>>> + "logging",
>>> + "mailbox",
>>> + "math",
>>> + "mime",
>>> + "mmap",
>>> + "multiprocessing",
>>> + "netclient",
>>> + "netserver",
>>> + "numbers",
>>> + "pickle",
>>> + "pkgutil",
>>> + "plistlib",
>>> + "pprint",
>>> + "profile",
>>> + "pydoc",
>>> + "re",
>>> + "resource",
>>> + "robotparser",
>>> + "shell",
>>> + "smtpd",
>>> + "sqlite3",
>>> + "sqlite3",
>>> + "stringold",
>>> + "subprocess",
>>> + "syslog",
>>> + "terminal",
>>> + "textutils",
>>> + "threading",
>>> + "tkinter",
>>> + "unittest",
>>> + "unixadmin",
>>> + "xml",
>>> + "xmlrpc",
>>> + "zlib"
>>> + ],
>>> + "summary": "All Python modules"
>>> + },
>>> + "multiprocessing": {
>>> + "files": [
>>> + "${libdir}/python2.7/lib-dynload/_multiprocessing.so",
>>> + "${libdir}/python2.7/multiprocessing"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "fcntl",
>>> + "io",
>>> + "pickle",
>>> + "subprocess",
>>> + "threading"
>>> + ],
>>> + "summary": "Python multiprocessing support"
>>> + },
>>> + "netclient": {
>>> + "files": [
>>> + "${libdir}/python2.7/Cookie.py",
>>> + "${libdir}/python2.7/_LWPCookieJar.py",
>>> + "${libdir}/python2.7/_MozillaCookieJar.py",
>>> + "${libdir}/python2.7/base64.py",
>>> + "${libdir}/python2.7/cookielib.py",
>>> + "${libdir}/python2.7/ftplib.py",
>>> + "${libdir}/python2.7/hmac.py",
>>> + "${libdir}/python2.7/httplib.py",
>>> + "${libdir}/python2.7/nntplib.py",
>>> + "${libdir}/python2.7/poplib.py",
>>> + "${libdir}/python2.7/smtplib.py",
>>> + "${libdir}/python2.7/telnetlib.py",
>>> + "${libdir}/python2.7/urllib.py",
>>> + "${libdir}/python2.7/urllib2.py",
>>> + "${libdir}/python2.7/urlparse.py",
>>> + "${libdir}/python2.7/uuid.py"
>>> + ],
>>> + "rdepends": [
>>> + "codecs",
>>> + "contextlib",
>>> + "core",
>>> + "crypt",
>>> + "ctypes",
>>> + "datetime",
>>> + "email",
>>> + "fcntl",
>>> + "io",
>>> + "lang",
>>> + "math",
>>> + "mime",
>>> + "pickle",
>>> + "subprocess",
>>> + "textutils",
>>> + "threading"
>>> + ],
>>> + "summary": "Python Internet Protocol clients"
>>> + },
>>> + "netserver": {
>>> + "files": [
>>> + "${libdir}/python2.7/BaseHTTPServer.py",
>>> + "${libdir}/python2.7/CGIHTTPServer.py",
>>> + "${libdir}/python2.7/SimpleHTTPServer.py",
>>> + "${libdir}/python2.7/SocketServer.py",
>>> + "${libdir}/python2.7/cgi.py"
>>> + ],
>>> + "rdepends": [
>>> + "contextlib",
>>> + "core",
>>> + "crypt",
>>> + "fcntl",
>>> + "io",
>>> + "lang",
>>> + "math",
>>> + "mime",
>>> + "netclient",
>>> + "shell",
>>> + "textutils",
>>> + "threading",
>>> + "unixadmin"
>>> + ],
>>> + "summary": "Python Internet Protocol servers"
>>> + },
>>> + "numbers": {
>>> + "files": [
>>> + "${libdir}/python2.7/decimal.py",
>>> + "${libdir}/python2.7/fractions.py",
>>> + "${libdir}/python2.7/numbers.py"
>>> + ],
>>> + "rdepends": [
>>> + "codecs",
>>> + "core",
>>> + "lang",
>>> + "math",
>>> + "threading"
>>> + ],
>>> + "summary": "Python number APIs"
>>> + },
>>> + "pickle": {
>>> + "files": [
>>> + "${libdir}/python2.7/lib-dynload/cPickle.so",
>>> + "${libdir}/python2.7/pickle.py",
>>> + "${libdir}/python2.7/pickletools.py",
>>> + "${libdir}/python2.7/shelve.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "io"
>>> + ],
>>> + "summary": "Python serialisation/persistence support"
>>> + },
>>> + "pkgutil": {
>>> + "files": [
>>> + "${libdir}/python2.7/pkgutil.py"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python package extension utility support"
>>> + },
>>> + "plistlib": {
>>> + "files": [
>>> + "${libdir}/python2.7/plistlib.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "datetime",
>>> + "io"
>>> + ],
>>> + "summary": "Generate and parse Mac OS X .plist files"
>>> + },
>>> + "pprint": {
>>> + "files": [
>>> + "${libdir}/python2.7/pprint.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "io"
>>> + ],
>>> + "summary": "Python pretty-print support"
>>> + },
>>> + "profile": {
>>> + "files": [
>>> + "${libdir}/python2.7/cProfile.py",
>>> + "${libdir}/python2.7/lib-dynload/_lsprof.so",
>>> + "${libdir}/python2.7/profile.py",
>>> + "${libdir}/python2.7/pstats.py"
>>> + ],
>>> + "rdepends": [
>>> + "codecs",
>>> + "core",
>>> + "lang",
>>> + "resource",
>>> + "textutils"
>>> + ],
>>> + "summary": "Python basic performance profiling support"
>>> + },
>>> + "pydoc": {
>>> + "files": [
>>> + "${bindir}/pydoc",
>>> + "${libdir}/python2.7/pydoc.py",
>>> + "${libdir}/python2.7/pydoc_data"
>>> + ],
>>> + "rdepends": [
>>> + "codecs",
>>> + "core",
>>> + "lang",
>>> + "pkgutil"
>>> + ],
>>> + "summary": "Python interactive help support"
>>> + },
>>> + "re": {
>>> + "files": [
>>> + "${libdir}/python2.7/sre.py"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python Regular Expression APIs"
>>> + },
>>> + "resource": {
>>> + "files": [
>>> + "${libdir}/python2.7/lib-dynload/resource.so"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python resource control interface"
>>> + },
>>> + "robotparser": {
>>> + "files": [
>>> + "${libdir}/python2.7/robotparser.py"
>>> + ],
>>> + "rdepends": [
>>> + "contextlib",
>>> + "core",
>>> + "io",
>>> + "lang",
>>> + "netclient",
>>> + "textutils"
>>> + ],
>>> + "summary": "Python robots.txt parser"
>>> + },
>>> + "shell": {
>>> + "files": [
>>> + "${libdir}/python2.7/cmd.py",
>>> + "${libdir}/python2.7/commands.py",
>>> + "${libdir}/python2.7/dircache.py",
>>> + "${libdir}/python2.7/fnmatch.py",
>>> + "${libdir}/python2.7/glob.py",
>>> + "${libdir}/python2.7/popen2.py",
>>> + "${libdir}/python2.7/shlex.py",
>>> + "${libdir}/python2.7/shutil.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "io",
>>> + "unixadmin"
>>> + ],
>>> + "summary": "Python shell-like functionality"
>>> + },
>>> + "smtpd": {
>>> + "files": [
>>> + "${bindir}/smtpd.py",
>>> + "${libdir}/python2.7/asynchat.py",
>>> + "${libdir}/python2.7/asyncore.py",
>>> + "${libdir}/python2.7/smtpd.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "fcntl",
>>> + "io",
>>> + "lang"
>>> + ],
>>> + "summary": "Python Simple Mail Transport Daemon"
>>> + },
>>> + "sqlite3": {
>>> + "files": [
>>> + "${libdir}/python2.7/lib-dynload/_sqlite3.so"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python Sqlite3 database support"
>>> + },
>>> + "sqlite3-tests": {
>>> + "files": [
>>> + "${libdir}/python2.7/sqlite3/test"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "tests"
>>> + ],
>>> + "summary": "Python Sqlite3 database support tests"
>>> + },
>>> + "stringold": {
>>> + "files": [
>>> + "${libdir}/python2.7/stringold.py"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python string APIs [deprecated]"
>>> + },
>>> + "subprocess": {
>>> + "files": [
>>> + "${libdir}/python2.7/subprocess.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "fcntl",
>>> + "io",
>>> + "pickle"
>>> + ],
>>> + "summary": "Python subprocess support"
>>> + },
>>> + "syslog": {
>>> + "files": [
>>> + "${libdir}/python2.7/lib-dynload/syslog.so"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python syslog interface"
>>> + },
>>> + "terminal": {
>>> + "files": [
>>> + "${libdir}/python2.7/pty.py",
>>> + "${libdir}/python2.7/tty.py"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "io"
>>> + ],
>>> + "summary": "Python terminal controlling support"
>>> + },
>>> + "tests": {
>>> + "files": [
>>> + "${libdir}/python2.7/test"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python tests"
>>> + },
>>> + "textutils": {
>>> + "files": [
>>> + "${libdir}/python2.7/csv.py",
>>> + "${libdir}/python2.7/lib-dynload/_csv.so",
>>> + "${libdir}/python2.7/optparse.py",
>>> + "${libdir}/python2.7/textwrap.py"
>>> + ],
>>> + "rdepends": [
>>> + "codecs",
>>> + "core",
>>> + "io",
>>> + "lang"
>>> + ],
>>> + "summary": "Python option parsin"
>>> + },
>>> + "threading": {
>>> + "files": [
>>> + "${libdir}/python2.7/Queue.py",
>>> + "${libdir}/python2.7/_threading_local.py",
>>> + "${libdir}/python2.7/dummy_thread.py",
>>> + "${libdir}/python2.7/dummy_threading.py",
>>> + "${libdir}/python2.7/mutex.py",
>>> + "${libdir}/python2.7/threading.py"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python threading & synchronization support"
>>> + },
>>> + "tkinter": {
>>> + "files": [
>>> + "${libdir}/python2.7/lib-tk"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python Tcl/Tk bindings"
>>> + },
>>> + "unittest": {
>>> + "files": [
>>> + "${libdir}/python2.7/unittest"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "difflib",
>>> + "io",
>>> + "lang",
>>> + "pprint",
>>> + "shell"
>>> + ],
>>> + "summary": "Python unit testing framework"
>>> + },
>>> + "unixadmin": {
>>> + "files": [
>>> + "${libdir}/python2.7/getpass.py",
>>> + "${libdir}/python2.7/lib-dynload/grp.so",
>>> + "${libdir}/python2.7/lib-dynload/nis.so"
>>> + ],
>>> + "rdepends": [
>>> + "core",
>>> + "io"
>>> + ],
>>> + "summary": "Python Unix administration support"
>>> + },
>>> + "xml": {
>>> + "files": [
>>> + "${libdir}/python2.7/lib-dynload/_elementtree.so",
>>> + "${libdir}/python2.7/lib-dynload/pyexpat.so",
>>> + "${libdir}/python2.7/xml"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python basic XML support"
>>> + },
>>> + "xmlrpc": {
>>> + "files": [
>>> + "${libdir}/python2.7/DocXMLRPCServer.py",
>>> + "${libdir}/python2.7/SimpleXMLRPCServer.py"
>>> + ],
>>> + "rdepends": [
>>> + "codecs",
>>> + "compression",
>>> + "contextlib",
>>> + "core",
>>> + "crypt",
>>> + "datetime",
>>> + "fcntl",
>>> + "io",
>>> + "lang",
>>> + "math",
>>> + "mime",
>>> + "netclient",
>>> + "netserver",
>>> + "pkgutil",
>>> + "pydoc",
>>> + "textutils",
>>> + "threading",
>>> + "xml",
>>> + "zlib"
>>> + ],
>>> + "summary": "Python XML-RPC support"
>>> + },
>>> + "zlib": {
>>> + "files": [
>>> + "${libdir}/python2.7/lib-dynload/zlib.so"
>>> + ],
>>> + "rdepends": [
>>> + "core"
>>> + ],
>>> + "summary": "Python zlib compression support"
>>> + }
>>> +}
>>> \ No newline at end of file
>>> diff --git a/meta/recipes-devtools/python/python/sitecustomize.py
>>> b/meta/recipes-devtools/python/python/sitecustomize.py
>>> index 2739018..4c8b5e2 100644
>>> --- a/meta/recipes-devtools/python/python/sitecustomize.py
>>> +++ b/meta/recipes-devtools/python/python/sitecustomize.py
>>> @@ -27,19 +27,11 @@ def __enableReadlineSupport():
>>> except IOError:
>>> pass
>>>
>>> -def __enableDefaultEncoding():
>>> - import sys
>>> - try:
>>> - sys.setdefaultencoding( "utf8" )
>>> - except LookupError:
>>> - pass
>>> -
>>> import sys
>>> try:
>>> import rlcompleter, readline
>>> except ImportError:
>>> pass
>>> else:
>>> - __enableDefaultEncoding()
>>> __registerExitHandler()
>>> __enableReadlineSupport()
>>> diff --git a/meta/recipes-devtools/python/python_2.7.13.bb
>>> b/meta/recipes-devtools/python/python_2.7.13.bb
>>> index 754c029..dbafb95 100644
>>> --- a/meta/recipes-devtools/python/python_2.7.13.bb
>>> +++ b/meta/recipes-devtools/python/python_2.7.13.bb
>>> @@ -1,5 +1,7 @@
>>> require python.inc
>>> +
>>> DEPENDS = "python-native libffi bzip2 gdbm openssl readline sqlite3
>>> zlib"
>>> +
>>> PR = "${INC_PR}"
>>>
>>> DISTRO_SRC_URI ?= "file://sitecustomize.py"
>>> @@ -145,11 +147,9 @@ py_package_preprocess () {
>>> python -m py_compile ${PKGD}/${libdir}/python${PYTH
>>> ON_MAJMIN}/_sysconfigdata.py
>>> }
>>>
>>> -require python-${PYTHON_MAJMIN}-manifest.inc
>>>
>>> # manual dependency additions
>>> RPROVIDES_${PN}-core = "${PN}"
>>> -RRECOMMENDS_${PN}-core = "${PN}-readline"
>>> RRECOMMENDS_${PN}-core_append_class-nativesdk = "
>>> nativesdk-python-modules"
>>> RRECOMMENDS_${PN}-crypt = "openssl"
>>>
>>> @@ -193,3 +193,87 @@ FILES_${PN}-man = "${datadir}/man"
>>> RDEPENDS_${PN}-modules_remove = "${@bb.utils.contains('PACKAGECONFIG',
>>> 'bdb', '', '${PN}-bsddb', d)}"
>>>
>>> BBCLASSEXTEND = "nativesdk"
>>> +
>>> +RPROVIDES_${PN} += "${PN}-modules"
>>> +
>>> +# We want bytecode precompiled .py files (.pyc's) by default
>>> +# but the user may set it on their own conf
>>> +
>>> +INCLUDE_PYCS ?= "1"
>>> +
>>> +python(){
>>> +
>>> + pythondir = d.getVar('THISDIR',True)
>>> +
>>> + # Read JSON manifest
>>> + import json
>>> + with open(pythondir+'/python/python2-manifest.json') as
>>> manifest_file:
>>> + python_manifest=json.load(manifest_file)
>>> +
>>> + include_pycs = d.getVar('INCLUDE_PYCS')
>>> +
>>> + packages = d.getVar('PACKAGES').split()
>>> + pn = d.getVar('PN')
>>> +
>>> +
>>> + newpackages=[]
>>> +
>>> + for key in python_manifest:
>>> + pypackage= pn + '-' + key
>>> +
>>> + if pypackage not in packages:
>>> + # We need to prepend, otherwise python-misc gets everything
>>> + # so we use a new variable
>>> + newpackages.append(pypackage)
>>> +
>>> + # "Build" python's manifest FILES, RDEPENDS and SUMMARY
>>> + d.setVar('FILES_' + pypackage, '')
>>> + for value in python_manifest[key]['files']:
>>> + d.appendVar('FILES_' + pypackage, ' ' + value)
>>> + if include_pycs == '1':
>>> + if value.endswith('.py'):
>>> + d.appendVar('FILES_' + pypackage, ' ' + value + 'c')
>>> +
>>> + d.setVar('RDEPENDS_' + pypackage, '')
>>> + for value in python_manifest[key]['rdepends']:
>>> + # Make it work with or without $PN
>>> + if '${PN}' in value:
>>> + value=value.split('-')[1]
>>> + d.appendVar('RDEPENDS_' + pypackage, ' ' + pn + '-' + value)
>>> + d.setVar('SUMMARY_' + pypackage, python_manifest[key]['summary'
>>> ])
>>> +
>>> + # We need to ensure staticdev packages match for files first so we
>>> sort in reverse
>>> + newpackages.sort(reverse=True)
>>> + # Prepending so to avoid python-misc getting everything
>>> + packages = newpackages + packages
>>> + d.setVar('PACKAGES', ' '.join(packages))
>>> + d.setVar('ALLOW_EMPTY_${PN}-modules', '1')
>>> +}
>>> +
>>> +do_split_packages[file-checksums] += "${THISDIR}/python/python2-man
>>> ifest.json:True"
>>> +
>>> +# Files needed to create a new manifest
>>> +SRC_URI += "file://create_manifest2.py file://get_module_deps2.py
>>> file://python2-manifest.json"
>>> +
>>> +do_create_manifest() {
>>> +
>>> +# This task should be run with every new release of Python.
>>> +# We must ensure that PACKAGECONFIG enables everything when creating
>>> +# a new manifest, this is to base our new manifest on a complete
>>> +# native python build, containing all dependencies, otherwise the task
>>> +# wont be able to find the required files.
>>> +# e.g. BerkeleyDB is an optional build dependency so it may or may not
>>> +# be present, we must ensure it is.
>>> +
>>> +cd ${WORKDIR}
>>> +# This needs to be executed by python-native and NOT by HOST's python
>>> +nativepython create_manifest2.py
>>> +cp python2-manifest.json.new ${THISDIR}/python/python2-manifest.json
>>> +}
>>> +
>>> +# bitbake python -c create_manifest
>>> +addtask do_create_manifest
>>> +
>>> +# Make sure we have native python ready when we create a new manifest
>>> +do_create_manifest[depends] += "python:do_prepare_recipe_sysroot"
>>> +do_create_manifest[depends] += "python:do_patch"
>>> diff --git a/scripts/contrib/python/generate-manifest-2.7.py
>>> b/scripts/contrib/python/generate-manifest-2.7.py
>>> deleted file mode 100755
>>> index ee75403..0000000
>>> --- a/scripts/contrib/python/generate-manifest-2.7.py
>>> +++ /dev/null
>>> @@ -1,426 +0,0 @@
>>> -#!/usr/bin/env python
>>> -
>>> -# generate Python Manifest for the OpenEmbedded build system
>>> -# (C) 2002-2010 Michael 'Mickey' Lauer <mlauer at vanille-media.de>
>>> -# (C) 2007 Jeremy Laine
>>> -# licensed under MIT, see COPYING.MIT
>>> -#
>>> -# June 22, 2011 -- Mark Hatle <mark.hatle at windriver.com>
>>> -# * Updated to no longer generate special -dbg package, instead use the
>>> -# single system -dbg
>>> -# * Update version with ".1" to indicate this change
>>> -#
>>> -# February 26, 2017 -- Ming Liu <peter.x.liu at external.atlascopco.com>
>>> -# * Updated to support generating manifest for native python
>>> -
>>> -import os
>>> -import sys
>>> -import time
>>> -import argparse
>>> -
>>> -VERSION = "2.7.2"
>>> -
>>> -__author__ = "Michael 'Mickey' Lauer <mlauer at vanille-media.de>"
>>> -__version__ = "20110222.2"
>>> -
>>> -class MakefileMaker:
>>> -
>>> - def __init__( self, outfile, isNative ):
>>> - """initialize"""
>>> - self.packages = {}
>>> - self.excluded_pkgs = []
>>> - self.targetPrefix = "${libdir}/python%s/" % VERSION[:3]
>>> - self.isNative = isNative
>>> - self.output = outfile
>>> - self.out( """
>>> -# WARNING: This file is AUTO GENERATED: Manual edits will be lost next
>>> time I regenerate the file.
>>> -# Generator: '%s%s' Version %s (C) 2002-2010 Michael 'Mickey' Lauer <
>>> mlauer at vanille-media.de>
>>> -""" % ( sys.argv[0], ' --native' if isNative else '', __version__ ) )
>>> -
>>> - #
>>> - # helper functions
>>> - #
>>> -
>>> - def out( self, data ):
>>> - """print a line to the output file"""
>>> - self.output.write( "%s\n" % data )
>>> -
>>> - def setPrefix( self, targetPrefix ):
>>> - """set a file prefix for addPackage files"""
>>> - self.targetPrefix = targetPrefix
>>> -
>>> - def doProlog( self ):
>>> - self.out( """ """ )
>>> - self.out( "" )
>>> -
>>> - def addPackage( self, name, description, dependencies, filenames,
>>> mod_exclude = False ):
>>> - """add a package to the Makefile"""
>>> - if type( filenames ) == type( "" ):
>>> - filenames = filenames.split()
>>> - fullFilenames = []
>>> - for filename in filenames:
>>> - if filename[0] != "$":
>>> - fullFilenames.append( "%s%s" % ( self.targetPrefix,
>>> filename ) )
>>> - else:
>>> - fullFilenames.append( filename )
>>> - if mod_exclude:
>>> - self.excluded_pkgs.append( name )
>>> - self.packages[name] = description, dependencies, fullFilenames
>>> -
>>> - def doBody( self ):
>>> - """generate body of Makefile"""
>>> -
>>> - global VERSION
>>> -
>>> - #
>>> - # generate rprovides line for native
>>> - #
>>> -
>>> - if self.isNative:
>>> - pkglist = []
>>> - for name in ['${PN}-modules'] + sorted(self.packages):
>>> - pkglist.append('%s-native' % name.replace('${PN}',
>>> 'python'))
>>> -
>>> - self.out('RPROVIDES += "%s"' % " ".join(pkglist))
>>> - return
>>> -
>>> - #
>>> - # generate provides line
>>> - #
>>> -
>>> - provideLine = 'PROVIDES+=" \\\n'
>>> - for name in sorted(self.packages):
>>> - provideLine += " %s \\\n" % name
>>> - provideLine += '"'
>>> -
>>> - self.out( provideLine )
>>> - self.out( "" )
>>> -
>>> - #
>>> - # generate package line
>>> - #
>>> -
>>> - packageLine = 'PACKAGES=" \\\n'
>>> - packageLine += ' ${PN}-dbg \\\n'
>>> - for name in sorted(self.packages):
>>> - if name.startswith("${PN}-distutils"):
>>> - if name == "${PN}-distutils":
>>> - packageLine += " %s-staticdev %s \\\n" % (name,
>>> name)
>>> - elif name != '${PN}-dbg':
>>> - packageLine += " %s \\\n" % name
>>> - packageLine += ' ${PN}-modules\\\n"'
>>> -
>>> - self.out( packageLine )
>>> - self.out( "" )
>>> -
>>> - #
>>> - # generate package variables
>>> - #
>>> -
>>> - for name, data in sorted(self.packages.items()):
>>> - desc, deps, files = data
>>> -
>>> - #
>>> - # write out the description, revision and dependencies
>>> - #
>>> - self.out( 'SUMMARY_%s="%s"' % ( name, desc ) )
>>> - self.out( 'RDEPENDS_%s="%s"' % ( name, deps ) )
>>> -
>>> - line = 'FILES_%s=" \\\n' % name
>>> -
>>> - #
>>> - # check which directories to make in the temporary directory
>>> - #
>>> -
>>> - dirset = {} # if python had a set-datatype this would be
>>> sufficient. for now, we're using a dict instead.
>>> - for target in files:
>>> - dirset[os.path.dirname( target )] = True
>>> -
>>> - #
>>> - # generate which files to copy for the target (-dfR because
>>> whole directories are also allowed)
>>> - #
>>> -
>>> - for target in files:
>>> - line += " %s \\\n" % target
>>> -
>>> - line += '"'
>>> - self.out( line )
>>> - self.out( "" )
>>> -
>>> - self.out( 'SUMMARY_${PN}-modules="All Python modules"' )
>>> - line = 'RDEPENDS_${PN}-modules=" \\\n'
>>> -
>>> - for name, data in sorted(self.packages.items()):
>>> - if name not in ['${PN}-dev', '${PN}-distutils-staticdev']
>>> and name not in self.excluded_pkgs:
>>> - line += " %s \\\n" % name
>>> -
>>> - line += '"'
>>> - self.out( line )
>>> - self.out( 'ALLOW_EMPTY_${PN}-modules = "1"' )
>>> -
>>> - def doEpilog( self ):
>>> - self.out( """""" )
>>> - self.out( "" )
>>> -
>>> - def make( self ):
>>> - self.doProlog()
>>> - self.doBody()
>>> - self.doEpilog()
>>> -
>>> -if __name__ == "__main__":
>>> - parser = argparse.ArgumentParser( description='generate python
>>> manifest' )
>>> - parser.add_argument( '-n', '--native', help='generate manifest for
>>> native python', action='store_true' )
>>> - parser.add_argument( 'outfile', metavar='OUTPUT_FILE', nargs='?',
>>> default='', help='Output file (defaults to stdout)' )
>>> - args = parser.parse_args()
>>> -
>>> - if args.outfile:
>>> - try:
>>> - os.unlink( args.outfile )
>>> - except Exception:
>>> - sys.exc_clear()
>>> - outfile = open( args.outfile, "w" )
>>> - else:
>>> - outfile = sys.stdout
>>> -
>>> - m = MakefileMaker( outfile, args.native )
>>> -
>>> - # Add packages here. Only specify dlopen-style library dependencies
>>> here, no ldd-style dependencies!
>>> - # Parameters: revision, name, description, dependencies, filenames
>>> - #
>>> -
>>> - m.addPackage( "${PN}-core", "Python interpreter and core modules",
>>> "${PN}-lang ${PN}-re",
>>> - "__future__.* _abcoll.* abc.* ast.* copy.* copy_reg.*
>>> ConfigParser.* " +
>>> - "genericpath.* getopt.* linecache.* new.* " +
>>> - "os.* posixpath.* struct.* " +
>>> - "warnings.* site.* stat.* " +
>>> - "UserDict.* UserList.* UserString.* " +
>>> - "lib-dynload/binascii.so lib-dynload/_struct.so lib-dynload/time.so
>>> " +
>>> - "lib-dynload/xreadlines.so types.* platform.* ${bindir}/python* " +
>>> - "_weakrefset.* sysconfig.* _sysconfigdata.* " +
>>> - "${includedir}/python${PYTHON_MAJMIN}/pyconfig*.h " +
>>> - "${libdir}/python${PYTHON_MAJMIN}/sitecustomize.py ")
>>> -
>>> - m.addPackage( "${PN}-dev", "Python development package",
>>> "${PN}-core",
>>> - "${includedir} " +
>>> - "${libdir}/lib*${SOLIBSDEV} " +
>>> - "${libdir}/*.la " +
>>> - "${libdir}/*.a " +
>>> - "${libdir}/*.o " +
>>> - "${libdir}/pkgconfig " +
>>> - "${base_libdir}/*.a " +
>>> - "${base_libdir}/*.o " +
>>> - "${datadir}/aclocal " +
>>> - "${datadir}/pkgconfig " +
>>> - "config/Makefile ")
>>> -
>>> - m.addPackage( "${PN}-2to3", "Python automated Python 2 to 3 code
>>> translator", "${PN}-core",
>>> - "${bindir}/2to3 lib2to3" ) # package
>>> -
>>> - m.addPackage( "${PN}-idle", "Python Integrated Development
>>> Environment", "${PN}-core ${PN}-tkinter",
>>> - "${bindir}/idle idlelib" ) # package
>>> -
>>> - m.addPackage( "${PN}-pydoc", "Python interactive help support",
>>> "${PN}-core ${PN}-lang ${PN}-stringold ${PN}-re",
>>> - "${bindir}/pydoc pydoc.* pydoc_data" )
>>> -
>>> - m.addPackage( "${PN}-smtpd", "Python Simple Mail Transport Daemon",
>>> "${PN}-core ${PN}-netserver ${PN}-email ${PN}-mime",
>>> - "${bindir}/smtpd.* smtpd.*" )
>>> -
>>> - m.addPackage( "${PN}-audio", "Python Audio Handling", "${PN}-core",
>>> - "wave.* chunk.* sndhdr.* lib-dynload/ossaudiodev.so
>>> lib-dynload/audioop.so audiodev.* sunaudio.* sunau.* toaiff.*" )
>>> -
>>> - m.addPackage( "${PN}-bsddb", "Python bindings for the Berkeley
>>> Database", "${PN}-core",
>>> - "bsddb lib-dynload/_bsddb.so" ) # package
>>> -
>>> - m.addPackage( "${PN}-codecs", "Python codecs, encodings & i18n
>>> support", "${PN}-core ${PN}-lang",
>>> - "codecs.* encodings gettext.* locale.* lib-dynload/_locale.so
>>> lib-dynload/_codecs* lib-dynload/_multibytecodec.so
>>> lib-dynload/unicodedata.so stringprep.* xdrlib.*" )
>>> -
>>> - m.addPackage( "${PN}-compile", "Python bytecode compilation
>>> support", "${PN}-core",
>>> - "py_compile.* compileall.*" )
>>> -
>>> - m.addPackage( "${PN}-compiler", "Python compiler support",
>>> "${PN}-core",
>>> - "compiler" ) # package
>>> -
>>> - m.addPackage( "${PN}-compression", "Python high-level compression
>>> support", "${PN}-core ${PN}-zlib",
>>> - "gzip.* zipfile.* tarfile.* lib-dynload/bz2.so" )
>>> -
>>> - m.addPackage( "${PN}-crypt", "Python basic cryptographic and
>>> hashing support", "${PN}-core",
>>> - "hashlib.* md5.* sha.* lib-dynload/crypt.so lib-dynload/_hashlib.so
>>> lib-dynload/_sha256.so lib-dynload/_sha512.so" )
>>> -
>>> - m.addPackage( "${PN}-textutils", "Python option parsing, text
>>> wrapping and CSV support", "${PN}-core ${PN}-io ${PN}-re ${PN}-stringold",
>>> - "lib-dynload/_csv.so csv.* optparse.* textwrap.*" )
>>> -
>>> - m.addPackage( "${PN}-curses", "Python curses support", "${PN}-core",
>>> - "curses lib-dynload/_curses.so lib-dynload/_curses_panel.so" ) #
>>> directory + low level module
>>> -
>>> - m.addPackage( "${PN}-ctypes", "Python C types support",
>>> "${PN}-core",
>>> - "ctypes lib-dynload/_ctypes.so lib-dynload/_ctypes_test.so" ) #
>>> directory + low level module
>>> -
>>> - m.addPackage( "${PN}-datetime", "Python calendar and time support",
>>> "${PN}-core ${PN}-codecs",
>>> - "_strptime.* calendar.* lib-dynload/datetime.so" )
>>> -
>>> - m.addPackage( "${PN}-db", "Python file-based database support",
>>> "${PN}-core",
>>> - "anydbm.* dumbdbm.* whichdb.* " )
>>> -
>>> - m.addPackage( "${PN}-debugger", "Python debugger", "${PN}-core
>>> ${PN}-io ${PN}-lang ${PN}-re ${PN}-stringold ${PN}-shell ${PN}-pprint",
>>> - "bdb.* pdb.*" )
>>> -
>>> - m.addPackage( "${PN}-difflib", "Python helpers for computing deltas
>>> between objects", "${PN}-lang ${PN}-re",
>>> - "difflib.*" )
>>> -
>>> - m.addPackage( "${PN}-distutils-staticdev", "Python distribution
>>> utilities (static libraries)", "${PN}-distutils",
>>> - "config/lib*.a" ) # package
>>> -
>>> - m.addPackage( "${PN}-distutils", "Python Distribution Utilities",
>>> "${PN}-core ${PN}-email",
>>> - "config distutils" ) # package
>>> -
>>> - m.addPackage( "${PN}-doctest", "Python framework for running
>>> examples in docstrings", "${PN}-core ${PN}-lang ${PN}-io ${PN}-re
>>> ${PN}-unittest ${PN}-debugger ${PN}-difflib",
>>> - "doctest.*" )
>>> -
>>> - m.addPackage( "${PN}-email", "Python email support", "${PN}-core
>>> ${PN}-io ${PN}-re ${PN}-mime ${PN}-audio ${PN}-image ${PN}-netclient",
>>> - "imaplib.* email" ) # package
>>> -
>>> - m.addPackage( "${PN}-fcntl", "Python's fcntl interface",
>>> "${PN}-core",
>>> - "lib-dynload/fcntl.so" )
>>> -
>>> - m.addPackage( "${PN}-hotshot", "Python hotshot performance
>>> profiler", "${PN}-core",
>>> - "hotshot lib-dynload/_hotshot.so" )
>>> -
>>> - m.addPackage( "${PN}-html", "Python HTML processing support",
>>> "${PN}-core",
>>> - "formatter.* htmlentitydefs.* htmllib.* markupbase.* sgmllib.*
>>> HTMLParser.* " )
>>> -
>>> - m.addPackage( "${PN}-importlib", "Python import implementation
>>> library", "${PN}-core",
>>> - "importlib" )
>>> -
>>> - m.addPackage( "${PN}-gdbm", "Python GNU database support",
>>> "${PN}-core",
>>> - "lib-dynload/gdbm.so" )
>>> -
>>> - m.addPackage( "${PN}-image", "Python graphical image handling",
>>> "${PN}-core",
>>> - "colorsys.* imghdr.* lib-dynload/imageop.so lib-dynload/rgbimg.so" )
>>> -
>>> - m.addPackage( "${PN}-io", "Python low-level I/O", "${PN}-core
>>> ${PN}-math ${PN}-textutils ${PN}-netclient ${PN}-contextlib",
>>> - "lib-dynload/_socket.so lib-dynload/_io.so lib-dynload/_ssl.so
>>> lib-dynload/select.so lib-dynload/termios.so lib-dynload/cStringIO.so " +
>>> - "pipes.* socket.* ssl.* tempfile.* StringIO.* io.* _pyio.*" )
>>> -
>>> - m.addPackage( "${PN}-json", "Python JSON support", "${PN}-core
>>> ${PN}-math ${PN}-re ${PN}-codecs",
>>> - "json lib-dynload/_json.so" ) # package
>>> -
>>> - m.addPackage( "${PN}-lang", "Python low-level language support",
>>> "${PN}-core",
>>> - "lib-dynload/_bisect.so lib-dynload/_collections.so
>>> lib-dynload/_heapq.so lib-dynload/_weakref.so lib-dynload/_functools.so " +
>>> - "lib-dynload/array.so lib-dynload/itertools.so
>>> lib-dynload/operator.so lib-dynload/parser.so " +
>>> - "atexit.* bisect.* code.* codeop.* collections.* dis.* functools.*
>>> heapq.* inspect.* keyword.* opcode.* symbol.* repr.* token.* " +
>>> - "tokenize.* traceback.* weakref.*" )
>>> -
>>> - m.addPackage( "${PN}-logging", "Python logging support",
>>> "${PN}-core ${PN}-io ${PN}-lang ${PN}-pickle ${PN}-stringold",
>>> - "logging" ) # package
>>> -
>>> - m.addPackage( "${PN}-mailbox", "Python mailbox format support",
>>> "${PN}-core ${PN}-mime",
>>> - "mailbox.*" )
>>> -
>>> - m.addPackage( "${PN}-math", "Python math support", "${PN}-core
>>> ${PN}-crypt",
>>> - "lib-dynload/cmath.so lib-dynload/math.so lib-dynload/_random.so
>>> random.* sets.*" )
>>> -
>>> - m.addPackage( "${PN}-mime", "Python MIME handling APIs",
>>> "${PN}-core ${PN}-io",
>>> - "mimetools.* uu.* quopri.* rfc822.* MimeWriter.*" )
>>> -
>>> - m.addPackage( "${PN}-mmap", "Python memory-mapped file support",
>>> "${PN}-core ${PN}-io",
>>> - "lib-dynload/mmap.so " )
>>> -
>>> - m.addPackage( "${PN}-multiprocessing", "Python multiprocessing
>>> support", "${PN}-core ${PN}-io ${PN}-lang ${PN}-pickle ${PN}-threading
>>> ${PN}-ctypes ${PN}-mmap",
>>> - "lib-dynload/_multiprocessing.so multiprocessing" ) # package
>>> -
>>> - m.addPackage( "${PN}-netclient", "Python Internet Protocol
>>> clients", "${PN}-core ${PN}-crypt ${PN}-datetime ${PN}-io ${PN}-lang
>>> ${PN}-logging ${PN}-mime",
>>> - "*Cookie*.* " +
>>> - "base64.* cookielib.* ftplib.* gopherlib.* hmac.* httplib.*
>>> mimetypes.* nntplib.* poplib.* smtplib.* telnetlib.* urllib.* urllib2.*
>>> urlparse.* uuid.* rfc822.* mimetools.*" )
>>> -
>>> - m.addPackage( "${PN}-netserver", "Python Internet Protocol
>>> servers", "${PN}-core ${PN}-netclient ${PN}-shell ${PN}-threading",
>>> - "cgi.* *HTTPServer.* SocketServer.*" )
>>> -
>>> - m.addPackage( "${PN}-numbers", "Python number APIs", "${PN}-core
>>> ${PN}-lang ${PN}-re",
>>> - "decimal.* fractions.* numbers.*" )
>>> -
>>> - m.addPackage( "${PN}-pickle", "Python serialisation/persistence
>>> support", "${PN}-core ${PN}-codecs ${PN}-io ${PN}-re",
>>> - "pickle.* shelve.* lib-dynload/cPickle.so pickletools.*" )
>>> -
>>> - m.addPackage( "${PN}-pkgutil", "Python package extension utility
>>> support", "${PN}-core",
>>> - "pkgutil.*")
>>> -
>>> - m.addPackage( "${PN}-plistlib", "Generate and parse Mac OS X .plist
>>> files", "${PN}-core ${PN}-datetime ${PN}-io",
>>> - "plistlib.*")
>>> -
>>> - m.addPackage( "${PN}-pprint", "Python pretty-print support",
>>> "${PN}-core ${PN}-io",
>>> - "pprint.*" )
>>> -
>>> - m.addPackage( "${PN}-profile", "Python basic performance profiling
>>> support", "${PN}-core ${PN}-textutils",
>>> - "profile.* pstats.* cProfile.* lib-dynload/_lsprof.so" )
>>> -
>>> - m.addPackage( "${PN}-re", "Python Regular Expression APIs",
>>> "${PN}-core",
>>> - "re.* sre.* sre_compile.* sre_constants* sre_parse.*" ) # _sre is
>>> builtin
>>> -
>>> - m.addPackage( "${PN}-readline", "Python readline support",
>>> "${PN}-core",
>>> - "lib-dynload/readline.so rlcompleter.*" )
>>> -
>>> - m.addPackage( "${PN}-resource", "Python resource control
>>> interface", "${PN}-core",
>>> - "lib-dynload/resource.so" )
>>> -
>>> - m.addPackage( "${PN}-shell", "Python shell-like functionality",
>>> "${PN}-core ${PN}-re",
>>> - "cmd.* commands.* dircache.* fnmatch.* glob.* popen2.* shlex.*
>>> shutil.*" )
>>> -
>>> - m.addPackage( "${PN}-robotparser", "Python robots.txt parser",
>>> "${PN}-core ${PN}-netclient",
>>> - "robotparser.*")
>>> -
>>> - m.addPackage( "${PN}-runpy", "Python script for locating/executing
>>> scripts in module namespace", "${PN}-core ${PN}-pkgutil",
>>> - "runpy.*")
>>> -
>>> - m.addPackage( "${PN}-subprocess", "Python subprocess support",
>>> "${PN}-core ${PN}-io ${PN}-re ${PN}-fcntl ${PN}-pickle",
>>> - "subprocess.*" )
>>> -
>>> - m.addPackage( "${PN}-sqlite3", "Python Sqlite3 database support",
>>> "${PN}-core ${PN}-datetime ${PN}-lang ${PN}-crypt ${PN}-io ${PN}-threading
>>> ${PN}-zlib",
>>> - "lib-dynload/_sqlite3.so sqlite3/dbapi2.* sqlite3/__init__.*
>>> sqlite3/dump.*" )
>>> -
>>> - m.addPackage( "${PN}-sqlite3-tests", "Python Sqlite3 database
>>> support tests", "${PN}-core ${PN}-sqlite3",
>>> - "sqlite3/test" )
>>> -
>>> - m.addPackage( "${PN}-stringold", "Python string APIs [deprecated]",
>>> "${PN}-core ${PN}-re",
>>> - "lib-dynload/strop.so string.* stringold.*" )
>>> -
>>> - m.addPackage( "${PN}-syslog", "Python syslog interface",
>>> "${PN}-core",
>>> - "lib-dynload/syslog.so" )
>>> -
>>> - m.addPackage( "${PN}-terminal", "Python terminal controlling
>>> support", "${PN}-core ${PN}-io",
>>> - "pty.* tty.*" )
>>> -
>>> - m.addPackage( "${PN}-tests", "Python tests", "${PN}-core
>>> ${PN}-modules",
>>> - "test", True ) # package
>>> -
>>> - m.addPackage( "${PN}-threading", "Python threading &
>>> synchronization support", "${PN}-core ${PN}-lang",
>>> - "_threading_local.* dummy_thread.* dummy_threading.* mutex.*
>>> threading.* Queue.*" )
>>> -
>>> - m.addPackage( "${PN}-tkinter", "Python Tcl/Tk bindings",
>>> "${PN}-core",
>>> - "lib-dynload/_tkinter.so lib-tk" ) # package
>>> -
>>> - m.addPackage( "${PN}-unittest", "Python unit testing framework",
>>> "${PN}-core ${PN}-stringold ${PN}-lang ${PN}-io ${PN}-difflib ${PN}-pprint
>>> ${PN}-shell",
>>> - "unittest/" )
>>> -
>>> - m.addPackage( "${PN}-unixadmin", "Python Unix administration
>>> support", "${PN}-core",
>>> - "lib-dynload/nis.so lib-dynload/grp.so lib-dynload/pwd.so
>>> getpass.*" )
>>> -
>>> - m.addPackage( "${PN}-xml", "Python basic XML support", "${PN}-core
>>> ${PN}-re",
>>> - "lib-dynload/_elementtree.so lib-dynload/pyexpat.so xml xmllib.*" )
>>> # package
>>> -
>>> - m.addPackage( "${PN}-xmlrpc", "Python XML-RPC support", "${PN}-core
>>> ${PN}-xml ${PN}-netserver ${PN}-lang",
>>> - "xmlrpclib.* SimpleXMLRPCServer.* DocXMLRPCServer.*" )
>>> -
>>> - m.addPackage( "${PN}-zlib", "Python zlib compression support",
>>> "${PN}-core",
>>> - "lib-dynload/zlib.so" )
>>> -
>>> - m.addPackage( "${PN}-mailbox", "Python mailbox format support",
>>> "${PN}-core ${PN}-mime",
>>> - "mailbox.*" )
>>> -
>>> - m.addPackage( "${PN}-argparse", "Python command line argument
>>> parser", "${PN}-core ${PN}-codecs ${PN}-textutils",
>>> - "argparse.*" )
>>> -
>>> - m.addPackage( "${PN}-contextlib", "Python utilities for
>>> with-statement" +
>>> - "contexts.", "${PN}-core",
>>> - "${libdir}/python${PYTHON_MAJMIN}/contextlib.*" )
>>> -
>>> - m.make()
>>>
>>> --
>>> To stop receiving notification emails like this one, please contact
>>> the administrator of this repository.
>>> --
>>> _______________________________________________
>>> Openembedded-commits mailing list
>>> Openembedded-commits at lists.openembedded.org
>>> http://lists.openembedded.org/mailman/listinfo/openembedded-commits
>>>
>>
>>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20180122/20d54aed/attachment-0002.html>
More information about the Openembedded-core
mailing list