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.

There are many problems with our current implementation of the manifest file,
this patch tries to deal with all of them along with adding several other
features.

This patch adds a new task to python recipes, which is meant to create a new
manifest file every release.

$ bitbake python -c create_manifest  

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, providing us with finer granularity.

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.


Using this script a new package can easily be added like this:
 - 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:
   "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"}

It also fixes several errors we didnt even know we had:
 - Fixes python-core for 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

The python2 and python3 versions differ on its core functionality in some bits:
 - Python3 handles precompiled bytecode files  (*.pyc) differently.
   for this reason and since we are cross compiling, wildcards couldnt be
   avoided on python3 (See PEP #3147 [1]).
   Both the manifest and the manifest creation script handle this
   differently, the manifest for python3 has an extra field for cached
   files, which is how it lets the user install the cached files or not
   via : INCLUDE_PYCS = "1" on their local.conf.
 - Shared libs nomenclature also changed on python3, so again, we use
   wildcards to deal with this issue ( See PEP #3149 [2]):
 - Fixes python3 manifest, python3-core should be base and everything
   should depend on it, hence several packages were deleted:
   python3-enum, re, gdbm, subprocess, signal, readline.



The following changes since commit 55bf88603927469de9aa9f6fd4d449230d2e61e3:

  poky: Add nios2 to list of qemu targets (2017-08-17 00:21:35 +0100)

are available in the git repository at:

  git://git.yoctoproject.org/poky-contrib hsalejandro/python_autopack_final
  
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=hsalejandro/python_autopack_final

Alejandro Hernandez (3):
  python: Restructure python packaging and replace it with autopackaging
  python3: fix RDEPENDS on several recipes, due to non-existent python3
    packages
  python3: Restructure python3 packaging and replace it with
    autopackaging

 meta/recipes-core/libxml/libxml2_2.9.4.bb          |    2 +-
 .../bootchart2/bootchart2_0.14.8.bb                |    2 +-
 meta/recipes-devtools/dnf/dnf_2.6.3.bb             |    4 +-
 meta/recipes-devtools/gdb/gdb-cross-canadian.inc   |    4 +-
 .../opkg-utils/opkg-utils_0.3.5.bb                 |    2 +-
 .../python-numpy/python3-numpy_1.13.1.bb           |    2 -
 .../python/python-2.7-manifest.inc                 |  287 -----
 .../python/python-3.5-manifest.inc                 |  283 -----
 .../python/python-native-3.5-manifest.inc          |   10 -
 .../python/python-native_2.7.13.bb                 |    3 -
 .../python/python/create_manifest2.py              |  274 +++++
 .../python/python/get_module_deps2.py              |  110 ++
 .../python/python/python2-manifest.json            | 1033 ++++++++++++++++++
 .../python/python/sitecustomize.py                 |    8 -
 .../recipes-devtools/python/python3-async_0.6.2.bb |    2 +-
 meta/recipes-devtools/python/python3-git_2.1.5.bb  |    2 +-
 .../recipes-devtools/python/python3-gitdb_0.6.4.bb |    2 +-
 .../python/python3-native_3.5.3.bb                 |   10 +-
 .../python/python3-pygobject_3.24.1.bb             |    2 +-
 .../python/python3-setuptools_36.2.7.bb            |    3 -
 .../recipes-devtools/python/python3-smmap_0.9.0.bb |    2 +-
 .../python/python3/create_manifest3.py             |  318 ++++++
 .../python/python3/get_module_deps3.py             |  145 +++
 .../python/python3/python3-manifest.json           | 1107 ++++++++++++++++++++
 meta/recipes-devtools/python/python3_3.5.3.bb      |   90 +-
 meta/recipes-devtools/python/python_2.7.13.bb      |   82 +-
 .../qemu/nativesdk-qemu-helper_1.0.bb              |    2 +-
 meta/recipes-graphics/piglit/piglit_git.bb         |    4 +-
 meta/recipes-rt/rt-tests/hwlatdetect_1.1.bb        |    2 +-
 meta/recipes-rt/rt-tests/rt-tests_1.1.bb           |    2 +-
 scripts/contrib/python/generate-manifest-2.7.py    |  421 --------
 scripts/contrib/python/generate-manifest-3.5.py    |  433 --------
 32 files changed, 3178 insertions(+), 1475 deletions(-)
 delete mode 100644 meta/recipes-devtools/python/python-2.7-manifest.inc
 delete mode 100644 meta/recipes-devtools/python/python-3.5-manifest.inc
 delete mode 100644 meta/recipes-devtools/python/python-native-3.5-manifest.inc
 create mode 100644 meta/recipes-devtools/python/python/create_manifest2.py
 create mode 100644 meta/recipes-devtools/python/python/get_module_deps2.py
 create mode 100644 meta/recipes-devtools/python/python/python2-manifest.json
 create mode 100644 meta/recipes-devtools/python/python3/create_manifest3.py
 create mode 100644 meta/recipes-devtools/python/python3/get_module_deps3.py
 create mode 100644 meta/recipes-devtools/python/python3/python3-manifest.json
 delete mode 100755 scripts/contrib/python/generate-manifest-2.7.py
 delete mode 100755 scripts/contrib/python/generate-manifest-3.5.py

-- 
2.12.3

-- 
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to