Skip to contentSkip to conversation

python improvements

PATCH In review Tim Orling 2 participants 17 messages Dec 12, 2017

lore
Share & tools
lore

Tim Orling

author
#0 lore raw

v3 cover python improvements

We are not quite ready for the json manifest changes from v2, so this series works with the original manifest generators.

The commit which deletes the old manifests will fail git send-email, so this series must be pulled from git. This series DOES address this issue by adding newlines in the generators so that the manifests do not continue to break git send-mail workflow.

The pypi.bbclass added to meta-python by Derek Straka significantly simplifies python module packaging and has utility outside of just the meta-python layer. Most notably, it knows how to generate the SRC_URI, S, UPSTREAM_CHECK_URI and UPSTREAM_CHECK_REGEX variables given a PYPI_PACKAGE. For special cases where PYPI_PACKAGE is not guessable from the BPN, the value can be set in your recipe. For special cases where the upstream source is not bundled as a .tar.gz, the PYPI_PACKAGE_EXT can be set in your recipe. Providing python2 and python3 packaging is also simplified by putting most of the common content into .inc files. Note that it is strongly recommend to use PYTHON_PN to dynamically set "python-" vs. "python3-" prefix for your DEPENDS and RDEPENDS needs. This often moves everything but the "requires python-foo.inc" and "include setuptools*" lines in your python recipes to the common .inc file. Much simpler maintenance.

This patch series adds runpy to the python-*-manifests, which allows you to run, for example "python -m pip" from the command line. It also adds a couple dependencies that were silently breaking python packages at runtime.

This series modifies all the recipes in recipes-devtools/python which had a SRC_URI pointing to "pythonhosted" to use the pypi.bbclass. Where it made sense, the "python-" and "python3-" specific files were simplified, putting the common content into the .inc file.

Finally, this series upgrades python-scons and python*-setuptools to the latest versions.

The following changes since commit a24c10b7bdab8aa960fdd3a58d2009f24344e579:

populate_sdk_ext: Use prebuilt uninative tarball (2017-12-11 21:46:33 +0000)

are available in the Git repository at:

git://git.openembedded.org/openembedded-core-contrib timo/pypi-v3
http://cgit.openembedded.org//log/?h=timo/pypi-v3

Tim Orling (14):
pypi.bbclass: bring in from meta-python python-*-manifest/generators: fix long line lengths python-*-manifest/generators: add runpy; python3-plistlib
python-setuptools: upgrade to 38.2.4; use pypi.bbclass; improvements
python3-pip: use pypi.bbclass
python-nose: use pypi.bbclass
python-six: use pypi.bbclass
python-async: use pypi.bbclass
python-mako: use pypi.bbclass
python-smmap: use pypi.bbclass
python-gitdb: use pypi.bbclass
python-git: use pypi.bbclass
python3-iniparse: use pypi.bbclass
python-scons: upgrade to v3.0.1; use pypi.bbclass

 meta/classes/pypi.bbclass                          |  26 +
 .../python/python-2.7-manifest.inc                 | 699 +++++++++++++--
 .../python/python-3.5-manifest.inc                 | 990 +++++++++++++++++++--
 meta/recipes-devtools/python/python-async.inc      |   7 +-
 meta/recipes-devtools/python/python-git.inc        |  26 +-
 meta/recipes-devtools/python/python-gitdb.inc      |  15 +-
 meta/recipes-devtools/python/python-mako.inc       |  13 +-
 meta/recipes-devtools/python/python-nose.inc       |  18 +
 meta/recipes-devtools/python/python-nose_1.3.7.bb  |  25 +-
 ...ative_3.0.0.bb => python-scons-native_3.0.1.bb} |   0
 ...onscript-Support-python2-print-statements.patch |  38 -
 ...python-scons_3.0.0.bb => python-scons_3.0.1.bb} |  12 +-
 meta/recipes-devtools/python/python-setuptools.inc |  42 +-
 .../python/python-setuptools_36.5.0.bb             |  38 -
 .../python/python-setuptools_38.2.4.bb             |   9 +
 meta/recipes-devtools/python/python-six.inc        |   8 +-
 meta/recipes-devtools/python/python-smmap.inc      |  12 +-
 .../recipes-devtools/python/python3-async_0.6.2.bb |   6 +-
 meta/recipes-devtools/python/python3-git_2.1.7.bb  |   5 -
 .../recipes-devtools/python/python3-gitdb_0.6.4.bb |   7 +-
 .../python/python3-iniparse_0.4.bb                 |   9 +-
 meta/recipes-devtools/python/python3-mako_1.0.7.bb |  11 +-
 meta/recipes-devtools/python/python3-nose_1.3.7.bb |  24 +-
 meta/recipes-devtools/python/python3-pip_9.0.1.bb  |  13 +-
 .../python/python3-setuptools_36.5.0.bb            |  38 -
 .../python/python3-setuptools_38.2.4.bb            |   6 +
 meta/recipes-devtools/python/python3-six_1.11.0.bb |   2 -
 .../recipes-devtools/python/python3-smmap_0.9.0.bb |   5 +-
 scripts/contrib/python/generate-manifest-2.7.py    |  27 +-
 scripts/contrib/python/generate-manifest-3.5.py    |  31 +-
 30 files changed, 1743 insertions(+), 419 deletions(-)
 create mode 100644 meta/classes/pypi.bbclass
 create mode 100644 meta/recipes-devtools/python/python-nose.inc
 rename meta/recipes-devtools/python/{python-scons-native_3.0.0.bb => python-scons-native_3.0.1.bb} (100%)
 delete mode 100644 meta/recipes-devtools/python/python-scons/SConscript-Support-python2-print-statements.patch
 rename meta/recipes-devtools/python/{python-scons_3.0.0.bb => python-scons_3.0.1.bb} (54%)
 delete mode 100644 meta/recipes-devtools/python/python-setuptools_36.5.0.bb
 create mode 100644 meta/recipes-devtools/python/python-setuptools_38.2.4.bb
 delete mode 100644 meta/recipes-devtools/python/python3-setuptools_36.5.0.bb
 create mode 100644 meta/recipes-devtools/python/python3-setuptools_38.2.4.bb
Signature · 1 line
2.14.3
author
#8 lore raw

PATCH v3 7/14 python-six: use pypi.bbclass

* Simplify python3-six by using pypi.bbclass
- Use PYTHON_PN in .inc to avoid duplication in RDEPENDS

---
 meta/recipes-devtools/python/python-six.inc        | 8 +++-----
 meta/recipes-devtools/python/python3-six_1.11.0.bb | 2 --
 2 files changed, 3 insertions(+), 7 deletions(-)
meta/recipes-devtools/python/python-six.inc +3 -5
index f9e7d6429d..c77498457d 100644
@@ -4,13 +4,11 @@ SECTION = "devel/python"
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=35cec5bf04dd0820d0a18533ea7c774a"
 
-SRC_URI = "https://files.pythonhosted.org/packages/source/s/six/six-${PV}.tar.gz"
 SRC_URI[md5sum] = "d12789f9baf7e9fb2524c0c64f1773f8"
 SRC_URI[sha256sum] = "70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9"
 
-UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/six/"
-UPSTREAM_CHECK_REGEX = "/six/(?P<pver>(\d+[\.\-_]*)+)"
+inherit pypi
 
-BBCLASSEXTEND = "native nativesdk"
+RDEPENDS_${PN} = "${PYTHON_PN}-io"
 
-S = "${WORKDIR}/six-${PV}"
+BBCLASSEXTEND = "native nativesdk"
meta/recipes-devtools/python/python3-six_1.11.0.bb +0 -2
index 38a47b77dd..8795313bec 100644
@@ -1,4 +1,2 @@
 inherit setuptools3
 require python-six.inc
-
-RDEPENDS_${PN} += "python3-io"
Signature · 1 line
2.14.3
author
#9 lore raw

PATCH v3 8/14 python-async: use pypi.bbclass

In reply to Tim Orling

* Simplify by using pypi.bbclass
* Use PYTHON_PN for RDEPENDS in .inc to avoid duplication

---
 meta/recipes-devtools/python/python-async.inc       | 7 +++----
 meta/recipes-devtools/python/python3-async_0.6.2.bb | 6 +-----
 2 files changed, 4 insertions(+), 9 deletions(-)
meta/recipes-devtools/python/python-async.inc +3 -4
index 2c5cb4d191..0874667e0c 100644
@@ -4,12 +4,11 @@ SECTION = "devel/python"
 LICENSE = "BSD"
 LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=88df8e78b9edfd744953862179f2d14e"
 
-SRC_URI = "https://files.pythonhosted.org/packages/source/a/async/async-${PV}.tar.gz"
+inherit pypi
+
 SRC_URI[md5sum] = "9b06b5997de2154f3bc0273f80bcef6b"
 SRC_URI[sha256sum] = "ac6894d876e45878faae493b0cf61d0e28ec417334448ac0a6ea2229d8343051"
 
-UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/async/"
-
-S = "${WORKDIR}/async-${PV}"
+RDEPENDS_${PN} += "${PYTHON_PN}-threading ${PYTHON_PN}-lang"
 
 BBCLASSEXTEND = "nativesdk"
meta/recipes-devtools/python/python3-async_0.6.2.bb +1 -5
index 54a30f5498..0da5fdecdc 100644
@@ -1,6 +1,2 @@
-require python-async.inc
-
 inherit setuptools3
-
-RDEPENDS_${PN} += "python3-threading python3-lang"
-
+require python-async.inc
Signature · 1 line
2.14.3
author
#10 lore raw

PATCH v3 9/14 python-mako: use pypi.bbclass

In reply to Tim Orling

* Simpify python3-mako by using pypi.bbclass
* Consolidate common content in .inc

---
 meta/recipes-devtools/python/python-mako.inc       | 13 +++++++++----
 meta/recipes-devtools/python/python3-mako_1.0.7.bb | 11 +----------
 2 files changed, 10 insertions(+), 14 deletions(-)
meta/recipes-devtools/python/python-mako.inc +9 -4
index 1c83af6a23..e265bde85f 100644
@@ -4,13 +4,18 @@ SECTION = "devel/python"
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=1bb21fa2d2f7a534c884b990430a6863"
 
-SRC_URI = "https://files.pythonhosted.org/packages/source/M/Mako/Mako-${PV}.tar.gz"
+PYPI_PACKAGE = "Mako"
+
+inherit pypi
 
 SRC_URI[md5sum] = "5836cc997b1b773ef389bf6629c30e65"
 SRC_URI[sha256sum] = "4e02fde57bd4abb5ec400181e4c314f56ac3e49ba4fb8b0d50bba18cb27d25ae"
 
-UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/mako/"
-UPSTREAM_CHECK_REGEX = "/Mako/(?P<pver>(\d+[\.\-_]*)+)"
+RDEPENDS_${PN} = "${PYTHON_PN}-html \
+                  ${PYTHON_PN}-netclient \
+                  ${PYTHON_PN}-threading \
+"
 
-S = "${WORKDIR}/Mako-${PV}"
+RDEPENDS_${PN}_class-native = ""
 
+BBCLASSEXTEND = "native nativesdk"
meta/recipes-devtools/python/python3-mako_1.0.7.bb +1 -10
index 2b50ffd08a..22ceeeb395 100644
@@ -1,11 +1,2 @@
-require python-mako.inc
-
 inherit setuptools3
-
-RDEPENDS_${PN} = "python3-threading \
-                  python3-netclient \
-                  python3-html \
-"
-RDEPENDS_${PN}_class-native = ""
-
-BBCLASSEXTEND = "native nativesdk"
+require python-mako.inc
Signature · 1 line
2.14.3
author
#11 lore raw

PATCH v3 10/14 python-smmap: use pypi.bbclass

In reply to Tim Orling

* Simpify python3-smmap using pypi.bbclass
* Consolidate common content in .inc

---
 meta/recipes-devtools/python/python-smmap.inc       | 12 ++++++------
 meta/recipes-devtools/python/python3-smmap_0.9.0.bb |  5 +----
 2 files changed, 7 insertions(+), 10 deletions(-)
meta/recipes-devtools/python/python-smmap.inc +6 -6
index d67e6b5412..32438350c1 100644
@@ -7,13 +7,13 @@ SECTION = "devel/python"
 LICENSE = "BSD"
 LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e910b35b0ef4e1f665b9a75d6afb7709"
 
-SRC_URI = "https://files.pythonhosted.org/packages/source/s/smmap/smmap-${PV}.tar.gz"
+inherit pypi
+
 SRC_URI[md5sum] = "d7932d5ace206bf4ae15198cf36fb6ab"
 SRC_URI[sha256sum] = "0e2b62b497bd5f0afebc002eda4d90df9d209c30ef257e8673c90a6b5c119d62"
 
-UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/smmap/"
-UPSTREAM_CHECK_REGEX = "/smmap/(?P<pver>(\d+[\.\-_]*)+)"
-
-S = "${WORKDIR}/smmap-${PV}"
-
+RDEPENDS_${PN} += "${PYTHON_PN}-codecs \
+                   ${PYTHON_PN}-lang \
+                   ${PYTHON_PN}-mmap \
+"
 BBCLASSEXTEND = "nativesdk"
meta/recipes-devtools/python/python3-smmap_0.9.0.bb +1 -4
index 9f8a26d79e..e87b8df8c5 100644
@@ -1,5 +1,2 @@
-require python-smmap.inc
-
 inherit setuptools3
-
-RDEPENDS_${PN} += "python3-codecs python3-mmap python3-lang"
+require python-smmap.inc
Signature · 1 line
2.14.3
author
#12 lore raw

PATCH v3 11/14 python-gitdb: use pypi.bbclass

In reply to Tim Orling

* Simplify python3-gitdb using pypi.bbclass
* Consolidate common content in .inc

---
 meta/recipes-devtools/python/python-gitdb.inc       | 15 +++++++++++----
 meta/recipes-devtools/python/python3-gitdb_0.6.4.bb |  7 +------
 2 files changed, 12 insertions(+), 10 deletions(-)
meta/recipes-devtools/python/python-gitdb.inc +11 -4
index 08193fbf25..5fa8885eb9 100644
@@ -4,13 +4,20 @@ SECTION = "devel/python"
 LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=59e5ecb13339a936eedf83282eaf4528"
 
-SRC_URI = "https://files.pythonhosted.org/packages/source/g/gitdb/gitdb-${PV}.tar.gz"
+inherit pypi
 
 SRC_URI[md5sum] = "44e4366b8bdfd306b075c3a52c96ae1a"
 SRC_URI[sha256sum] = "a3ebbc27be035a2e874ed904df516e35f4a29a778a764385de09de9e0f139658"
 
-UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/gitdb/"
-
-S = "${WORKDIR}/gitdb-${PV}"
+DEPENDS = "${PYTHON_PN}-async ${PYTHON_PN}-smmap"
 
+RDEPENDS_${PN} += "${PYTHON_PN}-async \
+                   ${PYTHON_PN}-compression \
+                   ${PYTHON_PN}-crypt \
+                   ${PYTHON_PN}-io \
+                   ${PYTHON_PN}-lang \
+                   ${PYTHON_PN}-mmap \
+                   ${PYTHON_PN}-shell \
+                   ${PYTHON_PN}-smmap \
+"
 BBCLASSEXTEND = "nativesdk"
meta/recipes-devtools/python/python3-gitdb_0.6.4.bb +1 -6
index 80d9d469af..e46a438757 100644
@@ -1,7 +1,2 @@
-require python-gitdb.inc
-
-DEPENDS = "python3-async python3-smmap"
-
 inherit distutils3
-
-RDEPENDS_${PN} += "python3-smmap python3-async python3-mmap python3-lang python3-io python3-shell python3-crypt python3-compression"
+require python-gitdb.inc
Signature · 1 line
2.14.3
author
#1 lore raw

PATCH v3 1/14 pypi.bbclass: bring in from meta-python

In reply to Tim Orling

The pypi.bbclass has usefullness in many meta layers, not just meta-python. Add it to oe-core for the benefit of everyone.

---
 meta/classes/pypi.bbclass | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)
 create mode 100644 meta/classes/pypi.bbclass
meta/classes/pypi.bbclass new file +26 -0
new file mode 100644
index 0000000000..e5d7ab3ce1
@@ -0,0 +1,26 @@
+def pypi_package(d):
+    bpn = d.getVar('BPN')
+    if bpn.startswith('python-'):
+        return bpn[7:]
+    elif bpn.startswith('python3-'):
+        return bpn[8:]
+    return bpn
+
+PYPI_PACKAGE ?= "${@pypi_package(d)}"
+PYPI_PACKAGE_EXT ?= "tar.gz"
+
+def pypi_src_uri(d):
+    package = d.getVar('PYPI_PACKAGE')
+    package_ext = d.getVar('PYPI_PACKAGE_EXT')
+    pv = d.getVar('PV')
+    return 'https://files.pythonhosted.org/packages/source/%s/%s/%s-%s.%s' % (package[0], package, package, pv, package_ext)
+
+PYPI_SRC_URI ?= "${@pypi_src_uri(d)}"
+
+HOMEPAGE ?= "https://pypi.python.org/pypi/${PYPI_PACKAGE}/"
+SECTION = "devel/python"
+SRC_URI += "${PYPI_SRC_URI}"
+S = "${WORKDIR}/${PYPI_PACKAGE}-${PV}"
+
+UPSTREAM_CHECK_URI ?= "https://pypi.python.org/pypi/${PYPI_PACKAGE}/"
+UPSTREAM_CHECK_REGEX ?= "/${PYPI_PACKAGE}/(?P<pver>(\d+[\.\-_]*)+)"
Signature · 1 line
2.14.3
author
#3 lore raw

PATCH v3 2/14 python-*-manifest/generators: fix long line lengths

In reply to Tim Orling

The generators create python-*-manifest.inc files with lines over 2500 characters long which breaks sending patches via git send-email (because of smtp limitation).

This patchset formats all the long lines into multiple lines.

---
 .../python/python-2.7-manifest.inc                 | 690 +++++++++++++--
 .../python/python-3.5-manifest.inc                 | 969 +++++++++++++++++++--
 scripts/contrib/python/generate-manifest-2.7.py    |  24 +-
 scripts/contrib/python/generate-manifest-3.5.py    |  24 +-
 4 files changed, 1540 insertions(+), 167 deletions(-)
meta/recipes-devtools/python/python-2.7-manifest.inc +617 -73
index 57d4834b3a..6198e2d1c3 100644
@@ -1,287 +1,831 @@
 
 # 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 <[email protected]>
+# Generator: './scripts/contrib/python/generate-manifest-2.7.py' Version 20110222.2 (C) 2002-2010 Michael 'Mickey' Lauer <[email protected]>
 
  
 
-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}-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}-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"
+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}-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}-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 "
+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.* "
+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.* "
+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 "
+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.* "
+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.* "
+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 "
+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 "
+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.* "
+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 "
+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 "
+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 "
+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 "
+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 "
+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.* "
+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.* "
+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 "
+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.* "
+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 "
+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 "
+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.* "
+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 "
+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 "
+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 "
+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 "
+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.* "
+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 "
+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 "
+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 "
+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.* "
+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 "
+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.* "
+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 "
+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.* "
+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.* "
+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.* "
+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 "
+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 "
+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.* "
+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.* "
+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.* "
+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.* "
+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.* "
+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.* "
+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.* "
+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 "
+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 "
+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.* "
+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.* "
+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 "
+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.* "
+FILES_${PN}-robotparser=" \
+    ${libdir}/python2.7/robotparser.* \
+"
 
 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.* "
+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.* "
+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.* "
+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 "
+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.* "
+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.* "
+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 "
+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.* "
+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 "
+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.* "
+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.* "
+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 "
+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/ "
+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.* "
+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.* "
+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.* "
+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 "
+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}-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  "
+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}-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"
 
 
meta/recipes-devtools/python/python-3.5-manifest.inc +897 -72

1,180 lines not on this page · raw message

scripts/contrib/python/generate-manifest-2.7.py +13 -11
index 586b329c19..2491bd0bc4 100755
@@ -88,9 +88,9 @@ class MakefileMaker:
         # generate provides line
         #
 
-        provideLine = 'PROVIDES+="'
+        provideLine = 'PROVIDES+=" \\\n'
         for name in sorted(self.packages):
-            provideLine += "%s " % name
+            provideLine += "  %s \\\n" % name
         provideLine += '"'
 
         self.out( provideLine )
@@ -100,14 +100,15 @@ class MakefileMaker:
         # generate package line
         #
 
-        packageLine = 'PACKAGES="${PN}-dbg '
+        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 " % (name, name)
+                    packageLine += "  %s-staticdev %s \\\n" % (name, name)
             elif name != '${PN}-dbg':
-                packageLine += "%s " % name
-        packageLine += '${PN}-modules"'
+                packageLine += "  %s \\\n" % name
+        packageLine += '  ${PN}-modules\\\n"'
 
         self.out( packageLine )
         self.out( "" )
@@ -125,7 +126,7 @@ class MakefileMaker:
             self.out( 'SUMMARY_%s="%s"' % ( name, desc ) )
             self.out( 'RDEPENDS_%s="%s"' % ( name, deps ) )
 
-            line = 'FILES_%s="' % name
+            line = 'FILES_%s=" \\\n' % name
 
             #
             # check which directories to make in the temporary directory
@@ -140,20 +141,21 @@ class MakefileMaker:
             #
 
             for target in files:
-                line += "%s " % target
+                line += "    %s \\\n" % target
 
             line += '"'
             self.out( line )
             self.out( "" )
 
         self.out( 'SUMMARY_${PN}-modules="All Python modules"' )
-        line = 'RDEPENDS_${PN}-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 " % name
+                line += "  %s \\\n" % name
 
-        self.out( "%s \"" % line )
+        line += '"'
+        self.out( line )
         self.out( 'ALLOW_EMPTY_${PN}-modules = "1"' )
 
     def doEpilog( self ):
scripts/contrib/python/generate-manifest-3.5.py +13 -11
index 6352f8f120..33779cffab 100755
@@ -101,9 +101,9 @@ class MakefileMaker:
         # generate provides line
         #
 
-        provideLine = 'PROVIDES+="'
+        provideLine = 'PROVIDES+="\\\n'
         for name in sorted(self.packages):
-            provideLine += "%s " % name
+            provideLine += "  %s \\\n" % name
         provideLine += '"'
 
         self.out( provideLine )
@@ -113,14 +113,15 @@ class MakefileMaker:
         # generate package line
         #
 
-        packageLine = 'PACKAGES="${PN}-dbg '
+        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 " % (name, name)
+                    packageLine += "%s \\\n %s-staticdev \\\n" % (name, name)
             elif name != '${PN}-dbg':
-                packageLine += "%s " % name
-        packageLine += '${PN}-modules"'
+                packageLine += "  %s \\\n" % name
+        packageLine += '  ${PN}-modules \\\n"'
 
         self.out( packageLine )
         self.out( "" )
@@ -138,7 +139,7 @@ class MakefileMaker:
             self.out( 'SUMMARY_%s="%s"' % ( name, desc ) )
             self.out( 'RDEPENDS_%s="%s"' % ( name, deps ) )
 
-            line = 'FILES_%s="' % name
+            line = 'FILES_%s="\\\n' % name
 
             #
             # check which directories to make in the temporary directory
@@ -153,20 +154,21 @@ class MakefileMaker:
             #
 
             for target in files:
-                line += "%s " % target
+                line += "  %s \\\n" % target
 
             line += '"'
             self.out( line )
             self.out( "" )
 
         self.out( 'SUMMARY_${PN}-modules="All Python modules"' )
-        line = 'RDEPENDS_${PN}-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 " % name
+                line += "  %s \\\n" % name
 
-        self.out( "%s \"" % line )
+        line += '"'
+        self.out( line )
         self.out( 'ALLOW_EMPTY_${PN}-modules = "1"' )
 
     def doEpilog( self ):
Signature · 1 line
2.14.3
author
#4 lore raw

PATCH v3 3/14 python-*-manifest/generators: add runpy; python3-plistlib

In reply to Tim Orling

* runpy allows running modules/scripts with 'python -m foo'
* python3-setuptools RDEPENDS on plistlib (present in python2)
* pip3 RDEPENDS on _markupbase (add to python3-core)

---
 .../recipes-devtools/python/python-2.7-manifest.inc |  9 +++++++++
 .../recipes-devtools/python/python-3.5-manifest.inc | 21 +++++++++++++++++++++
 scripts/contrib/python/generate-manifest-2.7.py     |  3 +++
 scripts/contrib/python/generate-manifest-3.5.py     |  7 +++++++
 4 files changed, 40 insertions(+)
meta/recipes-devtools/python/python-2.7-manifest.inc +9 -0
index 6198e2d1c3..7c3fc1b73a 100644
@@ -56,6 +56,7 @@ PROVIDES+=" \
   ${PN}-readline \
   ${PN}-resource \
   ${PN}-robotparser \
+  ${PN}-runpy \
   ${PN}-shell \
   ${PN}-smtpd \
   ${PN}-sqlite3 \
@@ -127,6 +128,7 @@ PACKAGES=" \
   ${PN}-readline \
   ${PN}-resource \
   ${PN}-robotparser \
+  ${PN}-runpy \
   ${PN}-shell \
   ${PN}-smtpd \
   ${PN}-sqlite3 \
@@ -625,6 +627,12 @@ 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=" \
@@ -809,6 +817,7 @@ RDEPENDS_${PN}-modules=" \
   ${PN}-readline \
   ${PN}-resource \
   ${PN}-robotparser \
+  ${PN}-runpy \
   ${PN}-shell \
   ${PN}-smtpd \
   ${PN}-sqlite3 \
meta/recipes-devtools/python/python-3.5-manifest.inc +21 -0
index 686b5f9842..1fce070290 100644
@@ -46,6 +46,7 @@ PROVIDES+="\
   ${PN}-numbers \
   ${PN}-pickle \
   ${PN}-pkgutil \
+  ${PN}-plistlib \
   ${PN}-pprint \
   ${PN}-profile \
   ${PN}-pydoc \
@@ -53,6 +54,7 @@ PROVIDES+="\
   ${PN}-readline \
   ${PN}-reprlib \
   ${PN}-resource \
+  ${PN}-runpy \
   ${PN}-selectors \
   ${PN}-shell \
   ${PN}-signal \
@@ -117,6 +119,7 @@ ${PN}-distutils \
   ${PN}-numbers \
   ${PN}-pickle \
   ${PN}-pkgutil \
+  ${PN}-plistlib \
   ${PN}-pprint \
   ${PN}-profile \
   ${PN}-pydoc \
@@ -124,6 +127,7 @@ ${PN}-distutils \
   ${PN}-readline \
   ${PN}-reprlib \
   ${PN}-resource \
+  ${PN}-runpy \
   ${PN}-selectors \
   ${PN}-shell \
   ${PN}-signal \
@@ -310,6 +314,7 @@ FILES_${PN}-core="\
   ${includedir}/python${PYTHON_BINABI}/pyconfig*.h \
   ${libdir}/python${PYTHON_MAJMIN}/collections \
   ${libdir}/python${PYTHON_MAJMIN}/_collections_abc.* \
+  ${libdir}/python${PYTHON_MAJMIN}/_markupbase.* \
   ${libdir}/python${PYTHON_MAJMIN}/_sitebuiltins.* \
   ${libdir}/python${PYTHON_MAJMIN}/sitecustomize.py \
 "
@@ -768,6 +773,13 @@ FILES_${PN}-pkgutil="\
   ${libdir}/python3.5/__pycache__/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}/python3.5/plistlib.* \
+  ${libdir}/python3.5/__pycache__/plistlib.* \
+"
+
 SUMMARY_${PN}-pprint="Python pretty-print support"
 RDEPENDS_${PN}-pprint="${PN}-core ${PN}-io"
 FILES_${PN}-pprint="\
@@ -836,6 +848,13 @@ FILES_${PN}-resource="\
   ${libdir}/python3.5/lib-dynload/__pycache__/resource.*.so \
 "
 
+SUMMARY_${PN}-runpy="Python script for locating/executing scripts in module namespace"
+RDEPENDS_${PN}-runpy="${PN}-core ${PN}-pkgutil"
+FILES_${PN}-runpy="\
+  ${libdir}/python3.5/runpy.* \
+  ${libdir}/python3.5/__pycache__/runpy.* \
+"
+
 SUMMARY_${PN}-selectors="Python High-level I/O multiplexing"
 RDEPENDS_${PN}-selectors="${PN}-core"
 FILES_${PN}-selectors="\
@@ -1077,6 +1096,7 @@ RDEPENDS_${PN}-modules=" \
   ${PN}-numbers \
   ${PN}-pickle \
   ${PN}-pkgutil \
+  ${PN}-plistlib \
   ${PN}-pprint \
   ${PN}-profile \
   ${PN}-pydoc \
@@ -1084,6 +1104,7 @@ RDEPENDS_${PN}-modules=" \
   ${PN}-readline \
   ${PN}-reprlib \
   ${PN}-resource \
+  ${PN}-runpy \
   ${PN}-selectors \
   ${PN}-shell \
   ${PN}-signal \
scripts/contrib/python/generate-manifest-2.7.py +3 -0
index 2491bd0bc4..ee7540399f 100755
@@ -368,6 +368,9 @@ if __name__ == "__main__":
     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.*" )
 
scripts/contrib/python/generate-manifest-3.5.py +7 -0
index 33779cffab..7dfae46992 100755
@@ -213,6 +213,7 @@ if __name__ == "__main__":
     "${includedir}/python${PYTHON_BINABI}/pyconfig*.h " +
     "${libdir}/python${PYTHON_MAJMIN}/collections " +
     "${libdir}/python${PYTHON_MAJMIN}/_collections_abc.* " +
+    "${libdir}/python${PYTHON_MAJMIN}/_markupbase.* " +
     "${libdir}/python${PYTHON_MAJMIN}/_sitebuiltins.* " +
     "${libdir}/python${PYTHON_MAJMIN}/sitecustomize.py ")
 
@@ -360,6 +361,9 @@ if __name__ == "__main__":
     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.*" )
 
@@ -378,6 +382,9 @@ if __name__ == "__main__":
     m.addPackage( "${PN}-resource", "Python resource control interface", "${PN}-core",
     "lib-dynload/resource.*.so" )
 
+    m.addPackage( "${PN}-runpy", "Python script for locating/executing scripts in module namespace", "${PN}-core ${PN}-pkgutil",
+    "runpy.*" )
+
     m.addPackage( "${PN}-selectors", "Python High-level I/O multiplexing", "${PN}-core",
     "selectors.*" )
 
Signature · 1 line
2.14.3
author
#5 lore raw

PATCH v3 4/14 python-setuptools: upgrade to 38.2.4; use pypi.bbclass; improvements

In reply to Tim Orling

* Simplify python- and python3-setuptools with pypi.bbclass
* inherit setuptools rather than distutils
* Consolidate common settings in python-setuptools.inc
- use PYTHON_PN variable to eliminate duplication
- python3-setuptools had missing RDEPENDS (e.g., plistlib)
- installer no longer creates setuptools.pth, drop fixes

---
 meta/recipes-devtools/python/python-setuptools.inc | 42 ++++++++++++++++++----
 .../python/python-setuptools_36.5.0.bb             | 38 --------------------
 .../python/python-setuptools_38.2.4.bb             |  9 +++++
 .../python/python3-setuptools_36.5.0.bb            | 38 --------------------
 .../python/python3-setuptools_38.2.4.bb            |  6 ++++
 5 files changed, 51 insertions(+), 82 deletions(-)
 delete mode 100644 meta/recipes-devtools/python/python-setuptools_36.5.0.bb
 create mode 100644 meta/recipes-devtools/python/python-setuptools_38.2.4.bb
 delete mode 100644 meta/recipes-devtools/python/python3-setuptools_36.5.0.bb
 create mode 100644 meta/recipes-devtools/python/python3-setuptools_38.2.4.bb
meta/recipes-devtools/python/python-setuptools.inc +36 -6
index 1eae0b6174..d28a60c456 100644
@@ -5,17 +5,47 @@ LICENSE = "MIT"
 
 LIC_FILES_CHKSUM = "file://LICENSE;beginline=1;endline=19;md5=9a33897f1bca1160d7aad3835152e158"
 
-SRCNAME = "setuptools"
+PYPI_PACKAGE_EXT = "zip"
 
-SRC_URI = "https://files.pythonhosted.org/packages/source/s/${SRCNAME}/${SRCNAME}-${PV}.zip"
+inherit pypi
 
-SRC_URI[md5sum] = "704f500dd55f4bd0be905444f3ba892c"
-SRC_URI[sha256sum] = "ce2007c1cea3359870b80657d634253a0765b0c7dc5a988d77ba803fc86f2c64"
+SRC_URI[md5sum] = "e8e05d4f8162c9341e1089c80f742f64"
+SRC_URI[sha256sum] = "9c671a6291a5b1171fb9da81665eb4f9625c7dbddc613d82abdc6002a4bce896"
 
-UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/setuptools"
+DEPENDS += "${PYTHON_PN}"
+DEPENDS_class-native += "${PYTHON_PN}-native"
+DEPENDS_class-nativesdk += "nativesdk-${PYTHON_PN}"
 
-S = "${WORKDIR}/${SRCNAME}-${PV}"
+DISTUTILS_INSTALL_ARGS += "--install-lib=${D}${PYTHON_SITEPACKAGES_DIR} \
+                           --script-dir=${bindir}"
+
+RDEPENDS_${PN}_class-native = "\
+  ${PYTHON_PN}-distutils \
+  ${PYTHON_PN}-compression \
+"
+RDEPENDS_${PN} = "\
+  ${PYTHON_PN}-compile \
+  ${PYTHON_PN}-compression \
+  ${PYTHON_PN}-ctypes \
+  ${PYTHON_PN}-distutils \
+  ${PYTHON_PN}-email \
+  ${PYTHON_PN}-html \
+  ${PYTHON_PN}-importlib \
+  ${PYTHON_PN}-netserver \
+  ${PYTHON_PN}-numbers \
+  ${PYTHON_PN}-pkgutil \
+  ${PYTHON_PN}-plistlib \
+  ${PYTHON_PN}-shell \
+  ${PYTHON_PN}-subprocess \
+  ${PYTHON_PN}-stringold \
+  ${PYTHON_PN}-textutils \
+  ${PYTHON_PN}-threading \
+  ${PYTHON_PN}-unittest \
+  ${PYTHON_PN}-xml \
+"
 
 do_install_prepend() {
     install -d ${D}${PYTHON_SITEPACKAGES_DIR}
 }
+
+BBCLASSEXTEND = "native nativesdk"
meta/recipes-devtools/python/python-setuptools_36.5.0.bb deleted +0 -38
deleted file mode 100644
index 526474c7ea..0000000000
@@ -1,38 +0,0 @@
-require python-setuptools.inc
-
-PROVIDES = "python-distribute"
-
-DEPENDS += "python"
-DEPENDS_class-native += "python-native"
-
-inherit distutils
-
-DISTUTILS_INSTALL_ARGS += "--install-lib=${D}${PYTHON_SITEPACKAGES_DIR}"
-
-RDEPENDS_${PN} = "\
-  python-stringold \
-  python-email \
-  python-shell \
-  python-distutils \
-  python-compression \
-  python-pkgutil \
-  python-plistlib \
-  python-numbers \
-  python-html \
-  python-netserver \
-  python-ctypes \
-  python-subprocess \
-  python-unittest \
-  python-compile \
-"
-
-RDEPENDS_${PN}_class-native = "\
-  python-distutils \
-  python-compression \
-"
-
-RREPLACES_${PN} = "python-distribute"
-RPROVIDES_${PN} = "python-distribute"
-RCONFLICTS_${PN} = "python-distribute"
-
-BBCLASSEXTEND = "native nativesdk"
meta/recipes-devtools/python/python-setuptools_38.2.4.bb new file +9 -0
new file mode 100644
index 0000000000..cf9440495b
@@ -0,0 +1,9 @@
+require python-setuptools.inc
+
+PROVIDES = "python-distribute"
+
+inherit setuptools
+
+RREPLACES_${PN} = "python-distribute"
+RPROVIDES_${PN} = "python-distribute"
+RCONFLICTS_${PN} = "python-distribute"
meta/recipes-devtools/python/python3-setuptools_36.5.0.bb deleted +0 -38
deleted file mode 100644
index 63f241809e..0000000000
@@ -1,38 +0,0 @@
-require python-setuptools.inc
-
-DEPENDS += "python3"
-DEPENDS_class-native += "python3-native"
-DEPENDS_class-nativesdk += "nativesdk-python3"
-
-inherit distutils3
-
-DISTUTILS_INSTALL_ARGS += "--install-lib=${D}${PYTHON_SITEPACKAGES_DIR}"
-
-# The installer puts the wrong path in the setuptools.pth file.  Correct it.
-do_install_append() {
-    rm ${D}${PYTHON_SITEPACKAGES_DIR}/setuptools.pth
-    mv ${D}${bindir}/easy_install ${D}${bindir}/easy3_install
-    echo "./${SRCNAME}-${PV}-py${PYTHON_BASEVERSION}.egg" > ${D}${PYTHON_SITEPACKAGES_DIR}/setuptools.pth
-}
-
-RDEPENDS_${PN}_class-native = "\
-  python3-distutils \
-  python3-compression \
-"
-RDEPENDS_${PN} = "\
-  python3-ctypes \
-  python3-distutils \
-  python3-email \
-  python3-importlib \
-  python3-numbers \
-  python3-compression \
-  python3-shell \
-  python3-subprocess \
-  python3-textutils \
-  python3-pkgutil \
-  python3-threading \
-  python3-misc \
-  python3-unittest \
-  python3-xml \
-"
-BBCLASSEXTEND = "native nativesdk"
meta/recipes-devtools/python/python3-setuptools_38.2.4.bb new file +6 -0
new file mode 100644
index 0000000000..0dc1ed8622
@@ -0,0 +1,6 @@
+require python-setuptools.inc
+inherit setuptools3
+
+do_install_append() {
+    mv ${D}${bindir}/easy_install ${D}${bindir}/easy3_install
+}
Signature · 1 line
2.14.3
author
#6 lore raw

PATCH v3 5/14 python3-pip: use pypi.bbclass

In reply to Tim Orling

* Simplify recipe by using pypi.bbclass

---
 meta/recipes-devtools/python/python3-pip_9.0.1.bb | 13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)
meta/recipes-devtools/python/python3-pip_9.0.1.bb +3 -10
index 9b907a2631..4ce13da410 100644
@@ -1,22 +1,15 @@
 SUMMARY = "The PyPA recommended tool for installing Python packages"
-sHOMEPAGEsss = "https://pypi.python.org/pypi/pip"
+HOMEPAGE = "https://pypi.python.org/pypi/pip"
 SECTION = "devel/python"
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=25fba45109565f87de20bae85bc39452"
 
-SRCNAME = "pip"
 DEPENDS += "python3 python3-setuptools-native"
 
-SRC_URI = "https://files.pythonhosted.org/packages/source/p/${SRCNAME}/${SRCNAME}-${PV}.tar.gz"
-
 SRC_URI[md5sum] = "35f01da33009719497f01a4ba69d63c9"
 SRC_URI[sha256sum] = "09f243e1a7b461f654c26a725fa373211bb7ff17a9300058b205c61658ca940d"
 
-UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/pip"
-
-S = "${WORKDIR}/${SRCNAME}-${PV}"
-
-inherit distutils3
+inherit pypi distutils3
 
 DISTUTILS_INSTALL_ARGS += "--install-lib=${D}${PYTHON_SITEPACKAGES_DIR}"
 
@@ -33,7 +26,7 @@ do_install_append() {
     rm ${D}/${bindir}/pip
 
     # Installed eggs need to be passed directly to the interpreter via a pth file
-    echo "./${SRCNAME}-${PV}-py${PYTHON_BASEVERSION}.egg" > ${D}${PYTHON_SITEPACKAGES_DIR}/${SRCNAME}-${PV}.pth
+    echo "./${PYPI_PACKAGE}-${PV}-py${PYTHON_BASEVERSION}.egg" > ${D}${PYTHON_SITEPACKAGES_DIR}/${PYPI_PACKAGE}-${PV}.pth
 
     # Make sure we use /usr/bin/env python3
     for PYTHSCRIPT in `grep -rIl ${bindir} ${D}${bindir}/pip3*`; do
Signature · 1 line
2.14.3
author
#7 lore raw

PATCH v3 6/14 python-nose: use pypi.bbclass

In reply to Tim Orling

* Simplify python- and python3-nose by using pypi.bbclass
* Consolidate common content in python-nose.inc
- Avoid duplication by using PYTHON_PN variable

---
 meta/recipes-devtools/python/python-nose.inc       | 18 ++++++++++++++++
 meta/recipes-devtools/python/python-nose_1.3.7.bb  | 25 +---------------------
 meta/recipes-devtools/python/python3-nose_1.3.7.bb | 24 +--------------------
 3 files changed, 20 insertions(+), 47 deletions(-)
 create mode 100644 meta/recipes-devtools/python/python-nose.inc
meta/recipes-devtools/python/python-nose.inc new file +18 -0
new file mode 100644
index 0000000000..ccec68a0e1
@@ -0,0 +1,18 @@
+SUMMARY = "Extends Python unittest to make testing easier"
+HOMEPAGE = "http://readthedocs.org/docs/nose/"
+DESCRIPTION = "nose extends the test loading and running features of unittest, \
+making it easier to write, find and run tests."
+SECTION = "devel/python"
+LICENSE = "LGPLv2.1"
+LIC_FILES_CHKSUM = "file://lgpl.txt;md5=a6f89e2100d9b6cdffcea4f398e37343"
+
+SRC_URI[md5sum] = "4d3ad0ff07b61373d2cefc89c5d0b20b"
+SRC_URI[sha256sum] = "f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98"
+
+inherit pypi
+
+RDEPENDS_${PN} = "\
+  ${PYTHON_PN}-unittest \
+  "
+
+BBCLASSEXTEND = "native nativesdk"
meta/recipes-devtools/python/python-nose_1.3.7.bb +1 -24
index 9b3509cafb..6d69d2d62e 100644
@@ -1,25 +1,2 @@
-SUMMARY = "Extends Python unittest to make testing easier"
-HOMEPAGE = "http://readthedocs.org/docs/nose/"
-DESCRIPTION = "nose extends the test loading and running features of unittest, \
-making it easier to write, find and run tests."
-SECTION = "devel/python"
-LICENSE = "LGPLv2.1"
-LIC_FILES_CHKSUM = "file://lgpl.txt;md5=a6f89e2100d9b6cdffcea4f398e37343"
-
-SRC_URI = "https://files.pythonhosted.org/packages/source/n/nose/nose-${PV}.tar.gz"
-
-SRC_URI[md5sum] = "4d3ad0ff07b61373d2cefc89c5d0b20b"
-SRC_URI[sha256sum] = "f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98"
-
-UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/nose/"
-UPSTREAM_CHECK_REGEX = "/nose/(?P<pver>(\d+[\.\-_]*)+)"
-
-S = "${WORKDIR}/nose-${PV}"
-
 inherit setuptools
-
-RDEPENDS_${PN} = "\
-  python-unittest \
-  "
-
-BBCLASSEXTEND = "native nativesdk"
+require python-nose.inc
meta/recipes-devtools/python/python3-nose_1.3.7.bb +1 -23
index 1e2ff74f57..8bc1f49835 100644
@@ -1,28 +1,6 @@
-SUMMARY = "Extends Python unittest to make testing easier"
-DESCRIPTION = "nose extends the test loading and running features of unittest, \
-making it easier to write, find and run tests."
-SECTION = "devel/python"
-LICENSE = "LGPLv2.1"
-LIC_FILES_CHKSUM = "file://lgpl.txt;md5=a6f89e2100d9b6cdffcea4f398e37343"
-
-SRC_URI = "https://files.pythonhosted.org/packages/source/n/nose/nose-${PV}.tar.gz"
-
-SRC_URI[md5sum] = "4d3ad0ff07b61373d2cefc89c5d0b20b"
-SRC_URI[sha256sum] = "f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98"
-
-UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/nose/"
-UPSTREAM_CHECK_REGEX = "/nose/(?P<pver>(\d+[\.\-_]*)+)"
-
-S = "${WORKDIR}/nose-${PV}"
-
 inherit setuptools3
+require python-nose.inc
 
 do_install_append() {
     mv ${D}${bindir}/nosetests ${D}${bindir}/nosetests3
 }
-
-RDEPENDS_${PN}_class-target = "\
-  python3-unittest \
-  "
-
-BBCLASSEXTEND = "native nativesdk"
Signature · 1 line
2.14.3
author
#13 lore raw

PATCH v3 12/14 python-git: use pypi.bbclass

In reply to Tim Orling

* Simplify python3-git by using pypi.bbclass
* Consolidate common content in .inc

---
 meta/recipes-devtools/python/python-git.inc       | 26 ++++++++++++++++++-----
 meta/recipes-devtools/python/python3-git_2.1.7.bb |  5 -----
 2 files changed, 21 insertions(+), 10 deletions(-)
meta/recipes-devtools/python/python-git.inc +21 -5
index 0b7e44ac0c..7b0707e008 100644
@@ -8,14 +8,30 @@ SECTION = "devel/python"
 LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=8b8d26c37c1d5a04f9b0186edbebc183"
 
-SRC_URI = "https://files.pythonhosted.org/packages/source/G/GitPython/GitPython-${PV}.tar.gz"
+PYPI_PACKAGE = "GitPython"
+
+inherit pypi
 
 SRC_URI[md5sum] = "a63fdd2a650694ea23e268fd0c952034"
 SRC_URI[sha256sum] = "13c7cd99c2bf277fc99accfc25148752fa90e7cc6c6d08a3f01d229dacb461d9"
 
-UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/GitPython/"
-UPSTREAM_CHECK_REGEX = "/GitPython/(?P<pver>(\d+[\.\-_]*)+)"
-
-S = "${WORKDIR}/GitPython-${PV}"
+DEPENDS = "${PYTHON_PN}-gitdb"
 
+RDEPENDS_${PN} += "${PYTHON_PN}-argparse \
+                   ${PYTHON_PN}-datetime \
+                   ${PYTHON_PN}-enum \
+                   ${PYTHON_PN}-gitdb \
+                   ${PYTHON_PN}-io \
+                   ${PYTHON_PN}-lang \
+                   ${PYTHON_PN}-logging \
+                   ${PYTHON_PN}-math \
+                   ${PYTHON_PN}-netclient \
+                   ${PYTHON_PN}-re \
+                   ${PYTHON_PN}-shell \
+                   ${PYTHON_PN}-stringold \
+                   ${PYTHON_PN}-subprocess \
+                   ${PYTHON_PN}-unittest \
+                   ${PYTHON_PN}-unixadmin \
+                   git \
+"
 BBCLASSEXTEND = "nativesdk"
meta/recipes-devtools/python/python3-git_2.1.7.bb +0 -5
index 4ac2a0ec79..ac320fa56b 100644
@@ -1,7 +1,2 @@
 require python-git.inc
-
-DEPENDS = "python3-gitdb"
-
 inherit setuptools3
-
-RDEPENDS_${PN} += "python3-gitdb python3-lang python3-io python3-shell python3-math python3-re python3-subprocess python3-stringold python3-unixadmin python3-enum python3-logging python3-datetime python3-netclient python3-unittest python3-argparse git"
Signature · 1 line
2.14.3
author
#14 lore raw

PATCH v3 13/14 python3-iniparse: use pypi.bbclass

In reply to Tim Orling

* Simplify recipe by using pypi.bbclass

---
 meta/recipes-devtools/python/python3-iniparse_0.4.bb | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)
meta/recipes-devtools/python/python3-iniparse_0.4.bb +3 -6
index f51ce647c9..4eba9ecd34 100644
@@ -4,17 +4,14 @@ LICENSE = "MIT & PSF"
 LIC_FILES_CHKSUM = "file://LICENSE-PSF;md5=1c78a5bb3584b353496d5f6f34edb4b2 \
                     file://LICENSE;md5=52f28065af11d69382693b45b5a8eb54"
 
-SRC_URI = "https://files.pythonhosted.org/packages/source/i/iniparse/iniparse-${PV}.tar.gz \
-           file://0001-Add-python-3-compatibility.patch "
+SRC_URI = "file://0001-Add-python-3-compatibility.patch "
+
 SRC_URI[md5sum] = "5e573e9e9733d97623881ce9bbe5eca6"
 SRC_URI[sha256sum] = "abc1ee12d2cfb2506109072d6c21e40b6c75a3fe90a9c924327d80bc0d99c054"
-UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/iniparse/"
 
-inherit distutils3
+inherit pypi distutils3
 
 RDEPENDS_${PN} += "python3-core python3-six"
 DEPENDS += "python3-six"
 
 BBCLASSEXTEND = "native nativesdk"
-
-S = "${WORKDIR}/iniparse-${PV}"
Signature · 1 line
2.14.3
author
#15 lore raw

PATCH v3 14/14 python-scons: upgrade to v3.0.1; use pypi.bbclass

In reply to Tim Orling

* Simplify recipe by using pypi.bbclass
* Drop patch for __future__ print_function
- fixed upstream:
https://github.com/SConsProject/scons/pull/1/commits/4c199d06e76afb9379e76942d0f68caa57f42509

---
 ...ative_3.0.0.bb => python-scons-native_3.0.1.bb} |  0
 ...onscript-Support-python2-print-statements.patch | 38 ----------------------
 ...python-scons_3.0.0.bb => python-scons_3.0.1.bb} | 12 ++-----
 3 files changed, 3 insertions(+), 47 deletions(-)
 rename meta/recipes-devtools/python/{python-scons-native_3.0.0.bb => python-scons-native_3.0.1.bb} (100%)
 delete mode 100644 meta/recipes-devtools/python/python-scons/SConscript-Support-python2-print-statements.patch
 rename meta/recipes-devtools/python/{python-scons_3.0.0.bb => python-scons_3.0.1.bb} (54%)
meta/recipes-devtools/python/python-scons-native_3.0.1.bb renamed from meta/recipes-devtools/python/python-scons-native_3.0.0.bb +0 -0
similarity index 100%
rename from meta/recipes-devtools/python/python-scons-native_3.0.0.bb
rename to meta/recipes-devtools/python/python-scons-native_3.0.1.bb
meta/recipes-devtools/python/python-scons/SConscript-Support-python2-print-statements.patch deleted +0 -38
deleted file mode 100644
index b1a790219e..0000000000
@@ -1,38 +0,0 @@
-From 885aabdb313685405737112dcb7d7774eee6d879 Mon Sep 17 00:00:00 2001
-From: Thomas Berg <[email protected]>
-Date: Thu, 19 Oct 2017 14:02:21 -0500
-Subject: [PATCH] SConscript: Support python2 print statements
-
-This fixes a regression introduced in scons-3.0.0, where
-SConscripts containing python 2 print statements would cause
-syntax errors even when executing scons with python 2.7.
-
-This ensures backward compatibility, allowing users to build
-legacy code with scons-3.0.0 without having to patch it.
-
-Taken from
-https://github.com/SConsProject/scons/commit/2e0de3c55f22b3eaa7767b69740b898f3d2f46bf
-
-Upstream-Status: Accepted
-
-Signed-off-by: Jose Lamego <[email protected]>
----
- engine/SCons/Script/SConscript.py | 2 --
- 1 file changed, 2 deletions(-)
-
-diff --git a/engine/SCons/Script/SConscript.py b/engine/SCons/Script/SConscript.py
-index bc05540..332d1fa 100644
---- a/engine/SCons/Script/SConscript.py
-+++ b/engine/SCons/Script/SConscript.py
-@@ -5,8 +5,6 @@ files.
- 
- """
- 
--from __future__ import print_function
--
- #
- # Copyright (c) 2001 - 2017 The SCons Foundation
- #
--- 
-2.7.4
-
meta/recipes-devtools/python/python-scons_3.0.1.bb renamed from meta/recipes-devtools/python/python-scons_3.0.0.bb +3 -9
similarity index 54%
rename from meta/recipes-devtools/python/python-scons_3.0.0.bb
rename to meta/recipes-devtools/python/python-scons_3.0.1.bb
index 8fe74f4b3c..2f75b08d25 100644
@@ -2,20 +2,14 @@ SUMMARY = "Software Construction tool (make/autotools replacement)"
 SECTION = "devel/python"
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=46ddf66004e5be5566367cb525a66fc6"
-SRCNAME = "scons"
 
-SRC_URI = "https://files.pythonhosted.org/packages/source/s/${SRCNAME}/${SRCNAME}-${PV}.tar.gz \
-           file://SConscript-Support-python2-print-statements.patch"
-
-SRC_URI[md5sum] = "7ca558edaaa1942fe38f3105ca2400fb"
-SRC_URI[sha256sum] = "aa5afb33c2bbd33c311e47e912412195739e9ffb2e933534a31f85fba8f3470e"
+SRC_URI[md5sum] = "b6a292e251b34b82c203b56cfa3968b3"
+SRC_URI[sha256sum] = "24475e38d39c19683bc88054524df018fe6949d70fbd4c69e298d39a0269f173"
 
 UPSTREAM_CHECK_URI = "http://scons.org/pages/download.html"
 UPSTREAM_CHECK_REGEX = "(?P<pver>\d+(\.\d+)+)\.tar"
 
-S = "${WORKDIR}/${SRCNAME}-${PV}"
-
-inherit setuptools
+inherit pypi setuptools
 
 RDEPENDS_${PN} = "\
   python-fcntl \
Signature · 1 line
2.14.3
author
#2 lore raw

Re: [PATCH v3 01/14] pypi.bbclass: bring in from meta-python

In reply to Tim Orling

Moments after hitting send, I realized this was missing the documentation strings from v1. I have added that change in the contrib git repo, but will not bother resending the patch via email. This series must be applied from git regardless, due to the long lines in the old manifest files which break git send-email.

Quoted 52 lines · Tim Orling

The pypi.bbclass has usefullness in many meta layers, not just meta-python. Add it to oe-core for the benefit of everyone.

---
meta/classes/pypi.bbclass | 26 ++++++++++++++++++++++++++

1 file changed, 26 insertions(+)

create mode 100644 meta/classes/pypi.bbclass

meta/classes/pypi.bbclass new file +26 -0
new file mode 100644
index 0000000000..e5d7ab3ce1
@@ -0,0 +1,26 @@
+def pypi_package(d):
+    bpn = d.getVar('BPN')
+    if bpn.startswith('python-'):
+        return bpn[7:]
+    elif bpn.startswith('python3-'):
+        return bpn[8:]
+    return bpn
+
+PYPI_PACKAGE ?= "${@pypi_package(d)}"
+PYPI_PACKAGE_EXT ?= "tar.gz"
+
+def pypi_src_uri(d):
+    package = d.getVar('PYPI_PACKAGE')
+    package_ext = d.getVar('PYPI_PACKAGE_EXT')
+    pv = d.getVar('PV')
+    return 'https://files.pythonhosted.org/packages/source/%s/%s/%s-%s.%s' % (package[0], package, package, pv, package_ext)
+
+PYPI_SRC_URI ?= "${@pypi_src_uri(d)}"
+
+HOMEPAGE ?= "https://pypi.python.org/pypi/${PYPI_PACKAGE}/"
+SECTION = "devel/python"
+SRC_URI += "${PYPI_SRC_URI}"
+S = "${WORKDIR}/${PYPI_PACKAGE}-${PV}"
+
+UPSTREAM_CHECK_URI ?= "https://pypi.python.org/pypi/${PYPI_PACKAGE}/"
+UPSTREAM_CHECK_REGEX ?= "/${PYPI_PACKAGE}/(?P<pver>(\d+[\.\-_]*)+)"
Signature · 7 lines
2.14.3

-- 
_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.openembedded.org/mailman/listinfo/openembedded-core
#16 lore raw

✗ patchtest: failure for python improvements (rev2)

In reply to Tim Orling

== Series Details ==

Series: python improvements (rev2)
Revision: 2
URL : https://patchwork.openembedded.org/series/10133/
State : failure

== Summary ==

Thank you for submitting this patch series to OpenEmbedded Core. This is an automated response. Several tests have been executed on the proposed series by patchtest resulting in the following failures:

* Issue Series cannot be parsed correctly due to malformed diff lines [test_mbox_format]
Suggested fix Create the series again using git-format-patch and ensure it can be applied using git am
Diff line diff --git a/scripts/contrib/python/generate-manifest-2.7.py b/scripts/contrib/python/generate-manifest-2.7.py

* Issue Series does not apply on top of target branch [test_series_merge_on_head]
Suggested fix Rebase your series on top of targeted branch
Targeted branch master (currently at a24c10b7bd)

If you believe any of these test results are incorrect, please reply to the mailing list ([email protected]) raising your concerns. Otherwise we would appreciate you correcting the issues and submitting a new version of the patchset if applicable. Please ensure you add/increment the version number when sending the new version (i.e. [PATCH] -> [PATCH v2] -> [PATCH v3] -> ...).

---

Guidelines:     https://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines
Test framework: http://git.yoctoproject.org/cgit/cgit.cgi/patchtest
Test suite:     http://git.yoctoproject.org/cgit/cgit.cgi/patchtest-oe