summaryrefslogtreecommitdiffstats
path: root/external/meta-python2
diff options
context:
space:
mode:
Diffstat (limited to 'external/meta-python2')
-rw-r--r--external/meta-python2/.gitlab-ci.yml13
-rw-r--r--external/meta-python2/COPYING.MIT17
-rw-r--r--external/meta-python2/Pipfile12
-rw-r--r--external/meta-python2/Pipfile.lock102
-rw-r--r--external/meta-python2/README111
-rw-r--r--external/meta-python2/classes/bandit.bbclass63
-rw-r--r--external/meta-python2/classes/distutils-base.bbclass4
-rw-r--r--external/meta-python2/classes/distutils.bbclass87
-rw-r--r--external/meta-python2/classes/python-backports-init.bbclass7
-rw-r--r--external/meta-python2/classes/python-dir.bbclass5
-rw-r--r--external/meta-python2/classes/pythonnative.bbclass27
-rw-r--r--external/meta-python2/classes/setuptools.bbclass3
-rw-r--r--external/meta-python2/conf/layer.conf19
-rw-r--r--external/meta-python2/kas-meta-python2-image-base.yml26
-rw-r--r--external/meta-python2/kas-meta-python2-image.yml8
-rw-r--r--external/meta-python2/kas-meta-python2-ptest-image.yml22
-rw-r--r--external/meta-python2/lib/oeqa/runtime/cases/python2.py20
-rw-r--r--external/meta-python2/licenses/LLNL16
-rw-r--r--external/meta-python2/licenses/Unicode37
-rw-r--r--external/meta-python2/recipes-connectivity/gateone/gateone/80oe.conf.in24
-rw-r--r--external/meta-python2/recipes-connectivity/gateone/gateone/gateone-avahi.service10
-rw-r--r--external/meta-python2/recipes-connectivity/gateone/gateone/gateone-init.in47
-rw-r--r--external/meta-python2/recipes-connectivity/gateone/gateone/gateone.service.in10
-rw-r--r--external/meta-python2/recipes-connectivity/gateone/gateone_git.bb85
-rw-r--r--external/meta-python2/recipes-connectivity/python-gsocketpool/python-gsocketpool_0.1.6.bb13
-rw-r--r--external/meta-python2/recipes-connectivity/python-h2/python-h2_3.1.1.bb11
-rw-r--r--external/meta-python2/recipes-connectivity/python-hpack/python-hpack_3.0.0.bb10
-rw-r--r--external/meta-python2/recipes-connectivity/python-hyperframe/python-hyperframe_5.2.0.bb10
-rw-r--r--external/meta-python2/recipes-connectivity/python-mprpc/python-mprpc_0.1.17.bb14
-rw-r--r--external/meta-python2/recipes-connectivity/python-networkmanager/python-networkmanager_2.1.bb18
-rw-r--r--external/meta-python2/recipes-connectivity/python-priority/python-priority_1.3.0.bb10
-rw-r--r--external/meta-python2/recipes-connectivity/python-pyconnman/python-pyconnman_0.2.0.bb19
-rw-r--r--external/meta-python2/recipes-connectivity/python-pyro4/python-pyro4_4.77.bb18
-rw-r--r--external/meta-python2/recipes-connectivity/python-pytun/python-pytun_2.3.0.bb11
-rw-r--r--external/meta-python2/recipes-connectivity/python-thrift/python-thrift_0.13.0.bb18
-rw-r--r--external/meta-python2/recipes-connectivity/python-txws/python-txws_0.9.1.bb15
-rw-r--r--external/meta-python2/recipes-connectivity/telepathy/telepathy-python-0.15.19/parallel_make.patch43
-rw-r--r--external/meta-python2/recipes-connectivity/telepathy/telepathy-python-0.15.19/remove_duplicate_install.patch26
-rw-r--r--external/meta-python2/recipes-connectivity/telepathy/telepathy-python-0.15.19/telepathy-python_fix_for_automake_1.12.patch26
-rw-r--r--external/meta-python2/recipes-connectivity/telepathy/telepathy-python_0.15.19.bb32
-rw-r--r--external/meta-python2/recipes-core/images/meta-python2-image-base.bb7
-rw-r--r--external/meta-python2/recipes-core/images/meta-python2-image.bb5
-rw-r--r--external/meta-python2/recipes-core/images/meta-python2-ptest-image.bb5
-rw-r--r--external/meta-python2/recipes-core/packagegroups/packagegroup-meta-python2.bb91
-rw-r--r--external/meta-python2/recipes-devtools/gyp/gyp-py2_git.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-alembic_1.3.2.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-anyjson_0.3.3.bb13
-rw-r--r--external/meta-python2/recipes-devtools/python/python-appdirs_1.4.3.bb13
-rw-r--r--external/meta-python2/recipes-devtools/python/python-asn1crypto_1.3.0.bb30
-rw-r--r--external/meta-python2/recipes-devtools/python/python-astroid_2.3.3.bb50
-rw-r--r--external/meta-python2/recipes-devtools/python/python-atomicwrites_1.3.0.bb12
-rw-r--r--external/meta-python2/recipes-devtools/python/python-attr_0.3.1.bb12
-rw-r--r--external/meta-python2/recipes-devtools/python/python-attrs_19.3.0.bb26
-rw-r--r--external/meta-python2/recipes-devtools/python/python-automat/0001-setup.py-remove-the-dependency-on-m2r.patch50
-rw-r--r--external/meta-python2/recipes-devtools/python/python-automat_0.8.0.bb28
-rw-r--r--external/meta-python2/recipes-devtools/python/python-aws-iot-device-sdk-python_1.4.7.bb46
-rw-r--r--external/meta-python2/recipes-devtools/python/python-babel_2.7.0.bb31
-rw-r--r--external/meta-python2/recipes-devtools/python/python-backports-abc_0.5.bb11
-rw-r--r--external/meta-python2/recipes-devtools/python/python-backports-functools-lru-cache_1.6.1.bb29
-rw-r--r--external/meta-python2/recipes-devtools/python/python-backports-init/backports/__init__.py5
-rw-r--r--external/meta-python2/recipes-devtools/python/python-backports-init_1.0.bb27
-rw-r--r--external/meta-python2/recipes-devtools/python/python-backports-ssl_3.7.0.1.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-bcrypt_3.1.7.bb22
-rw-r--r--external/meta-python2/recipes-devtools/python/python-beautifulsoup4_4.8.2.bb27
-rw-r--r--external/meta-python2/recipes-devtools/python/python-behave_1.2.6.bb25
-rw-r--r--external/meta-python2/recipes-devtools/python/python-bitarray_1.2.1.bb22
-rw-r--r--external/meta-python2/recipes-devtools/python/python-blinker_1.4.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-booleanpy/run-ptest2
-rw-r--r--external/meta-python2/recipes-devtools/python/python-booleanpy_3.7.bb31
-rw-r--r--external/meta-python2/recipes-devtools/python/python-cachetools_3.1.1.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-can_3.3.2.bb29
-rw-r--r--external/meta-python2/recipes-devtools/python/python-certifi_2019.11.28.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-cffi_1.13.2.bb26
-rw-r--r--external/meta-python2/recipes-devtools/python/python-chardet_3.0.4.bb31
-rw-r--r--external/meta-python2/recipes-devtools/python/python-cheetah_2.4.4.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-click_7.0.bb30
-rw-r--r--external/meta-python2/recipes-devtools/python/python-cmd2_0.8.9.bb33
-rw-r--r--external/meta-python2/recipes-devtools/python/python-coloredlogs_10.0.bb32
-rw-r--r--external/meta-python2/recipes-devtools/python/python-configargparse_0.15.1.bb26
-rw-r--r--external/meta-python2/recipes-devtools/python/python-configparser_3.8.1.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-constantly_15.1.0.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-contextlib2_0.6.0.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-cpuset_1.6.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-crcmod_1.7.bb21
-rw-r--r--external/meta-python2/recipes-devtools/python/python-cryptography-vectors_2.8.bb25
-rw-r--r--external/meta-python2/recipes-devtools/python/python-cryptography/run-ptest2
-rw-r--r--external/meta-python2/recipes-devtools/python/python-cryptography_2.8.bb87
-rw-r--r--external/meta-python2/recipes-devtools/python/python-cython_0.29.14.bb50
-rw-r--r--external/meta-python2/recipes-devtools/python/python-daemon/0001-Workaround-for-issue-2-1.patch31
-rw-r--r--external/meta-python2/recipes-devtools/python/python-daemon_2.1.2.bb27
-rw-r--r--external/meta-python2/recipes-devtools/python/python-daemonize_2.5.0.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-dateutil_2.8.1.bb29
-rw-r--r--external/meta-python2/recipes-devtools/python/python-dbus_1.2.14.bb32
-rw-r--r--external/meta-python2/recipes-devtools/python/python-dbusmock/0001-Add-functionality-to-add-own-objects-to-internal-obj.patch52
-rw-r--r--external/meta-python2/recipes-devtools/python/python-dbusmock/0002-Add-possibility-to-import-templates-from-packages.patch27
-rw-r--r--external/meta-python2/recipes-devtools/python/python-dbusmock_0.16.7.bb25
-rw-r--r--external/meta-python2/recipes-devtools/python/python-decorator_4.4.1.bb21
-rw-r--r--external/meta-python2/recipes-devtools/python/python-deprecated_1.2.7.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-distutils-extra_2.39.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-django-south_1.0.2.bb20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-django_1.11.26.bb42
-rw-r--r--external/meta-python2/recipes-devtools/python/python-djangorestframework_3.9.0.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-dnspython_1.16.0.bb29
-rw-r--r--external/meta-python2/recipes-devtools/python/python-docker-pycreds_0.4.0.bb9
-rw-r--r--external/meta-python2/recipes-devtools/python/python-docker_4.2.0.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-docutils_0.15.2.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-dominate_2.4.0.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-editor_1.0.4.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-engineio_3.11.2.bb24
-rw-r--r--external/meta-python2/recipes-devtools/python/python-enum34_1.1.6.bb11
-rw-r--r--external/meta-python2/recipes-devtools/python/python-epydoc_3.0.1.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-evdev/0001-Fix-build-on-32bit-arches-with-64bit-time_t.patch83
-rw-r--r--external/meta-python2/recipes-devtools/python/python-evdev_1.2.0.bb27
-rw-r--r--external/meta-python2/recipes-devtools/python/python-feedformatter_0.4.bb25
-rw-r--r--external/meta-python2/recipes-devtools/python/python-feedparser_5.2.1.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-babel_0.12.2.bb21
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-bcrypt_0.7.1.bb12
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-bootstrap_3.3.7.1.bb21
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-login_0.4.1.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-mail_0.9.1.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-migrate_2.5.2.bb20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-nav_0.6.bb20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-navigation_0.2.0.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-pymongo_2.3.0.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-restful_0.3.7.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-script_2.0.6.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-sijax_0.4.1.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-socketio_4.2.1.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-sqlalchemy_2.4.1.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-uploads_0.2.1.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-user_0.6.19.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-wtf_0.14.2.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch7
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask-xstatic_0.0.1.bb25
-rw-r--r--external/meta-python2/recipes-devtools/python/python-flask_1.1.1.bb23
-rw-r--r--external/meta-python2/recipes-devtools/python/python-funcsigs_1.0.2.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-functools32_3.2.3-2.bb10
-rw-r--r--external/meta-python2/recipes-devtools/python/python-future_0.18.2.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-futures_3.3.0.bb13
-rw-r--r--external/meta-python2/recipes-devtools/python/python-gdata_2.0.18.bb21
-rw-r--r--external/meta-python2/recipes-devtools/python/python-gevent/0002-setup.py-do-not-query-for-include-dir.patch26
-rw-r--r--external/meta-python2/recipes-devtools/python/python-gevent/libev-conf.patch26
-rw-r--r--external/meta-python2/recipes-devtools/python/python-gevent_1.4.0.bb40
-rw-r--r--external/meta-python2/recipes-devtools/python/python-greenlet_0.4.15.bb9
-rw-r--r--external/meta-python2/recipes-devtools/python/python-grpcio-tools_1.14.1.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-grpcio/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch64
-rw-r--r--external/meta-python2/recipes-devtools/python/python-grpcio/ppc-boringssl-support.patch17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-grpcio/riscv64_support.patch16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-grpcio_1.27.1.bb31
-rw-r--r--external/meta-python2/recipes-devtools/python/python-html5lib_1.0.1.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-humanfriendly_4.18.bb29
-rw-r--r--external/meta-python2/recipes-devtools/python/python-humanize_0.5.1.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-hyperlink_19.0.0.bb22
-rw-r--r--external/meta-python2/recipes-devtools/python/python-hypothesis_4.50.2.bb22
-rw-r--r--external/meta-python2/recipes-devtools/python/python-idna_2.8.bb20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-imaging/0001-python-imaging-setup.py-force-paths-for-zlib-freetyp.patch55
-rw-r--r--external/meta-python2/recipes-devtools/python/python-imaging/allow.to.disable.some.features.patch65
-rw-r--r--external/meta-python2/recipes-devtools/python/python-imaging/fix-freetype-includes.patch30
-rw-r--r--external/meta-python2/recipes-devtools/python/python-imaging/python-imaging-CVE-2016-2533.patch38
-rw-r--r--external/meta-python2/recipes-devtools/python/python-imaging/remove-host-libdir.patch25
-rw-r--r--external/meta-python2/recipes-devtools/python/python-imaging_1.1.7.bb48
-rw-r--r--external/meta-python2/recipes-devtools/python/python-importlib-metadata_0.23.bb27
-rw-r--r--external/meta-python2/recipes-devtools/python/python-incremental_17.5.0.bb20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-inflection_0.3.1.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-intervals_1.10.0.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-ipaddress_1.0.23.bb11
-rw-r--r--external/meta-python2/recipes-devtools/python/python-ipy_1.00.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-iso8601_0.1.12.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-isodate_0.6.0.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-isort_4.3.21.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-itsdangerous_1.1.0.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-javaobj-py3_0.4.0.1.bb25
-rw-r--r--external/meta-python2/recipes-devtools/python/python-jinja2_2.10.3.bb33
-rw-r--r--external/meta-python2/recipes-devtools/python/python-jsmin_2.2.2.bb11
-rw-r--r--external/meta-python2/recipes-devtools/python/python-jsonpatch_1.24.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-jsonpointer_2.0.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-jsonref_0.2.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-jsonschema_3.2.0.bb59
-rw-r--r--external/meta-python2/recipes-devtools/python/python-lazy-object-proxy_1.4.3.bb12
-rw-r--r--external/meta-python2/recipes-devtools/python/python-ldap_3.2.0.bb37
-rw-r--r--external/meta-python2/recipes-devtools/python/python-license-expression_1.2.bb20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-linecache2_1.0.0.bb13
-rw-r--r--external/meta-python2/recipes-devtools/python/python-lockfile_0.12.2.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-lrparsing_1.0.16.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-lxml_4.4.2.bb52
-rw-r--r--external/meta-python2/recipes-devtools/python/python-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch35
-rw-r--r--external/meta-python2/recipes-devtools/python/python-m2crypto/cross-compile-platform.patch33
-rw-r--r--external/meta-python2/recipes-devtools/python/python-m2crypto/m2crypto-0.26.4-gcc_macros.patch35
-rw-r--r--external/meta-python2/recipes-devtools/python/python-m2crypto_0.30.1.bb64
-rw-r--r--external/meta-python2/recipes-devtools/python/python-mako_1.1.0.bb22
-rw-r--r--external/meta-python2/recipes-devtools/python/python-markupsafe_1.1.1.bb20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-matplotlib/fix_setupext.patch110
-rw-r--r--external/meta-python2/recipes-devtools/python/python-mccabe/0001-python-mccabe-remove-unnecessary-setup_requires-pyte.patch33
-rw-r--r--external/meta-python2/recipes-devtools/python/python-mccabe_0.4.0.bb20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-mock_3.0.5.bb22
-rw-r--r--external/meta-python2/recipes-devtools/python/python-monotonic_1.5.bb10
-rw-r--r--external/meta-python2/recipes-devtools/python/python-more-itertools_5.0.0.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-msgpack_0.6.2.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-native/0001-python-native-fix-one-do_populate_sysroot-warning.patch40
-rw-r--r--external/meta-python2/recipes-devtools/python/python-native/10-distutils-fix-swig-parameter.patch18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-native/11-distutils-never-modify-shebang-line.patch20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-native/multilib.patch235
-rw-r--r--external/meta-python2/recipes-devtools/python/python-native/nohostlibs.patch54
-rw-r--r--external/meta-python2/recipes-devtools/python/python-native/revert_use_of_sysconfigdata.patch86
-rw-r--r--external/meta-python2/recipes-devtools/python/python-native/unixccompiler.patch20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-native_2.7.18.bb90
-rw-r--r--external/meta-python2/recipes-devtools/python/python-ndg-httpsclient_0.5.1.bb40
-rw-r--r--external/meta-python2/recipes-devtools/python/python-netaddr_0.7.19.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-netifaces_0.10.9.bb12
-rw-r--r--external/meta-python2/recipes-devtools/python/python-networkx_2.2.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-numeric/0001-it-tries-to-define-this-function-differently-than-it.patch30
-rw-r--r--external/meta-python2/recipes-devtools/python/python-numeric_24.2.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-packaging_20.0.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-paho-mqtt_1.5.0.bb25
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pam_1.8.2.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pamela_0.3.0.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-parse-type_0.4.2.bb13
-rw-r--r--external/meta-python2/recipes-devtools/python/python-parse_1.14.0.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-passlib_1.7.2.bb21
-rw-r--r--external/meta-python2/recipes-devtools/python/python-paste_3.2.3.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pathlib2_2.3.5.bb24
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pbr_5.4.4.bb13
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pep8_1.7.1.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-periphery_2.0.0.bb12
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pexpect_4.7.0.bb23
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pika_1.1.0.bb22
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pint_0.9.bb24
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pip_19.3.1.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pluggy_0.13.1.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-ply_3.11.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pretend_1.0.9.bb11
-rw-r--r--external/meta-python2/recipes-devtools/python/python-prettytable_0.7.2.bb29
-rw-r--r--external/meta-python2/recipes-devtools/python/python-progress_1.5.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-prompt-toolkit_2.0.10.bb21
-rw-r--r--external/meta-python2/recipes-devtools/python/python-protobuf_3.9.2.bb33
-rw-r--r--external/meta-python2/recipes-devtools/python/python-psutil_5.6.7.bb25
-rw-r--r--external/meta-python2/recipes-devtools/python/python-ptyprocess_0.6.0.bb22
-rw-r--r--external/meta-python2/recipes-devtools/python/python-py_1.8.1.bb13
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyalsaaudio_0.8.4.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyasn1-modules_0.2.7.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyasn1_0.4.8.bb20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pybind11_2.4.3.bb9
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pybluez_0.22.bb25
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pycodestyle_2.5.0.bb21
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pycparser_2.19.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pycrypto/CVE-2013-7459.patch98
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pycrypto/cross-compiling.patch23
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pycrypto_2.6.1.bb36
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pycryptodomex_3.9.4.bb29
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pycurl_7.43.0.3.bb27
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pydbus_0.6.0.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyelftools_0.25.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyexpect_1.0.19.bb11
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyfirmata_1.1.0.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyflakes_2.1.1.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyflame_1.6.7.bb30
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pygobject/0001-python-pyobject-fix-install-dir.patch121
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pygobject_3.34.0.bb40
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pygpgme/0001-reflect-2.1-reporting-for-key-imports.patch90
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pygpgme/0002-passphrase_cb-is-deprecated.patch52
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pygpgme/0003-handle-generic-error-when-no-passphrase-callback-pre.patch30
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pygpgme/run-ptest3
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pygpgme_0.3.bb26
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyhamcrest_1.9.0.bb10
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyiface_0.0.11.bb11
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyinotify_0.9.6.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyjks_19.0.0.bb23
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyjwt_1.7.1.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pylint_1.8.3.bb39
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pymisp_2.4.119.1.bb27
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pymongo_3.10.1.bb31
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pymysql_0.9.3.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pynetlinux_1.1.bb12
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyopenssl_19.1.0.bb25
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyparsing_2.4.6.bb22
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyperclip_1.7.0.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyperf_1.7.0.bb34
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyrex-native_0.9.9.bb5
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyrex/pyrex-fix-optimized-mode.patch15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyrex_0.9.9.bb22
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyroute2_0.5.7.bb26
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyrsistent_0.15.7.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyrtm_0.4.2.bb39
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyserial_3.4.bb45
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pysmi_0.3.4.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pysnmp_4.4.9.bb26
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pysocks_1.7.1.bb22
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pysqlite_2.8.3.bb21
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pystache_0.5.4.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pytest-helpers-namespace_2019.1.8.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pytest-runner_5.2.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pytest-tempdir_2019.10.12.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pytest/0001-setup.py-remove-setup_requires-for-setuptools-scm.patch31
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pytest/pytest_version_fix.patch51
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pytest_4.6.9.bb50
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pytoml_0.1.21.bb15
-rwxr-xr-xexternal/meta-python2/recipes-devtools/python/python-pytz_2019.3.bb20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyudev_0.21.0.bb25
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyusb_1.0.2.bb13
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyyaml_5.3.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyzmq/club-rpath-out.patch13
-rw-r--r--external/meta-python2/recipes-devtools/python/python-pyzmq_17.1.0.bb27
-rw-r--r--external/meta-python2/recipes-devtools/python/python-rdflib_4.2.2.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-redis_2.10.6.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-requests-oauthlib_1.3.0.bb12
-rw-r--r--external/meta-python2/recipes-devtools/python/python-requests_2.23.0.bb34
-rw-r--r--external/meta-python2/recipes-devtools/python/python-rfc3339-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch32
-rw-r--r--external/meta-python2/recipes-devtools/python/python-rfc3339-validator_0.1.1.bb25
-rw-r--r--external/meta-python2/recipes-devtools/python/python-rfc3986-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch32
-rw-r--r--external/meta-python2/recipes-devtools/python/python-rfc3986-validator_0.1.1.bb23
-rw-r--r--external/meta-python2/recipes-devtools/python/python-rfc3987_1.3.8.bb10
-rw-r--r--external/meta-python2/recipes-devtools/python/python-robotframework-seriallibrary_0.3.1.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-robotframework_3.0.4.bb28
-rw-r--r--external/meta-python2/recipes-devtools/python/python-scandir_1.10.0.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-scrypt/0001-py-scrypt-remove-the-hard-coded-include-paths.patch26
-rw-r--r--external/meta-python2/recipes-devtools/python/python-scrypt_0.8.6.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-sdnotify_0.3.2.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-selectors34_1.2.bb12
-rw-r--r--external/meta-python2/recipes-devtools/python/python-semver_2.8.1.bb12
-rw-r--r--external/meta-python2/recipes-devtools/python/python-serpent_1.28.bb13
-rw-r--r--external/meta-python2/recipes-devtools/python/python-setuptools-scm_3.3.3.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-setuptools.inc50
-rw-r--r--external/meta-python2/recipes-devtools/python/python-setuptools/0001-conditionally-do-not-fetch-code-by-easy_install.patch32
-rw-r--r--external/meta-python2/recipes-devtools/python/python-setuptools_42.0.2.bb9
-rw-r--r--external/meta-python2/recipes-devtools/python/python-sh_1.12.14.bb37
-rw-r--r--external/meta-python2/recipes-devtools/python/python-sijax_0.3.2.bb12
-rw-r--r--external/meta-python2/recipes-devtools/python/python-simplejson_3.17.0.bb26
-rw-r--r--external/meta-python2/recipes-devtools/python/python-singledispatch_3.4.0.3.bb12
-rw-r--r--external/meta-python2/recipes-devtools/python/python-six_1.14.0.bb6
-rw-r--r--external/meta-python2/recipes-devtools/python/python-slip-dbus_0.6.5.bb38
-rw-r--r--external/meta-python2/recipes-devtools/python/python-smbus_4.1.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-snakefood_1.4.bb51
-rw-r--r--external/meta-python2/recipes-devtools/python/python-snimpy_0.8.13.bb20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-socketio_4.3.1.bb28
-rw-r--r--external/meta-python2/recipes-devtools/python/python-soupsieve_1.9.4.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-sparts_0.7.3.bb22
-rw-r--r--external/meta-python2/recipes-devtools/python/python-speaklater_1.3.bb10
-rw-r--r--external/meta-python2/recipes-devtools/python/python-sqlalchemy_1.3.12.bb22
-rw-r--r--external/meta-python2/recipes-devtools/python/python-sqlparse_0.3.0.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-statistics_1.0.3.5.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-stevedore_1.31.0.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-strict-rfc3339_0.7.bb10
-rw-r--r--external/meta-python2/recipes-devtools/python/python-subprocess32_3.2.7.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-systemd/0001-Provide-implementation-of-strndupa-for-musl.patch42
-rw-r--r--external/meta-python2/recipes-devtools/python/python-systemd/endian.patch14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-systemd_234.bb21
-rw-r--r--external/meta-python2/recipes-devtools/python/python-toml_0.10.0.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-tornado-redis_2.4.18.bb18
-rw-r--r--external/meta-python2/recipes-devtools/python/python-tornado_6.0.3.bb35
-rw-r--r--external/meta-python2/recipes-devtools/python/python-tqdm_4.41.1.bb20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-traceback2_1.4.0.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-twisted/0001-fix-MemoryReactor-import-in-test_runner-to-be-from-t.patch37
-rw-r--r--external/meta-python2/recipes-devtools/python/python-twisted_19.10.0.bb290
-rw-r--r--external/meta-python2/recipes-devtools/python/python-twitter_3.8.0.bb20
-rw-r--r--external/meta-python2/recipes-devtools/python/python-twofish_0.3.0.bb13
-rw-r--r--external/meta-python2/recipes-devtools/python/python-typing_3.7.4.1.bb11
-rw-r--r--external/meta-python2/recipes-devtools/python/python-tzlocal_2.0.0.bb9
-rw-r--r--external/meta-python2/recipes-devtools/python/python-ujson_1.35.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-unidiff_0.5.5.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-urllib3_1.25.7.bb23
-rw-r--r--external/meta-python2/recipes-devtools/python/python-vcversioner_2.16.0.0.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-versiontools_1.9.1.bb11
-rw-r--r--external/meta-python2/recipes-devtools/python/python-visitor_0.1.3.bb8
-rw-r--r--external/meta-python2/recipes-devtools/python/python-vobject_0.9.6.1.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-waitress_1.4.2.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-wcwidth_0.1.8.bb10
-rw-r--r--external/meta-python2/recipes-devtools/python/python-webcolors_1.8.1.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-webdav_0.1.2.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-webencodings_0.5.1.bb15
-rw-r--r--external/meta-python2/recipes-devtools/python/python-websocket-client_0.57.0.bb11
-rw-r--r--external/meta-python2/recipes-devtools/python/python-werkzeug_0.16.0.bb51
-rw-r--r--external/meta-python2/recipes-devtools/python/python-which_1.1.0.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-whoosh_2.7.4.bb27
-rw-r--r--external/meta-python2/recipes-devtools/python/python-wrapt_1.11.2.bb34
-rw-r--r--external/meta-python2/recipes-devtools/python/python-wtforms_2.2.1.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-xlrd_1.2.0.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-xstatic-font-awesome_4.7.0.0.bb19
-rw-r--r--external/meta-python2/recipes-devtools/python/python-xstatic_1.0.2.bb16
-rw-r--r--external/meta-python2/recipes-devtools/python/python-yappi_1.0.bb17
-rw-r--r--external/meta-python2/recipes-devtools/python/python-zipp_0.6.0.bb14
-rw-r--r--external/meta-python2/recipes-devtools/python/python-zopeinterface_4.7.1.bb25
-rw-r--r--external/meta-python2/recipes-devtools/python/python.inc58
-rw-r--r--external/meta-python2/recipes-devtools/python/python/0001-distutils-set-the-prefix-to-be-inside-staging-direct.patch51
-rw-r--r--external/meta-python2/recipes-devtools/python/python/0001-python-Resolve-intermediate-staging-issues.patch59
-rw-r--r--external/meta-python2/recipes-devtools/python/python/0001-python2-use-cc_basename-to-replace-CC-for-checking-c.patch114
-rw-r--r--external/meta-python2/recipes-devtools/python/python/01-use-proper-tools-for-cross-build.patch49
-rw-r--r--external/meta-python2/recipes-devtools/python/python/03-fix-tkinter-detection.patch46
-rw-r--r--external/meta-python2/recipes-devtools/python/python/05-enable-ctypes-cross-build.patch27
-rw-r--r--external/meta-python2/recipes-devtools/python/python/06-avoid_usr_lib_termcap_path_in_linking.patch35
-rw-r--r--external/meta-python2/recipes-devtools/python/python/add-CROSSPYTHONPATH-for-PYTHON_FOR_BUILD.patch28
-rw-r--r--external/meta-python2/recipes-devtools/python/python/add-md5module-support.patch18
-rw-r--r--external/meta-python2/recipes-devtools/python/python/avoid_warning_about_tkinter.patch29
-rw-r--r--external/meta-python2/recipes-devtools/python/python/avoid_warning_for_sunos_specific_module.patch23
-rw-r--r--external/meta-python2/recipes-devtools/python/python/cgi_py.patch23
-rw-r--r--external/meta-python2/recipes-devtools/python/python/check-if-target-is-64b-not-host.patch57
-rw-r--r--external/meta-python2/recipes-devtools/python/python/create_manifest2.py298
-rw-r--r--external/meta-python2/recipes-devtools/python/python/fix_for_using_different_libdir.patch77
-rw-r--r--external/meta-python2/recipes-devtools/python/python/float-endian.patch216
-rw-r--r--external/meta-python2/recipes-devtools/python/python/get_module_deps2.py112
-rw-r--r--external/meta-python2/recipes-devtools/python/python/host_include_contamination.patch28
-rw-r--r--external/meta-python2/recipes-devtools/python/python/multilib.patch298
-rw-r--r--external/meta-python2/recipes-devtools/python/python/parallel-makeinst-create-bindir.patch19
-rw-r--r--external/meta-python2/recipes-devtools/python/python/pass-missing-libraries-to-Extension-for-mul.patch82
-rw-r--r--external/meta-python2/recipes-devtools/python/python/python-2.7.3-remove-bsdb-rpath.patch28
-rw-r--r--external/meta-python2/recipes-devtools/python/python/python2-manifest.json1139
-rw-r--r--external/meta-python2/recipes-devtools/python/python/run-ptest3
-rw-r--r--external/meta-python2/recipes-devtools/python/python/search_db_h_in_inc_dirs_and_avoid_warning.patch35
-rw-r--r--external/meta-python2/recipes-devtools/python/python/setup_py_skip_cross_import_check.patch27
-rw-r--r--external/meta-python2/recipes-devtools/python/python/setuptweaks.patch57
-rw-r--r--external/meta-python2/recipes-devtools/python/python/sitecustomize.py37
-rw-r--r--external/meta-python2/recipes-devtools/python/python/support_SOURCE_DATE_EPOCH_in_py_compile_2.7.patch34
-rw-r--r--external/meta-python2/recipes-devtools/python/python/use_sysroot_ncurses_instead_of_host.patch21
-rw-r--r--external/meta-python2/recipes-devtools/python/python_2.7.18.bb260
-rw-r--r--external/meta-python2/recipes-extended/python-cson/python-cson_git.bb21
-rw-r--r--external/meta-python2/recipes-extended/python-pyephem/python-pyephem_3.7.7.0.bb17
-rw-r--r--external/meta-python2/recipes-extended/python-pyparted/python-pyparted_3.11.3.bb32
-rw-r--r--external/meta-python2/recipes-extended/pywbem/python-pywbem_0.15.0.bb68
-rw-r--r--external/meta-python2/recipes-support/dnssec-conf/dnssec-conf_2.02.bb41
418 files changed, 13270 insertions, 0 deletions
diff --git a/external/meta-python2/.gitlab-ci.yml b/external/meta-python2/.gitlab-ci.yml
new file mode 100644
index 00000000..81807699
--- /dev/null
+++ b/external/meta-python2/.gitlab-ci.yml
@@ -0,0 +1,13 @@
+image: kasproject/kas:latest
+
+meta-python2-image:
+ stage: build
+ script:
+ - kas build kas-meta-python2-image.yml
+
+meta-python2-ptest-image:
+ stage: build
+ script:
+ - kas build kas-meta-python2-ptest-image.yml
+ - kas build -c testimage kas-meta-python2-ptest-image.yml
+
diff --git a/external/meta-python2/COPYING.MIT b/external/meta-python2/COPYING.MIT
new file mode 100644
index 00000000..fb950dc6
--- /dev/null
+++ b/external/meta-python2/COPYING.MIT
@@ -0,0 +1,17 @@
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/external/meta-python2/Pipfile b/external/meta-python2/Pipfile
new file mode 100644
index 00000000..4f2828fd
--- /dev/null
+++ b/external/meta-python2/Pipfile
@@ -0,0 +1,12 @@
+[[source]]
+url = "https://pypi.python.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+kas = "*"
+
+[dev-packages]
+
+[requires]
+python_version = "3.7"
diff --git a/external/meta-python2/Pipfile.lock b/external/meta-python2/Pipfile.lock
new file mode 100644
index 00000000..b4edbbb2
--- /dev/null
+++ b/external/meta-python2/Pipfile.lock
@@ -0,0 +1,102 @@
+{
+ "_meta": {
+ "hash": {
+ "sha256": "807dcb4be569fc3eaf92f7e2c4df698b8797c43cfca5d6e28c1c2f7d3a29cc81"
+ },
+ "pipfile-spec": 6,
+ "requires": {
+ "python_version": "3.7"
+ },
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.python.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ "attrs": {
+ "hashes": [
+ "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c",
+ "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"
+ ],
+ "version": "==19.3.0"
+ },
+ "distro": {
+ "hashes": [
+ "sha256:362dde65d846d23baee4b5c058c8586f219b5a54be1cf5fc6ff55c4578392f57",
+ "sha256:eedf82a470ebe7d010f1872c17237c79ab04097948800029994fa458e52fb4b4"
+ ],
+ "version": "==1.4.0"
+ },
+ "importlib-metadata": {
+ "hashes": [
+ "sha256:aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26",
+ "sha256:d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af"
+ ],
+ "markers": "python_version < '3.8'",
+ "version": "==0.23"
+ },
+ "jsonschema": {
+ "hashes": [
+ "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163",
+ "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"
+ ],
+ "version": "==3.2.0"
+ },
+ "kas": {
+ "hashes": [
+ "sha256:78372c2bb0f3b864516f93d72ba056bf2dc249d446b3bd0985e3ee1e5033eaf7"
+ ],
+ "index": "pypi",
+ "version": "==2.0"
+ },
+ "more-itertools": {
+ "hashes": [
+ "sha256:53ff73f186307d9c8ef17a9600309154a6ae27f25579e80af4db8f047ba14bc2",
+ "sha256:a0ea684c39bc4315ba7aae406596ef191fd84f873d2d2751f84d64e81a7a2d45"
+ ],
+ "version": "==8.0.0"
+ },
+ "pyrsistent": {
+ "hashes": [
+ "sha256:f3b280d030afb652f79d67c5586157c5c1355c9a58dfc7940566e28d28f3df1b"
+ ],
+ "version": "==0.15.6"
+ },
+ "pyyaml": {
+ "hashes": [
+ "sha256:0113bc0ec2ad727182326b61326afa3d1d8280ae1122493553fd6f4397f33df9",
+ "sha256:01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4",
+ "sha256:5124373960b0b3f4aa7df1707e63e9f109b5263eca5976c66e08b1c552d4eaf8",
+ "sha256:5ca4f10adbddae56d824b2c09668e91219bb178a1eee1faa56af6f99f11bf696",
+ "sha256:7907be34ffa3c5a32b60b95f4d95ea25361c951383a894fec31be7252b2b6f34",
+ "sha256:7ec9b2a4ed5cad025c2278a1e6a19c011c80a3caaac804fd2d329e9cc2c287c9",
+ "sha256:87ae4c829bb25b9fe99cf71fbb2140c448f534e24c998cc60f39ae4f94396a73",
+ "sha256:9de9919becc9cc2ff03637872a440195ac4241c80536632fffeb6a1e25a74299",
+ "sha256:a5a85b10e450c66b49f98846937e8cfca1db3127a9d5d1e31ca45c3d0bef4c5b",
+ "sha256:b0997827b4f6a7c286c01c5f60384d218dca4ed7d9efa945c3e1aa623d5709ae",
+ "sha256:b631ef96d3222e62861443cc89d6563ba3eeb816eeb96b2629345ab795e53681",
+ "sha256:bf47c0607522fdbca6c9e817a6e81b08491de50f3766a7a0e6a5be7905961b41",
+ "sha256:f81025eddd0327c7d4cfe9b62cf33190e1e736cc6e97502b3ec425f574b3e7a8"
+ ],
+ "version": "==5.1.2"
+ },
+ "six": {
+ "hashes": [
+ "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd",
+ "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"
+ ],
+ "version": "==1.13.0"
+ },
+ "zipp": {
+ "hashes": [
+ "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e",
+ "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335"
+ ],
+ "version": "==0.6.0"
+ }
+ },
+ "develop": {}
+}
diff --git a/external/meta-python2/README b/external/meta-python2/README
new file mode 100644
index 00000000..e81533e2
--- /dev/null
+++ b/external/meta-python2/README
@@ -0,0 +1,111 @@
+meta-python2
+============
+
+Preamble
+--------
+
+Python 2 is going EOL (end of life) in January 2020 [1]. This means that all support for the
+language will be on the shoulders of the community and the upstream python developers will
+no longer be supporting it. This has been in the works for several years and it should come
+as no surprise to ANYONE that the support is ending.
+
+In light of the above, oe-core, meta-oe, meta-python and other layers are actively dropping
+python2 recipes. This also means that the core developers for YP/OE will no longer have any
+motivation to maintain python2 or python2 recipes. This includes the creator of this layer.
+
+If your organization has legacy python2 code or depends upon upstream python2-only code, the
+time has come for you to move on. Porting from python2 to python3 is well documented [2].
+
+Continuing to depend upon python2-only code will increasingly open you up to security issues,
+vulnerabilities and breakage.
+
+[1] https://www.python.org/doc/sunset-python-2/
+[2] https://docs.python.org/3/howto/pyporting.html
+
+Introduction
+------------
+
+This layer is intended to be the home of legacy python2 modules for OpenEmbedded.
+
+Dependencies
+------------
+
+The meta-python2 layer depends on:
+
+ URI: git://git.openembedded.org/openembedded-core
+ layers: meta
+ branch: master
+ revision: HEAD
+
+ URI: git://git.openembedded.org/meta-openembedded
+ layers: meta-oe
+ branch: master
+ revision: HEAD
+
+Please follow the recommended setup procedures of your OE distribution.
+
+Building and Continuous Integration
+-----------------------------------
+
+We have provided 'kas' [3,4] YAML files to make it easier to build the basic images supplied by
+this layer. In order to make running 'kas' in a virtual environmnt easier, we have also provided
+a 'Pipfile' to enable using 'pipenv' [5].
+
+For instance, your CI workflow could include:
+
+$ pipenv install
+$ pipenv shell
+$ kas build path/to/meta-python/kas-meta-python2-image.yml
+
+Continous Integration via GitLab is also enabled by providing a .gitlab-ci.yml file.
+
+[3] https://github.com/siemens/kas
+[4] https://kas.readthedocs.io/en/latest/
+[5] https://github.com/pypa/pipenv
+
+Contributing
+------------
+
+Recipes in this layer use Debian naming, which means if it is a python library it should be prefixed
+with 'python-'. The only exception to this is when the recipe is providing an executable application
+that is installed in /usr/bin for example. Exceptions to Debian naming are very rare.
+
+It is expected that recipes will provide SUMMARY, DESCRIPTION, HOMEPAGE, BUGTRACKER and SECTION
+variables, unless the values are unknown. It is strongly recommended to use the pypi.bbclass unless
+your python module is not available on pypi.org.
+
+It is expected that ANY upgrades to a recipe will have undergone run-time testing before submitting
+the upgrade. Many other developers depend upon the quality of this layer and will be quite upset with
+you when you break their builds.
+
+Commit messages must include a "Signed-off-by:" line, including a valid email address and a legal name
+(not a nickname). The "Signed-off-by:" line means that you are either the author or have the legal right
+to submit the work. Please refer to the "Submitting a patch to OpenEmbedded" [6] and "Commit Patch
+Message Guidelines" [7] for guidance.
+
+The meta-openembedded mailinglist
+(openembedded-devel@lists.openembedded.org) is used for questions,
+comments and patch review. It is subscriber only, so please register
+before posting.
+
+Send pull requests to openembedded-devel@lists.openembedded.org with
+'[meta-python2]' in the subject.
+
+When sending single patches, please use something like:
+'git send-email -M -1 --to=openembedded-devel@lists.openembedded.org --subject-prefix=meta-python2][PATCH'
+
+When a patch only applies to a stable branch, please include the branch name in the subject line,
+something like '[meta-python2][zeus]'...
+
+[6] https://www.openembedded.org/wiki/How_to_submit_a_patch_to_OpenEmbedded
+[7] https://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines
+
+Maintenance
+-------------------------
+
+Layer Maintainers:
+ Tim "moto-timo" Orling <TicoTimo@gmail.com>
+
+NOTE: Support by the above maintainer will end when Yocto Project 3.1 is released in
+approximately April 2020. Creation and maintainence of this layer is entirely a volunteer
+effort and the author has ZERO REASON to continue using or supporting python2.
diff --git a/external/meta-python2/classes/bandit.bbclass b/external/meta-python2/classes/bandit.bbclass
new file mode 100644
index 00000000..dc1041e4
--- /dev/null
+++ b/external/meta-python2/classes/bandit.bbclass
@@ -0,0 +1,63 @@
+# Class to scan Python code for security issues, using Bandit.
+#
+# $ bitbake python-foo -c bandit
+#
+# Writes the report to $DEPLOY_DIR/bandit/python-foo.html.
+# No output if no issues found, a warning if issues found.
+#
+# https://github.com/PyCQA/bandit
+
+# Default location of sources, based on standard distutils
+BANDIT_SOURCE ?= "${S}/build"
+
+# The report format to use.
+# https://bandit.readthedocs.io/en/latest/formatters/index.html
+BANDIT_FORMAT ?= "html"
+
+# Whether a scan should be done every time the recipe is built.
+#
+# By default the scanning needs to be done explicitly, but by setting BANDIT_AUTO
+# to 1 the scan will be done whenever the recipe it built. Note that you
+# shouldn't set BANDIT_AUTO to 1 globally as it will then try to scan every
+# recipe, including non-Python recipes, causing circular loops.
+BANDIT_AUTO ?= "0"
+
+# Whether Bandit finding issues results in a warning (0) or an error (1).
+BANDIT_FATAL ?= "0"
+
+do_bandit[depends] = "python3-bandit-native:do_populate_sysroot"
+python do_bandit() {
+ import os, subprocess
+ try:
+ report = d.expand("${DEPLOY_DIR}/bandit/${PN}-${PV}.${BANDIT_FORMAT}")
+ os.makedirs(os.path.dirname(report), exist_ok=True)
+
+ args = ("bandit",
+ "--format", d.getVar("BANDIT_FORMAT"),
+ "--output", report,
+ "-ll",
+ "--recursive", d.getVar("BANDIT_SOURCE"))
+ subprocess.check_output(args, stderr=subprocess.STDOUT)
+ bb.note("Bandit found no issues (report written to %s)" % report)
+ except subprocess.CalledProcessError as e:
+ if e.returncode == 1:
+ if oe.types.boolean(d.getVar("BANDIT_FATAL")):
+ bb.error("Bandit found issues (report written to %s)" % report)
+ else:
+ bb.warn("Bandit found issues (report written to %s)" % report)
+ else:
+ bb.error("Bandit failed:\n" + e.output.decode("utf-8"))
+}
+
+python() {
+ before = "do_build"
+ after = "do_compile"
+
+ if oe.types.boolean(d.getVar("BANDIT_AUTO")):
+ bb.build.addtask("do_bandit", before, after, d)
+ else:
+ bb.build.addtask("do_bandit", None, after, d)
+}
+
+# TODO: store report in sstate
+# TODO: a way to pass extra args or .bandit file, basically control -ll
diff --git a/external/meta-python2/classes/distutils-base.bbclass b/external/meta-python2/classes/distutils-base.bbclass
new file mode 100644
index 00000000..9f398d70
--- /dev/null
+++ b/external/meta-python2/classes/distutils-base.bbclass
@@ -0,0 +1,4 @@
+DEPENDS += "${@["${PYTHON_PN}-native ${PYTHON_PN}", ""][(d.getVar('PACKAGES') == '')]}"
+RDEPENDS_${PN} += "${@['', '${PYTHON_PN}-core']['${CLASSOVERRIDE}' == 'class-target']}"
+
+inherit distutils-common-base pythonnative
diff --git a/external/meta-python2/classes/distutils.bbclass b/external/meta-python2/classes/distutils.bbclass
new file mode 100644
index 00000000..3759b582
--- /dev/null
+++ b/external/meta-python2/classes/distutils.bbclass
@@ -0,0 +1,87 @@
+inherit distutils-base
+
+DISTUTILS_BUILD_ARGS ?= ""
+DISTUTILS_STAGE_HEADERS_ARGS ?= "--install-dir=${STAGING_INCDIR}/${PYTHON_DIR}"
+DISTUTILS_STAGE_ALL_ARGS ?= "--prefix=${STAGING_DIR_HOST}${prefix} \
+ --install-data=${STAGING_DATADIR}"
+DISTUTILS_INSTALL_ARGS ?= "--root=${D} \
+ --prefix=${prefix} \
+ --install-lib=${PYTHON_SITEPACKAGES_DIR} \
+ --install-data=${datadir}"
+
+DISTUTILS_PYTHON = "python"
+DISTUTILS_PYTHON_class-native = "nativepython"
+
+distutils_do_configure() {
+ if [ "${CLEANBROKEN}" != "1" ] ; then
+ NO_FETCH_BUILD=1 \
+ ${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN} setup.py clean ${DISTUTILS_BUILD_ARGS}
+ fi
+}
+
+distutils_do_compile() {
+ NO_FETCH_BUILD=1 \
+ STAGING_INCDIR=${STAGING_INCDIR} \
+ STAGING_LIBDIR=${STAGING_LIBDIR} \
+ ${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN} setup.py build ${DISTUTILS_BUILD_ARGS} || \
+ bbfatal_log "'${PYTHON_PN} setup.py build ${DISTUTILS_BUILD_ARGS}' execution failed."
+}
+
+distutils_stage_headers() {
+ install -d ${STAGING_DIR_HOST}${PYTHON_SITEPACKAGES_DIR}
+ ${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN} setup.py install_headers ${DISTUTILS_STAGE_HEADERS_ARGS} || \
+ bbfatal_log "'${PYTHON_PN} setup.py install_headers ${DISTUTILS_STAGE_HEADERS_ARGS}' execution for stage_headers failed."
+}
+
+distutils_stage_all() {
+ STAGING_INCDIR=${STAGING_INCDIR} \
+ STAGING_LIBDIR=${STAGING_LIBDIR} \
+ install -d ${STAGING_DIR_HOST}${PYTHON_SITEPACKAGES_DIR}
+ PYTHONPATH=${STAGING_DIR_HOST}${PYTHON_SITEPACKAGES_DIR} \
+ ${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN} setup.py install ${DISTUTILS_STAGE_ALL_ARGS} || \
+ bbfatal_log "'${PYTHON_PN} setup.py install ${DISTUTILS_STAGE_ALL_ARGS}' execution for stage_all failed."
+}
+
+distutils_do_install() {
+ install -d ${D}${PYTHON_SITEPACKAGES_DIR}
+ STAGING_INCDIR=${STAGING_INCDIR} \
+ STAGING_LIBDIR=${STAGING_LIBDIR} \
+ PYTHONPATH=${D}${PYTHON_SITEPACKAGES_DIR} \
+ ${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN} setup.py install ${DISTUTILS_INSTALL_ARGS} || \
+ bbfatal_log "'${PYTHON_PN} setup.py install ${DISTUTILS_INSTALL_ARGS}' execution failed."
+
+ # support filenames with *spaces*
+ # only modify file if it contains path and recompile it
+ find ${D} -name "*.py" -exec grep -q ${D} {} \; \
+ -exec sed -i -e s:${D}::g {} \; \
+ -exec ${STAGING_BINDIR_NATIVE}/python-native/python -mcompileall {} \;
+
+ for i in ${D}${bindir}/* ${D}${sbindir}/*; do
+ if [ -f "$i" ]; then
+ sed -i -e s:${PYTHON}:${USRBINPATH}/env\ ${DISTUTILS_PYTHON}:g $i
+ sed -i -e s:${STAGING_BINDIR_NATIVE}:${bindir}:g $i
+ fi
+ done
+
+ rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/easy-install.pth
+ rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/site.py*
+
+ #
+ # FIXME: Bandaid against wrong datadir computation
+ #
+ if [ -e ${D}${datadir}/share ]; then
+ mv -f ${D}${datadir}/share/* ${D}${datadir}/
+ rmdir ${D}${datadir}/share
+ fi
+
+ # Fix backport modules
+ if [ -e ${STAGING_LIBDIR}/${PYTHON_DIR}/site-packages/backports/__init__.py ] &&
+ [ -e ${D}${PYTHON_SITEPACKAGES_DIR}/backports/__init__.py ]; then
+ rm ${D}${PYTHON_SITEPACKAGES_DIR}/backports/__init__.py;
+ rm ${D}${PYTHON_SITEPACKAGES_DIR}/backports/__init__.pyc;
+ fi
+}
+
+EXPORT_FUNCTIONS do_configure do_compile do_install
+
+export LDSHARED="${CCLD} -shared"
diff --git a/external/meta-python2/classes/python-backports-init.bbclass b/external/meta-python2/classes/python-backports-init.bbclass
new file mode 100644
index 00000000..727bc4a8
--- /dev/null
+++ b/external/meta-python2/classes/python-backports-init.bbclass
@@ -0,0 +1,7 @@
+inherit python-dir
+
+RDEPENDS_${PN} += "python-backports-init"
+
+do_install_prepend() {
+ rm -rf $(find . -path "*/backports/__init__.py" -type f)
+}
diff --git a/external/meta-python2/classes/python-dir.bbclass b/external/meta-python2/classes/python-dir.bbclass
new file mode 100644
index 00000000..a11dc350
--- /dev/null
+++ b/external/meta-python2/classes/python-dir.bbclass
@@ -0,0 +1,5 @@
+PYTHON_BASEVERSION = "2.7"
+PYTHON_ABI = ""
+PYTHON_DIR = "python${PYTHON_BASEVERSION}"
+PYTHON_PN = "python"
+PYTHON_SITEPACKAGES_DIR = "${libdir}/${PYTHON_DIR}/site-packages"
diff --git a/external/meta-python2/classes/pythonnative.bbclass b/external/meta-python2/classes/pythonnative.bbclass
new file mode 100644
index 00000000..0e9019d1
--- /dev/null
+++ b/external/meta-python2/classes/pythonnative.bbclass
@@ -0,0 +1,27 @@
+
+inherit python-dir
+
+PYTHON="${STAGING_BINDIR_NATIVE}/python-native/python"
+# PYTHON_EXECUTABLE is used by cmake
+PYTHON_EXECUTABLE="${PYTHON}"
+EXTRANATIVEPATH += "python-native"
+DEPENDS_append = " python-native "
+
+# python-config and other scripts are using distutils modules
+# which we patch to access these variables
+export STAGING_INCDIR
+export STAGING_LIBDIR
+
+# Packages can use
+# find_package(PythonInterp REQUIRED)
+# find_package(PythonLibs REQUIRED)
+# which ends up using libs/includes from build host
+# Therefore pre-empt that effort
+export PYTHON_LIBRARY="${STAGING_LIBDIR}/lib${PYTHON_DIR}${PYTHON_ABI}.so"
+export PYTHON_INCLUDE_DIR="${STAGING_INCDIR}/${PYTHON_DIR}${PYTHON_ABI}"
+
+# suppress host user's site-packages dirs.
+export PYTHONNOUSERSITE = "1"
+
+# autoconf macros will use their internal default preference otherwise
+export PYTHON
diff --git a/external/meta-python2/classes/setuptools.bbclass b/external/meta-python2/classes/setuptools.bbclass
new file mode 100644
index 00000000..a923ea3c
--- /dev/null
+++ b/external/meta-python2/classes/setuptools.bbclass
@@ -0,0 +1,3 @@
+inherit distutils
+
+DEPENDS += "python-setuptools-native"
diff --git a/external/meta-python2/conf/layer.conf b/external/meta-python2/conf/layer.conf
new file mode 100644
index 00000000..b25c9ef9
--- /dev/null
+++ b/external/meta-python2/conf/layer.conf
@@ -0,0 +1,19 @@
+# We might have a conf and classes directory, append to BBPATH
+BBPATH .= ":${LAYERDIR}"
+
+# We have recipes directories, add to BBFILES
+BBFILES += "${LAYERDIR}/recipes*/*/*.bb ${LAYERDIR}/recipes*/*/*.bbappend"
+
+BBFILE_COLLECTIONS += "meta-python2"
+BBFILE_PATTERN_meta-python2 := "^${LAYERDIR}/"
+BBFILE_PRIORITY_meta-python2 = "7"
+
+# This should only be incremented on significant changes that will
+# cause compatibility issues with other layers
+LAYERVERSION_meta-python2 = "1"
+
+LAYERDEPENDS_meta-python2 = "core openembedded-layer"
+
+LAYERSERIES_COMPAT_meta-python2 = "dunfell"
+
+LICENSE_PATH += "${LAYERDIR}/licenses"
diff --git a/external/meta-python2/kas-meta-python2-image-base.yml b/external/meta-python2/kas-meta-python2-image-base.yml
new file mode 100644
index 00000000..62f476ac
--- /dev/null
+++ b/external/meta-python2/kas-meta-python2-image-base.yml
@@ -0,0 +1,26 @@
+header:
+ version: 8
+
+machine: qemux86-64
+distro: poky
+target: meta-python2-image-base
+
+repos:
+ meta-python2:
+
+ poky:
+ url: https://git.yoctoproject.org/git/poky
+ refspec: dunfell
+ layers:
+ meta:
+ meta-poky:
+
+ meta-openembedded:
+ url: http://git.openembedded.org/meta-openembedded
+ refspec: dunfell
+ layers:
+ meta-oe:
+
+local_conf_header:
+ reduce_diskspace: |
+ INHERIT += "rm_work_and_downloads"
diff --git a/external/meta-python2/kas-meta-python2-image.yml b/external/meta-python2/kas-meta-python2-image.yml
new file mode 100644
index 00000000..f5d82ba7
--- /dev/null
+++ b/external/meta-python2/kas-meta-python2-image.yml
@@ -0,0 +1,8 @@
+header:
+ version: 8
+ includes:
+ - kas-meta-python2-image-base.yml
+
+machine: qemux86-64
+distro: poky
+target: meta-python2-image
diff --git a/external/meta-python2/kas-meta-python2-ptest-image.yml b/external/meta-python2/kas-meta-python2-ptest-image.yml
new file mode 100644
index 00000000..1dc0f4b8
--- /dev/null
+++ b/external/meta-python2/kas-meta-python2-ptest-image.yml
@@ -0,0 +1,22 @@
+header:
+ version: 8
+ includes:
+ - kas-meta-python2-image-base.yml
+
+machine: qemux86-64
+distro: poky
+target: meta-python2-ptest-image
+
+local_conf_header:
+ enable_ptest_and_testimage: |
+ INHERIT += "rm_work_and_downloads"
+ IMAGE_CLASSES += " testimage"
+ DISTRO_FEAURES_append = " ptest"
+ EXTRA_IMAGE_FEATURES = "debug-tweaks"
+ TESTIMAGE_AUTO = "1"
+ TEST_SUITES = " ping ssh python2 ptest"
+ TEST_QEMUPARAMS += "-smp 4 -m 8192"
+ TEST_RUNQEMUPARAMS += "kvm gl"
+ IMAGE_ROOTFS_SIZE ?= "8192"
+ IMAGE_ROOTFS_EXTRA_SPACE_append = "${@bb.utils.contains("DISTRO_FEATURES", "systemd", " + 4096", "", d)}"
+ IMAGE_INSTALL_append = " ptest-runner dropbear procps coreutils iproute2 sysstat"
diff --git a/external/meta-python2/lib/oeqa/runtime/cases/python2.py b/external/meta-python2/lib/oeqa/runtime/cases/python2.py
new file mode 100644
index 00000000..8afa2ac9
--- /dev/null
+++ b/external/meta-python2/lib/oeqa/runtime/cases/python2.py
@@ -0,0 +1,20 @@
+#
+# SPDX-License-Identifier: MIT
+#
+
+from oeqa.runtime.case import OERuntimeTestCase
+from oeqa.core.decorator.depends import OETestDepends
+from oeqa.runtime.decorator.package import OEHasPackage
+
+
+class PythonTest(OERuntimeTestCase):
+ @OETestDepends(['ssh.SSHTest.test_ssh'])
+ @OEHasPackage(['python-core'])
+ def test_python(self):
+ cmd = "python -c \"import codecs; print(codecs.encode('Uryyb, jbeyq', 'rot13'))\""
+ status, output = self.target.run(cmd)
+ msg = 'Exit status was not 0. Output: %s' % output
+ self.assertEqual(status, 0, msg=msg)
+
+ msg = 'Incorrect output: %s' % output
+ self.assertEqual(output, "Hello, world", msg=msg)
diff --git a/external/meta-python2/licenses/LLNL b/external/meta-python2/licenses/LLNL
new file mode 100644
index 00000000..1127d56c
--- /dev/null
+++ b/external/meta-python2/licenses/LLNL
@@ -0,0 +1,16 @@
+Legal Notice
+
+*** Legal Notice for all LLNL-contributed files ***
+
+Copyright (c) 1996. The Regents of the University of California. All rights reserved.
+
+Permission to use, copy, modify, and distribute this software for any purpose without
+fee is hereby granted, provided that this entire notice is included in all copies of any software which is or includes a copy or modification of this software and in all copies of the supporting documentation for such software.
+
+This work was produced at the University of California, Lawrence Livermore National
+Laboratory under contract no. W-7405-ENG-48 between the U.S. Department of Energy and The Regents of the University of California for the operation of UC LLNL.
+
+DISCLAIMER
+
+This software was prepared as an account of work sponsored by an agency of the United States Government. Neither the United States Government nor the University of California nor any of their employees, makes any warranty, express or implied, or assumes any liability or responsibility for the accuracy, completeness, or usefulness of any
+information, apparatus, product, or process disclosed, or represents that its use would not infringe privately-owned rights. Reference herein to any specific commercial products, process, or service by trade name, trademark, manufacturer, or otherwise, does not necessarily constitute or imply its endorsement, recommendation, or favoring by the United States Government or the University of California. The views and opinions of authors expressed herein do not necessarily state or reflect those of the United States Government or the University of California, and shall not be used for advertising or product endorsement purposes.
diff --git a/external/meta-python2/licenses/Unicode b/external/meta-python2/licenses/Unicode
new file mode 100644
index 00000000..5d2cc4a6
--- /dev/null
+++ b/external/meta-python2/licenses/Unicode
@@ -0,0 +1,37 @@
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright 1991-2015 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in
+http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software,
+(b) this copyright and permission notice appear in associated
+documentation, and
+(c) there is clear notice in each modified Data File or in the Software
+as well as in the documentation associated with the Data File(s) or
+Software that the data or software has been modified.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
diff --git a/external/meta-python2/recipes-connectivity/gateone/gateone/80oe.conf.in b/external/meta-python2/recipes-connectivity/gateone/gateone/80oe.conf.in
new file mode 100644
index 00000000..4503da42
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/gateone/gateone/80oe.conf.in
@@ -0,0 +1,24 @@
+// Some custom Gate One settings for OpenEmbedded
+{
+ "*": {
+ "gateone": { // These settings apply to all of Gate One
+ "log_file_prefix": "@localstate@/log/gateone.log", // default would be /var/log/gateone/gateone.log
+ "log_file_max_size": 5242880, // 5 megabyte logs for OE by default (default would normally be 100Mb)
+ "log_file_num_backups": 2, // Default is normally 10
+ "origins": ["*"], // Every device has a unique origin
+ "logging": "info",
+ "pid_file": "/run/gateone.pid",
+ "session_dir": "/tmp/gateone",
+ "user_dir": "@localstate@/lib/gateone/users"
+ },
+ "terminal": {
+ // Disabling session logging for embedded devices is a good idea (limited/slow storage)
+ "session_logging": false,
+ "syslog_session_logging": false
+// "commands": {
+// // For some reason this doesn't work (never asks for the password)
+// "login": "setsid /bin/login" // Normally this would emulate logging into the host console
+// }
+ }
+ }
+}
diff --git a/external/meta-python2/recipes-connectivity/gateone/gateone/gateone-avahi.service b/external/meta-python2/recipes-connectivity/gateone/gateone/gateone-avahi.service
new file mode 100644
index 00000000..0f613d18
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/gateone/gateone/gateone-avahi.service
@@ -0,0 +1,10 @@
+<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
+<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
+
+<service-group>
+ <name replace-wildcards="yes">GateOne on %h</name>
+ <service>
+ <type>_https._tcp</type>
+ <port>443</port>
+ </service>
+</service-group>
diff --git a/external/meta-python2/recipes-connectivity/gateone/gateone/gateone-init.in b/external/meta-python2/recipes-connectivity/gateone/gateone/gateone-init.in
new file mode 100644
index 00000000..86d655c9
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/gateone/gateone/gateone-init.in
@@ -0,0 +1,47 @@
+#!/bin/sh -e
+### BEGIN INIT INFO
+# Provides: gateone
+# Required-Start: networking
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Gateone HTML5 ssh client
+# Description: Gateone HTML5 terminal emulator and SSH client.
+### END INIT INFO
+
+. /etc/init.d/functions
+
+NAME=gateone
+DAEMON=@bindir@/gateone
+PIDFILE=/run/gateone.pid
+WORKDIR=@localstate@/lib/gateone
+
+do_start() {
+ cd $WORKDIR
+ @bindir@/python $DAEMON > /dev/null 2>&1 &
+ cd $OLDPWD
+}
+
+do_stop() {
+ kill -TERM `cat $PIDFILE`
+}
+
+case "$1" in
+ start)
+ echo "Starting gateone"
+ do_start
+ ;;
+ stop)
+ echo "Stopping gateone"
+ do_stop
+ ;;
+ restart|force-reload)
+ echo "Restart gateone"
+ do_stop
+ sleep 1
+ do_start
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart|force-reload}" >&2
+ exit 1
+ ;;
+esac
diff --git a/external/meta-python2/recipes-connectivity/gateone/gateone/gateone.service.in b/external/meta-python2/recipes-connectivity/gateone/gateone/gateone.service.in
new file mode 100644
index 00000000..44667275
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/gateone/gateone/gateone.service.in
@@ -0,0 +1,10 @@
+[Unit]
+Description=GateOne daemon
+ConditionPathExists=|@localstate@/lib/gateone
+
+[Service]
+WorkingDirectory=@localstate@/lib/gateone
+ExecStart=@bindir@/python @bindir@/gateone
+
+[Install]
+WantedBy=multi-user.target
diff --git a/external/meta-python2/recipes-connectivity/gateone/gateone_git.bb b/external/meta-python2/recipes-connectivity/gateone/gateone_git.bb
new file mode 100644
index 00000000..5d2ca00e
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/gateone/gateone_git.bb
@@ -0,0 +1,85 @@
+SUMMARY = "HTML5 (plugin-free) web-based terminal emulator and SSH client"
+LICENSE = "AGPL-3.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=834cbc6995db88433db17cdf8953a428"
+HOMEPAGE = "http://liftoffsoftware.com/Products/GateOne"
+
+PV = "1.2+git${SRCPV}"
+SRCREV = "f7a9be46cb90f57459ebd363d24702de0e651034"
+SRC_URI = "git://github.com/liftoff/GateOne.git;branch=master \
+ file://gateone-avahi.service \
+ file://80oe.conf.in \
+ file://gateone.service.in \
+ file://gateone-init.in \
+"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools python-dir systemd update-rc.d
+
+DISTUTILS_INSTALL_ARGS += " \
+ --install-data=${PYTHON_SITEPACKAGES_DIR} \
+ --install-scripts=${bindir} \
+ --skip_init_scripts"
+
+do_install_append() {
+
+ # fix up hardcoded paths
+ for file in gateone.service gateone-init 80oe.conf; do
+ sed -e s:@bindir@:${bindir}:g \
+ -e s:@localstate@:${localstatedir}:g \
+ < ${WORKDIR}/$file.in \
+ > ${WORKDIR}/$file
+ done
+
+ install -d ${D}${systemd_unitdir}/system
+ install -m 0644 ${WORKDIR}/gateone.service ${D}${systemd_unitdir}/system
+
+ install -d ${D}${sysconfdir}/init.d
+ install -m 0755 ${WORKDIR}/gateone-init ${D}${sysconfdir}/init.d/gateone
+
+ install -m 0755 -d ${D}${sysconfdir}/avahi/services/
+ install -m 0644 ${WORKDIR}/gateone-avahi.service ${D}${sysconfdir}/avahi/services/
+
+ install -m 0755 -d ${D}${sysconfdir}/gateone/conf.d/
+ install -m 0644 ${WORKDIR}/80oe.conf ${D}${sysconfdir}/gateone/conf.d/80oe.conf
+
+ install -d ${D}${localstatedir}/lib/gateone
+}
+
+FILES_${PN} = "${localstatedir}/lib ${bindir} ${base_libdir} ${sysconfdir} ${PYTHON_SITEPACKAGES_DIR}"
+RDEPENDS_${PN} = "mime-support \
+ openssh-ssh \
+ python-compression \
+ python-contextlib \
+ python-crypt \
+ python-datetime \
+ python-email \
+ python-fcntl \
+ python-futures \
+ python-html \
+ python-imaging \
+ python-io \
+ python-json \
+ python-logging \
+ python-misc \
+ python-multiprocessing \
+ python-netclient \
+ python-pkgutil \
+ python-pyopenssl \
+ python-re \
+ python-setuptools \
+ python-shell \
+ python-simplejson \
+ python-subprocess \
+ python-syslog \
+ python-terminal \
+ python-textutils \
+ python-tornado \
+ python-unixadmin \
+ python-xml \
+ python-html5lib \
+ bash \
+"
+
+SYSTEMD_SERVICE_${PN} = "gateone.service"
+INITSCRIPT_NAME = "gateone"
diff --git a/external/meta-python2/recipes-connectivity/python-gsocketpool/python-gsocketpool_0.1.6.bb b/external/meta-python2/recipes-connectivity/python-gsocketpool/python-gsocketpool_0.1.6.bb
new file mode 100644
index 00000000..6b6e15ae
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/python-gsocketpool/python-gsocketpool_0.1.6.bb
@@ -0,0 +1,13 @@
+
+SUMMARY = "A simple connection pool for gevent"
+DESCRIPTION = "creates a pool of connections that can be used with gevent"
+HOMEPAGE = "https://github.com/studio-ousia/gsocketpool"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4ba825394aec026b5f94edca44426859"
+DEPENDS += "${PYTHON_PN}-gevent"
+RDEPENDS_${PN} += "${PYTHON_PN}-gevent"
+
+SRC_URI[md5sum] = "49f5f292ef1b60944ae92ca426a5e550"
+SRC_URI[sha256sum] = "f2e2749aceadce6b27ca52e2b0a64af99797746a8681e1a2963f72007c14cb14"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-connectivity/python-h2/python-h2_3.1.1.bb b/external/meta-python2/recipes-connectivity/python-h2/python-h2_3.1.1.bb
new file mode 100644
index 00000000..33b4c079
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/python-h2/python-h2_3.1.1.bb
@@ -0,0 +1,11 @@
+
+DESCRIPTION = "HTTP/2 State-Machine based protocol implementation"
+HOMEPAGE = "https://github.com/python-hyper/hyper-h2"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b6b2f6bbe76528af543242d606c14851"
+
+SRC_URI[md5sum] = "950b5a62a2a608dc4547a01edf99aa8f"
+SRC_URI[sha256sum] = "b8a32bd282594424c0ac55845377eea13fa54fe4a8db012f3a198ed923dc3ab4"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-connectivity/python-hpack/python-hpack_3.0.0.bb b/external/meta-python2/recipes-connectivity/python-hpack/python-hpack_3.0.0.bb
new file mode 100644
index 00000000..01bc9193
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/python-hpack/python-hpack_3.0.0.bb
@@ -0,0 +1,10 @@
+DESCRIPTION = "Pure-Python HPACK header compression"
+HOMEPAGE = "https://github.com/python-hyper/hpack"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5bf1c68e73fbaec2b1687b7e71514393"
+
+SRC_URI[md5sum] = "556b0ae66180f54c2ce8029a0952088b"
+SRC_URI[sha256sum] = "8eec9c1f4bfae3408a3f30500261f7e6a65912dc138526ea054f9ad98892e9d2"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-connectivity/python-hyperframe/python-hyperframe_5.2.0.bb b/external/meta-python2/recipes-connectivity/python-hyperframe/python-hyperframe_5.2.0.bb
new file mode 100644
index 00000000..2ee04876
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/python-hyperframe/python-hyperframe_5.2.0.bb
@@ -0,0 +1,10 @@
+DESCRIPTION = "HTTP/2 framing layer for Python"
+HOMEPAGE = "https://github.com/python-hyper/hyperframe"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5bf1c68e73fbaec2b1687b7e71514393"
+
+SRC_URI[md5sum] = "6919183242feb26d8bce3b4cba81defd"
+SRC_URI[sha256sum] = "a9f5c17f2cc3c719b917c4f33ed1c61bd1f8dfac4b1bd23b7c80b3400971b41f"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-connectivity/python-mprpc/python-mprpc_0.1.17.bb b/external/meta-python2/recipes-connectivity/python-mprpc/python-mprpc_0.1.17.bb
new file mode 100644
index 00000000..62cafa83
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/python-mprpc/python-mprpc_0.1.17.bb
@@ -0,0 +1,14 @@
+SUMMARY = "A gevent based messagpack rpc library"
+DESCRIPTION = "mprpc is a fast implementation of the messagepack rpc protocol for python. \
+It is based on gevent for handling connections and enabling concurrent connections."
+HOMEPAGE = "https://github.com/studio-ousia/mprpc"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4ba825394aec026b5f94edca44426859"
+
+DEPENDS += "${PYTHON_PN}-gevent"
+RDEPENDS_${PN} += "${PYTHON_PN}-gevent ${PYTHON_PN}-msgpack ${PYTHON_PN}-gsocketpool"
+
+SRC_URI[md5sum] = "8d97961051422f3de315613434982d3b"
+SRC_URI[sha256sum] = "3589fd127482e291b1ec314d6f0e55cc13311c12932ace356d6178ea1ca28f6a"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-connectivity/python-networkmanager/python-networkmanager_2.1.bb b/external/meta-python2/recipes-connectivity/python-networkmanager/python-networkmanager_2.1.bb
new file mode 100644
index 00000000..53e2f9d1
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/python-networkmanager/python-networkmanager_2.1.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Easy communication with NetworkManager from Python"
+HOMEPAGE = "https://github.com/seveas/python-networkmanager"
+LICENSE = "Zlib"
+
+LIC_FILES_CHKSUM = "file://COPYING;md5=8d8bac174bf8422b151200e6cc78ebe4"
+
+SRC_URI[md5sum] = "f638d854a3639fb37c0e06d1092a771e"
+SRC_URI[sha256sum] = "aef1e34d98d7bec7cc368e0ca0f2e97493f9b5ebe6d7103f8f6460cfca3dc6fc"
+
+PYPI_PACKAGE = "python-networkmanager"
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "networkmanager python-dbus python-six"
+
+python() {
+ if 'networking-layer' not in d.getVar('BBFILE_COLLECTIONS').split():
+ raise bb.parse.SkipRecipe('Requires networking-layer to be present to provide networkmanager.')
+}
diff --git a/external/meta-python2/recipes-connectivity/python-priority/python-priority_1.3.0.bb b/external/meta-python2/recipes-connectivity/python-priority/python-priority_1.3.0.bb
new file mode 100644
index 00000000..5fdc4dba
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/python-priority/python-priority_1.3.0.bb
@@ -0,0 +1,10 @@
+DESCRIPTION = "A pure-Python implementation of the HTTP/2 priority tree"
+HOMEPAGE = "https://github.com/python-hyper/priority"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae57d8a09fc8b6b164d7357339619045"
+
+SRC_URI[md5sum] = "4f1ff52f7fa448e9d9cb46337ae86d1e"
+SRC_URI[sha256sum] = "6bc1961a6d7fcacbfc337769f1a382c8e746566aaa365e78047abe9f66b2ffbe"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-connectivity/python-pyconnman/python-pyconnman_0.2.0.bb b/external/meta-python2/recipes-connectivity/python-pyconnman/python-pyconnman_0.2.0.bb
new file mode 100644
index 00000000..770cc4b9
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/python-pyconnman/python-pyconnman_0.2.0.bb
@@ -0,0 +1,19 @@
+
+DESCRIPTION = "Python-based Network Connectivity Management"
+HOMEPAGE = "https://pypi.python.org/pypi/pyconnman/"
+LICENSE = "Apache-2.0"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+SRC_URI[md5sum] = "d60bdffbd9c920f005fdc5e05a8b94cd"
+SRC_URI[sha256sum] = "d3a63a039c82b08a1171b003eafa62c6f128aa4eaa1ce7a55a9401b48f9ad926"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ connman \
+ python-dbus \
+ python-future \
+ python-numbers \
+ python-pprint \
+"
diff --git a/external/meta-python2/recipes-connectivity/python-pyro4/python-pyro4_4.77.bb b/external/meta-python2/recipes-connectivity/python-pyro4/python-pyro4_4.77.bb
new file mode 100644
index 00000000..738cf867
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/python-pyro4/python-pyro4_4.77.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Python Remote Objects"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=cd13dafd4eeb0802bb6efea6b4a4bdbc"
+
+SRC_URI[md5sum] = "21f015ae93cf9ea2bbbc418a2267e9fb"
+SRC_URI[sha256sum] = "2bfe12a22f396474b0e57c898c7e2c561a8f850bf2055d8cf0f7119f0c7a523f"
+
+PYPI_PACKAGE = "Pyro4"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-selectors34 \
+ ${PYTHON_PN}-serpent \
+ ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-zlib \
+ "
diff --git a/external/meta-python2/recipes-connectivity/python-pytun/python-pytun_2.3.0.bb b/external/meta-python2/recipes-connectivity/python-pytun/python-pytun_2.3.0.bb
new file mode 100644
index 00000000..2bc6a7c9
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/python-pytun/python-pytun_2.3.0.bb
@@ -0,0 +1,11 @@
+
+SUMMARY = "Python TUN/TAP tunnel module"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=13f7629e8e4989b66b4a913ab05a91de"
+
+SRC_URI[md5sum] = "adcaeea56d0ed06814487cdbde32d198"
+SRC_URI[sha256sum] = "5ead86b3391acef239535ebcabeb04d2cdc6b40ab14580d28c6da193c2d1fe53"
+
+PYPI_PACKAGE = "python-pytun"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-connectivity/python-thrift/python-thrift_0.13.0.bb b/external/meta-python2/recipes-connectivity/python-thrift/python-thrift_0.13.0.bb
new file mode 100644
index 00000000..2d51619d
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/python-thrift/python-thrift_0.13.0.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Python bindings for the Apache Thrift RPC system"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=e95cd2f17c70d3180a2b361332319fe0"
+
+SRC_URI[md5sum] = "c3bc8d9a910d2c9ce26f2ad1f7c96762"
+SRC_URI[sha256sum] = "9af1c86bf73433afc6010ed376a6c6aca2b54099cc0d61895f640870a9ae7d89"
+
+inherit pypi setuptools
+
+# Use different filename to prevent conflicts with thrift itself
+PYPI_SRC_URI_append = ";downloadfilename=${BP}.${PYPI_PACKAGE_EXT}"
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-stringold \
+ ${PYTHON_PN}-threading \
+"
diff --git a/external/meta-python2/recipes-connectivity/python-txws/python-txws_0.9.1.bb b/external/meta-python2/recipes-connectivity/python-txws/python-txws_0.9.1.bb
new file mode 100644
index 00000000..f3631cda
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/python-txws/python-txws_0.9.1.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Twisted Web Sockets"
+HOMEPAGE = "https://github.com/MostAwesomeDude/txWS"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=76699830db7fa9e897f6a1ad05f98ec8"
+
+DEPENDS = "python-twisted python-six python-vcversioner python-six-native python-vcversioner-native"
+
+SRC_URI = "git://github.com/MostAwesomeDude/txWS.git"
+SRCREV= "88cf6d9b9b685ffa1720644bd53c742afb10a414"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools
+
diff --git a/external/meta-python2/recipes-connectivity/telepathy/telepathy-python-0.15.19/parallel_make.patch b/external/meta-python2/recipes-connectivity/telepathy/telepathy-python-0.15.19/parallel_make.patch
new file mode 100644
index 00000000..24882460
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/telepathy/telepathy-python-0.15.19/parallel_make.patch
@@ -0,0 +1,43 @@
+Add dependency of __init__.py
+
+Tasks must be done after exec of __init__, which creates the
+src/_generated directory that tasks are based on.
+
+Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
+
+Upstream-Status: Submitted
+(However it seems that this project is out of maintanence.)
+
+diff -ruN telepathy-python-0.15.19-orig/src/Makefile.am telepathy-python-0.15.19/src/Makefile.am
+--- telepathy-python-0.15.19-orig/src/Makefile.am 2011-03-10 08:51:49.000000000 +0800
++++ telepathy-python-0.15.19/src/Makefile.am 2011-03-10 08:54:45.000000000 +0800
+@@ -39,17 +39,17 @@
+ XSLTPROC_OPTS = --nonet --novalid --xinclude
+ tools_dir = $(top_srcdir)/tools
+
+-_generated/interfaces.py: $(tools_dir)/python-interfaces-generator.xsl $(wildcard $(spec_dir)/*.xml)
++_generated/interfaces.py: _generated/__init__.py $(tools_dir)/python-interfaces-generator.xsl $(wildcard $(spec_dir)/*.xml)
+ $(AM_V_GEN)$(XSLTPROC) $(XSLTPROC_OPTS) -o $@ \
+ $(tools_dir)/python-interfaces-generator.xsl \
+ $(spec_dir)/all.xml
+
+-_generated/constants.py: $(tools_dir)/python-constants-generator.xsl $(wildcard $(spec_dir)/*.xml)
++_generated/constants.py: _generated/__init__.py $(tools_dir)/python-constants-generator.xsl $(wildcard $(spec_dir)/*.xml)
+ $(AM_V_GEN)$(XSLTPROC) $(XSLTPROC_OPTS) -o $@ \
+ $(tools_dir)/python-constants-generator.xsl \
+ $(spec_dir)/all.xml
+
+-_generated/errors.py: $(tools_dir)/python-errors-generator.xsl $(wildcard $(spec_dir)/*.xml)
++_generated/errors.py: _generated/__init__.py $(tools_dir)/python-errors-generator.xsl $(wildcard $(spec_dir)/*.xml)
+ $(AM_V_GEN)$(XSLTPROC) $(XSLTPROC_OPTS) -o $@ \
+ $(tools_dir)/python-errors-generator.xsl \
+ $(spec_dir)/all.xml
+@@ -58,7 +58,7 @@
+ $(AM_V_GEN)$(mkdir_p) $(dir $@)
+ @echo "# Placeholder for package" > $@
+
+-_generated/%.py: $(tools_dir)/spec-to-python.xsl $(spec_dir)/%.xml
++_generated/%.py: _generated/__init__.py $(tools_dir)/spec-to-python.xsl $(spec_dir)/%.xml
+ $(AM_V_GEN)$(XSLTPROC) $(XSLTPROC_OPTS) -o $@ \
+ $(tools_dir)/spec-to-python.xsl \
+ $(spec_dir)/$*.xml
diff --git a/external/meta-python2/recipes-connectivity/telepathy/telepathy-python-0.15.19/remove_duplicate_install.patch b/external/meta-python2/recipes-connectivity/telepathy/telepathy-python-0.15.19/remove_duplicate_install.patch
new file mode 100644
index 00000000..df95a4c1
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/telepathy/telepathy-python-0.15.19/remove_duplicate_install.patch
@@ -0,0 +1,26 @@
+commit f6c67662145de889055a86a6b3b12c70a45fc8d5
+Author: Dongxiao Xu <dongxiao.xu@intel.com>
+Date: Wed Sep 7 16:02:20 2011 +0800
+
+ Avoid duplicated installation of errors.py
+
+ newer version of autotools don't seem to like listing files to install
+ twice. Remove one errors.py from the installation list.
+
+ Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
+
+ Upstream-Status: Inappropirate [upstream inactive]
+
+diff --git a/src/Makefile.am b/src/Makefile.am
+index 5c27dfe..7536e43 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -11,7 +11,7 @@ telepathy_PYTHON = \
+
+ # telepathy._generated.* auto-generated modules
+ spec_dir = $(top_srcdir)/spec
+-spec_files := $(patsubst $(spec_dir)%.xml,_generated%.py,$(wildcard $(spec_dir)/*.xml))
++spec_files := $(filter-out _generated/errors.py, $(patsubst $(spec_dir)%.xml,_generated%.py,$(wildcard $(spec_dir)/*.xml)))
+
+ BUILT_SOURCES = \
+ _generated/interfaces.py \
diff --git a/external/meta-python2/recipes-connectivity/telepathy/telepathy-python-0.15.19/telepathy-python_fix_for_automake_1.12.patch b/external/meta-python2/recipes-connectivity/telepathy/telepathy-python-0.15.19/telepathy-python_fix_for_automake_1.12.patch
new file mode 100644
index 00000000..f613fdce
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/telepathy/telepathy-python-0.15.19/telepathy-python_fix_for_automake_1.12.patch
@@ -0,0 +1,26 @@
+Upstream-Status: Pending
+
+automake 1.12 has deprecated use of mkdir_p, and it recommends
+use of MKDIR_P instead. Changed the code to avoid these kind
+of warning-errors.
+
+| make[1]: _generated/: Command not found
+| make[1]: *** [_generated/__init__.py] Error 127
+| make[1]: Leaving directory `/srv/home/nitin/builds2/build0/tmp/work/i586-poky-linux/telepathy-python-0.15.19-r4/telepathy-python-0.15.19/src'
+| make: *** [all-recursive] Error 1
+
+Signed-Off-By: Nitin A Kamble <nitin.a.kamble@intel.com>
+2012/07/10
+Index: telepathy-python-0.15.19/src/Makefile.am
+===================================================================
+--- telepathy-python-0.15.19.orig/src/Makefile.am
++++ telepathy-python-0.15.19/src/Makefile.am
+@@ -55,7 +55,7 @@ _generated/errors.py: _generated/__init_
+ $(spec_dir)/all.xml
+
+ _generated/__init__.py:
+- $(AM_V_GEN)$(mkdir_p) $(dir $@)
++ $(AM_V_GEN)$(MKDIR_P) $(dir $@)
+ @echo "# Placeholder for package" > $@
+
+ _generated/%.py: _generated/__init__.py $(tools_dir)/spec-to-python.xsl $(spec_dir)/%.xml
diff --git a/external/meta-python2/recipes-connectivity/telepathy/telepathy-python_0.15.19.bb b/external/meta-python2/recipes-connectivity/telepathy/telepathy-python_0.15.19.bb
new file mode 100644
index 00000000..b7aea24a
--- /dev/null
+++ b/external/meta-python2/recipes-connectivity/telepathy/telepathy-python_0.15.19.bb
@@ -0,0 +1,32 @@
+SUMMARY = "Telepathy IM framework - Python package"
+HOMEPAGE = "http://telepathy.freedesktop.org/wiki/"
+LICENSE = "LGPLv2.1+"
+LIC_FILES_CHKSUM = "file://COPYING;md5=2d5025d4aa3495befef8f17206a5b0a1 \
+ file://src/utils.py;beginline=1;endline=17;md5=9a07d1a9791a7429a14e7b25c6c86822"
+
+DEPENDS = "libxslt-native"
+RDEPENDS_${PN} += "python-dbus"
+
+SRC_URI = "http://telepathy.freedesktop.org/releases/${BPN}/${BPN}-${PV}.tar.gz \
+ file://parallel_make.patch \
+ file://remove_duplicate_install.patch \
+ file://telepathy-python_fix_for_automake_1.12.patch"
+
+PR = "r6"
+
+inherit autotools pythonnative
+
+SRC_URI[md5sum] = "f7ca25ab3c88874015b7e9728f7f3017"
+SRC_URI[sha256sum] = "244c0e1bf4bbd78ae298ea659fe10bf3a73738db550156767cc2477aedf72376"
+
+FILES_${PN} += "\
+ ${libdir}/python*/site-packages/telepathy/*.py \
+ ${libdir}/python*/site-packages/telepathy/*/*.py \
+"
+
+do_install_append () {
+ rm -f ${D}${libdir}/python*/site-packages/telepathy/*.pyc
+ rm -f ${D}${libdir}/python*/site-packages/telepathy/*.pyo
+ rm -f ${D}${libdir}/python*/site-packages/telepathy/*/*.pyc
+ rm -f ${D}${libdir}/python*/site-packages/telepathy/*/*.pyo
+}
diff --git a/external/meta-python2/recipes-core/images/meta-python2-image-base.bb b/external/meta-python2/recipes-core/images/meta-python2-image-base.bb
new file mode 100644
index 00000000..6b43defe
--- /dev/null
+++ b/external/meta-python2/recipes-core/images/meta-python2-image-base.bb
@@ -0,0 +1,7 @@
+SUMMARY = "meta-python2 build test image"
+
+IMAGE_INSTALL = "packagegroup-core-boot"
+
+LICENSE = "MIT"
+
+inherit core-image
diff --git a/external/meta-python2/recipes-core/images/meta-python2-image.bb b/external/meta-python2/recipes-core/images/meta-python2-image.bb
new file mode 100644
index 00000000..9fe75ea0
--- /dev/null
+++ b/external/meta-python2/recipes-core/images/meta-python2-image.bb
@@ -0,0 +1,5 @@
+require meta-python2-image-base.bb
+
+SUMMARY = "meta-python2 build test image"
+
+IMAGE_INSTALL += "packagegroup-meta-python2"
diff --git a/external/meta-python2/recipes-core/images/meta-python2-ptest-image.bb b/external/meta-python2/recipes-core/images/meta-python2-ptest-image.bb
new file mode 100644
index 00000000..ddf56641
--- /dev/null
+++ b/external/meta-python2/recipes-core/images/meta-python2-ptest-image.bb
@@ -0,0 +1,5 @@
+require meta-python2-image-base.bb
+
+SUMMARY = "meta-python2 ptest test image"
+
+IMAGE_INSTALL += "packagegroup-meta-python2-ptest"
diff --git a/external/meta-python2/recipes-core/packagegroups/packagegroup-meta-python2.bb b/external/meta-python2/recipes-core/packagegroups/packagegroup-meta-python2.bb
new file mode 100644
index 00000000..0eb9b8db
--- /dev/null
+++ b/external/meta-python2/recipes-core/packagegroups/packagegroup-meta-python2.bb
@@ -0,0 +1,91 @@
+SUMMARY = "Meta-oe ptest packagegroups"
+
+inherit packagegroup
+
+PROVIDES = "${PACKAGES}"
+PACKAGES = ' \
+ packagegroup-meta-python2 \
+'
+
+RDEPENDS_packagegroup-meta-python2 = "\
+ packagegroup-meta-python2-extended \
+ packagegroup-meta-python2-connectivity \
+"
+
+RDEPENDS_packagegroup-meta-python2 = "\
+ python-psutil python-certifi python-flask python-pyroute2 python-pyopenssl python-pylint \
+ python-semver python-wrapt python-networkx python-behave python-dominate python-flask-user \
+ python-attrs python-humanize python-six python-flask-login python-zopeinterface python-sijax \
+ python-pyinotify python-stevedore python-pyjwt python-webdav python-twisted python-flask-sijax \
+ python-functools32 python-javaobj-py3 python-pygpgme python-future python-attr \
+ python-flask-xstatic python-m2crypto python-hyperlink python-imaging python-idna python-jinja2 \
+ python-can python-flask-bcrypt python-requests python-paste python-flask-script python-serpent \
+ python-cryptography python-pysmi python-xlrd python-appdirs python-jsonpatch python-bcrypt \
+ python-ndg-httpsclient python-pytest python-linecache2 python-visitor python-backports-abc \
+ python-setuptools-scm python-evdev python-pyjks python-jsonpointer python-cheetah python-gevent \
+ python-smbus python-sqlalchemy python-scrypt python-werkzeug python-anyjson python-pexpect \
+ python-robotframework-seriallibrary python-pyalsaaudio python-pytest-helpers-namespace \
+ python-alembic python-flask-pymongo python-slip-dbus python-pydbus python-automat python-rfc3987 \
+ python-tzlocal python-backports-ssl python-subprocess32 python-asn1crypto python-pybind11 \
+ python-ptyprocess python-babel python-passlib python-sdnotify \
+ python-lazy-object-proxy python-cryptography-vectors python-crcmod python-pyusb python-vobject \
+ python-webcolors python-pyparsing python-beautifulsoup4 python-cffi python-tornado-redis \
+ python-itsdangerous python-pyasn1-modules python-netaddr python-vcversioner \
+ python-sh python-greenlet python-paho-mqtt python-traceback2 python-gdata python-dbusmock \
+ python-whoosh python-lockfile python-isort python-wtforms python-feedparser python-flask-restful \
+ python-pysnmp python-flask-babel python-pytest-tempdir python-flask-nav python-pyzmq python-pyyaml \
+ python-protobuf python-pluggy python-jsonschema python-msgpack \
+ python-periphery python-pint python-pycryptodomex python-yappi python-pycrypto python-pretend \
+ python-pyserial python-pyiface python-docutils python-grpcio-tools python-django-south \
+ python-backports-functools-lru-cache python-py python-click python-flask-migrate \
+ python-pyudev python-pystache python-blinker python-prompt-toolkit python-lxml \
+ python-unidiff python-inflection python-twofish python-prettytable python-webencodings \
+ python-mock python-pyexpect python-dnspython python-pysocks python-pynetlinux \
+ python-daemon python-djangorestframework python-typing python-monotonic python-sparts \
+ python-enum34 python-pyperclip python-flask-uploads python-pbr python-parse python-pyflakes \
+ python-pyhamcrest python-mako python-incremental python-tornado python-xstatic-font-awesome \
+ python-cmd2 python-strict-rfc3339 python-pycodestyle python-xstatic python-snakefood \
+ python-pybluez python-flask-navigation python-pyfirmata python-pymongo python-pysqlite \
+ python-progress python-flask-sqlalchemy python-pymisp python-pip python-ujson python-ply \
+ python-pep8 python-dateutil python-pycparser python-daemonize python-astroid python-pyrex \
+ python-markupsafe python-pytest-runner python-grpcio python-mccabe python-pytz python-selectors34 \
+ python-cython python-chardet python-editor python-flask-bootstrap python-html5lib \
+ python-singledispatch python-redis python-flask-mail python-funcsigs python-snimpy python-pyasn1 \
+ python-decorator python-urllib3 python-feedformatter python-iso8601 \
+ python-numeric python-robotframework python-django python-simplejson python-wcwidth \
+ python-configparser python-epydoc python-intervals python-speaklater \
+ python-aws-iot-device-sdk-python python-constantly python-bitarray python-flask-wtf \
+ python-parse-type python-ipaddress python-dbus python-cpuset python-distutils-extra \
+ python-futures python-jsmin python-pygobject python-pytoml python-six python-which \
+ python-netifaces python-configargparse python-sqlparse python-soupsieve python-wrapt \
+ python-deprecated python-booleanpy python-docker-pycreds python-websocket-client \
+ python-docker \
+ ${@bb.utils.contains("DISTRO_FEATURES", "pam", "python-pam pamela", "", d)} \
+ ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "python-systemd", "", d)} \
+"
+
+RDEPENDS_packagegroup-meta-python2-extended = "\
+ python-cson \
+ python-pyephem \
+ python-pyparted \
+ python-pywbem \
+"
+
+RDEPENDS_packagegroup-meta-python2-connectivity = "\
+ python-gsocketpool \
+ python-mprpc \
+ python-networkmanager \
+ python-pyconnman \
+ python-pyro4 \
+ python-pytun \
+ python-thrift \
+ python-txws \
+"
+
+RDEPENDS_packagegroup-meta-python2-ptest = "\
+ python-booleanpy-ptest \
+ python-cryptography-ptest \
+ python-pygpgme-ptest \
+"
+
+EXCLUDE_FROM_WORLD = "1"
diff --git a/external/meta-python2/recipes-devtools/gyp/gyp-py2_git.bb b/external/meta-python2/recipes-devtools/gyp/gyp-py2_git.bb
new file mode 100644
index 00000000..73d87492
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/gyp/gyp-py2_git.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "GYP is a Meta-Build system: a build system that generates other build systems."
+HOMEPAGE = "https://gyp.gsrc.io/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ab828cb8ce4c62ee82945a11247b6bbd"
+SECTION = "devel"
+
+SRC_URI = "git://chromium.googlesource.com/external/gyp;protocol=https"
+SRCREV = "fcd686f1880fa52a1ee78d3e98af1b88cb334528"
+
+S = "${WORKDIR}/git"
+PV = "0.1+git${SRCPV}"
+
+BBCLASSEXTEND = "native nativesdk"
+inherit setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-alembic_1.3.2.bb b/external/meta-python2/recipes-devtools/python/python-alembic_1.3.2.bb
new file mode 100644
index 00000000..6e53ce8b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-alembic_1.3.2.bb
@@ -0,0 +1,16 @@
+DESCRIPTION = "A database migration tool for SQLAlchemy"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=28aaf14a6592d14dbfb2f4abd597aa27"
+
+SRC_URI[md5sum] = "3d7584a8fb0203ec82b90baa726d2bd9"
+SRC_URI[sha256sum] = "3b0cb1948833e062f4048992fbc97ecfaaaac24aaa0d83a1202a99fb58af8c6d"
+
+PYPI_PACKAGE = "alembic"
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-dateutil \
+ ${PYTHON_PN}-editor \
+ ${PYTHON_PN}-mako \
+ ${PYTHON_PN}-sqlalchemy \
+"
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-anyjson_0.3.3.bb b/external/meta-python2/recipes-devtools/python/python-anyjson_0.3.3.bb
new file mode 100644
index 00000000..4fe2edba
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-anyjson_0.3.3.bb
@@ -0,0 +1,13 @@
+SUMMARY = "Wraps the best available JSON implementation available in a common interface"
+DESCRIPTION = "Anyjson loads whichever is the fastest JSON module installed and \
+provides a uniform API regardless of which JSON implementation is used."
+HOMEPAGE = "https://bitbucket.org/runeh/anyjson"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=989aa97e73c912a83a3c873fa11deb08"
+
+inherit pypi setuptools
+
+SRC_URI[md5sum] = "2ea28d6ec311aeeebaf993cb3008b27c"
+SRC_URI[sha256sum] = "37812d863c9ad3e35c0734c42e0bf0320ce8c3bed82cd20ad54cb34d158157ba"
+
+RDEPENDS_${PN} += "${PYTHON_PN}-simplejson"
diff --git a/external/meta-python2/recipes-devtools/python/python-appdirs_1.4.3.bb b/external/meta-python2/recipes-devtools/python/python-appdirs_1.4.3.bb
new file mode 100644
index 00000000..6f6906b9
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-appdirs_1.4.3.bb
@@ -0,0 +1,13 @@
+SUMMARY = "A small Python module for determining appropriate + platform-specific dirs"
+DESCRIPTION = "A small Python module for determining appropriate + \
+platform-specific dirs, e.g. a 'user data dir'."
+HOMEPAGE = "http://github.com/ActiveState/appdirs"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=31625363c45eb0c67c630a2f73e438e4"
+
+SRC_URI[md5sum] = "44c679904082a2133f5566c8a0d3ab42"
+SRC_URI[sha256sum] = "9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-asn1crypto_1.3.0.bb b/external/meta-python2/recipes-devtools/python/python-asn1crypto_1.3.0.bb
new file mode 100644
index 00000000..2954eef6
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-asn1crypto_1.3.0.bb
@@ -0,0 +1,30 @@
+SUMMARY = "A fast, pure Python library for parsing and serializing ASN.1 structures"
+DESCRIPTION = "Fast ASN.1 parser and serializer with definitions for private \
+keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, \
+PKCS#12, PKCS#5, X.509 and TSP"
+HOMEPAGE = "https://github.com/wbond/asn1crypto"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=7439e38f5e04ff62fae436184786b7ca"
+
+SRC_URI[md5sum] = "daad112940181917e3ff169b47b9bd9a"
+SRC_URI[sha256sum] = "5a215cb8dc12f892244e3a113fe05397ee23c5c4ca7a69cd6e69811755efc42d"
+
+PYPI_PACKAGE = "asn1crypto"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target += " \
+ ${PYTHON_PN}-codecs \
+ ${PYTHON_PN}-crypt \
+ ${PYTHON_PN}-ctypes \
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-textutils \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-astroid_2.3.3.bb b/external/meta-python2/recipes-devtools/python/python-astroid_2.3.3.bb
new file mode 100644
index 00000000..bbd10957
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-astroid_2.3.3.bb
@@ -0,0 +1,50 @@
+
+SUMMARY = "An abstract syntax tree for Python with inference support."
+DESCRIPTION = "The aim of this module is to provide a common base \
+representation of python source code. It is currently the library powering \
+pylint’s capabilities.\
+\
+It provides a compatible representation which comes from the _ast module. It \
+rebuilds the tree generated by the builtin _ast module by recursively walking \
+down the AST and building an extended ast. The new node classes have \
+additional methods and attributes for different usages. They include some \
+support for static inference and local name scopes. Furthermore, astroid can \
+also build partial trees by inspecting living objects."
+HOMEPAGE = "https://pypi.python.org/pypi/astroid"
+SECTION = "devel/python"
+
+LICENSE = "LGPL-2.1"
+LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
+
+SRC_URI[md5sum] = "5f3d73d82d1753b59bb49a6bc6046dee"
+SRC_URI[sha256sum] = "71ea07f44df9568a75d0f354c49143a4575d90645e9fead6dfb52c26a85ed13a"
+
+DEPENDS += "${PYTHON_PN}-pytest-runner-native"
+
+PACKAGES =+ "${PN}-tests"
+
+inherit pypi setuptools
+
+FILES_${PN}-tests += " \
+ ${PYTHON_SITEPACKAGES_DIR}/astroid/test* \
+ ${PYTHON_SITEPACKAGES_DIR}/astroid/__pycache__/test* \
+"
+
+RDEPENDS_${PN}_class-target += "\
+ ${PYTHON_PN}-backports-functools-lru-cache \
+ ${PYTHON_PN}-distutils \
+ ${PYTHON_PN}-enum34 \
+ ${PYTHON_PN}-lazy-object-proxy \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-re \
+ ${PYTHON_PN}-setuptools \
+ ${PYTHON_PN}-singledispatch \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-wrapt \
+"
+
+RDEPENDS_${PN}-tests_class-target += "\
+ ${PYTHON_PN}-unittest \
+ ${PYTHON_PN}-xml \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-atomicwrites_1.3.0.bb b/external/meta-python2/recipes-devtools/python/python-atomicwrites_1.3.0.bb
new file mode 100644
index 00000000..6b0993a8
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-atomicwrites_1.3.0.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Atomic file writes."
+DESCRIPTION = "Powerful Python library for atomic file writes"
+HOMEPAGE = "https://github.com/untitaker/python-atomicwrites"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=91cc36cfafeefb7863673bcfcb1d4da4"
+
+SRC_URI[md5sum] = "ce11f780a4ce0fce8a55d64494a88178"
+SRC_URI[sha256sum] = "75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-attr_0.3.1.bb b/external/meta-python2/recipes-devtools/python/python-attr_0.3.1.bb
new file mode 100644
index 00000000..88edf135
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-attr_0.3.1.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Simple decorator to set attributes of target function or class in a DRY way"
+DESCRIPTION = "Simple decorator to set attributes of target function or class in a DRY way"
+HOMEPAGE = "https://github.com/denis-ryzhkov/attr"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=59805a0285f4d2b6abdedae73db4f5c1"
+
+SRC_URI[md5sum] = "68b9a503991241fb2df28488686b0e1e"
+SRC_URI[sha256sum] = "9091548058d17f132596e61fa7518e504f76b9a4c61ca7d86e1f96dbf7d4775d"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-attrs_19.3.0.bb b/external/meta-python2/recipes-devtools/python/python-attrs_19.3.0.bb
new file mode 100644
index 00000000..505256f6
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-attrs_19.3.0.bb
@@ -0,0 +1,26 @@
+SUMMARY = "Classes Without Boilerplate"
+DESCRIPTION = "attrs is the Python package that will bring back the joy of \
+writing classes by relieving you from the drudgery of implementing object \
+protocols (aka dunder methods).\
+\
+Its main goal is to help you to write concise and correct software without \
+slowing down your code."
+HOMEPAGE = "http://www.attrs.org/"
+BUGTRACKER = "https://github.com/python-attrs/attrs/issues"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d4ab25949a73fe7d4fdee93bcbdbf8ff"
+
+SRC_URI[sha256sum] = "f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"
+SRC_URI[md5sum] = "5b2db50fcc31be34d32798183c9bd062"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target += " \
+ ${PYTHON_PN}-crypt \
+ ${PYTHON_PN}-ctypes \
+ ${PYTHON_PN}-subprocess \
+"
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-automat/0001-setup.py-remove-the-dependency-on-m2r.patch b/external/meta-python2/recipes-devtools/python/python-automat/0001-setup.py-remove-the-dependency-on-m2r.patch
new file mode 100644
index 00000000..c29b659b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-automat/0001-setup.py-remove-the-dependency-on-m2r.patch
@@ -0,0 +1,50 @@
+From 33b70266930c9093712173c4e0c419815b55e313 Mon Sep 17 00:00:00 2001
+From: Derek Straka <derek@asterius.io>
+Date: Fri, 22 Dec 2017 09:07:00 -0500
+Subject: [PATCH] setup.py: remove the dependency on m2r
+
+The dependency on m2r is removed here as it only provides the
+long_description value that is optional. This item is just the
+text that would be present on PyPi, so it doesn't provide much
+value in this case
+
+Upstream-Status: Inappropriate (OE specific)
+
+Signed-off-by: Derek Straka <derek@asterius.io>
+
+---
+ setup.py | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index d360c64..7b4180a 100644
+--- a/setup.py
++++ b/setup.py
+@@ -4,14 +4,6 @@ Setup file for automat
+
+ from setuptools import setup, find_packages
+
+-try:
+- from m2r import parse_from_file
+- long_description = parse_from_file('README.md')
+-except(IOError, ImportError):
+- print("\n\n!!! m2r not found, long_description is bad, don't upload this to PyPI !!!\n\n")
+- import io
+- long_description = io.open('README.md', encoding="utf-8").read()
+-
+ setup(
+ name='Automat',
+ use_scm_version=True,
+@@ -19,12 +11,10 @@ setup(
+ description="""
+ Self-service finite-state machines for the programmer on the go.
+ """.strip(),
+- long_description=long_description,
+ packages=find_packages(exclude=[]),
+ package_dir={'automat': 'automat'},
+ setup_requires=[
+ 'setuptools-scm',
+- 'm2r',
+ ],
+ install_requires=[
+ "attrs>=16.1.0",
diff --git a/external/meta-python2/recipes-devtools/python/python-automat_0.8.0.bb b/external/meta-python2/recipes-devtools/python/python-automat_0.8.0.bb
new file mode 100644
index 00000000..404fa583
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-automat_0.8.0.bb
@@ -0,0 +1,28 @@
+SUMMARY = "Self-service finite-state machines for the programmer on the go"
+DESCRIPTION = "Automat is a library for concise, idiomatic Python expression \
+of finite-state automata (particularly deterministic finite-state transducers)."
+HOMEPAGE = "https://github.com/glyph/Automat"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4ad213bcca81688e94593e5f60c87477"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-automat:"
+
+SRC_URI[md5sum] = "47e980a48201a1dabe37fa11f0187013"
+SRC_URI[sha256sum] = "269a09dfb063a3b078983f4976d83f0a0d3e6e7aaf8e27d8df1095e09dc4a484"
+
+SRC_URI_append = " \
+ file://0001-setup.py-remove-the-dependency-on-m2r.patch \
+"
+
+DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
+
+PYPI_PACKAGE = "Automat"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-attrs \
+ ${PYTHON_PN}-six \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-aws-iot-device-sdk-python_1.4.7.bb b/external/meta-python2/recipes-devtools/python/python-aws-iot-device-sdk-python_1.4.7.bb
new file mode 100644
index 00000000..a4d3a47d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-aws-iot-device-sdk-python_1.4.7.bb
@@ -0,0 +1,46 @@
+SUMMARY = "SDK for connecting to AWS IoT using Python."
+DESCRIPTION = "SDK for connecting to AWS IoT using Python."
+HOMEPAGE = "https://github.com/aws/aws-iot-device-sdk-python"
+SECTION = "devel/python"
+
+LICENSE = "Apache-2.0 & (EPL-1.0 | EDL-1.0)"
+LICENSE_${PN}-examples = "Apache-2.0"
+LIC_FILES_CHKSUM = "\
+ file://LICENSE.txt;md5=9ac49901b833e769c7d6f21e8dbd7b30 \
+ file://AWSIoTPythonSDK/core/protocol/paho/client.py;endline=14;md5=5a3c8a1a4bb71bd934f450ecff972ad9 \
+"
+
+SRC_URI[md5sum] = "2b3df629827d8bc18ca4d927b4885a17"
+SRC_URI[sha256sum] = "7e67c8cfeee8a1c8fd251bcc418de9d4dca697753565c9a9e614525179d9555d"
+
+inherit pypi setuptools
+
+PYPI_PACKAGE = "AWSIoTPythonSDK"
+
+do_install_append() {
+ install -d -m0755 ${D}${datadir}/${BPN}/examples
+ cp --preserve=mode,timestamps -R ${S}/samples/* ${D}${datadir}/${BPN}/examples
+ # this requires the full blown AWS Python SDK
+ rm -r ${D}${datadir}/${BPN}/examples/basicPubSub
+}
+
+PACKAGES =+ "${PN}-examples"
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-crypt \
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-math \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-threading \
+"
+
+RDEPENDS_${PN}-examples += "${PN} ${PYTHON_PN}-argparse"
+
+FILES_${PN}-examples = "${datadir}/${BPN}/examples"
+
+BBCLASSEXTEND = "native nativesdk"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-babel_2.7.0.bb b/external/meta-python2/recipes-devtools/python/python-babel_2.7.0.bb
new file mode 100644
index 00000000..dba00543
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-babel_2.7.0.bb
@@ -0,0 +1,31 @@
+SUMMARY = "Internationalization utilities"
+DESCRIPTION = "A collection of tools for internationalizing Python applications"
+HOMEPAGE = "http://babel.edgewall.org/"
+SECTION = "devel/python"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=942469df9305abb1c59e95f778310384"
+
+SRC_URI[md5sum] = "83c158b7dae9135750a7cf204e6e2eea"
+SRC_URI[sha256sum] = "e86135ae101e31e2c8ec20a4e0c5220f4eed12487d5cf3f78be7e98d3a57fc28"
+
+PYPI_PACKAGE = "Babel"
+
+inherit pypi setuptools
+
+CLEANBROKEN = "1"
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-codecs \
+ ${PYTHON_PN}-difflib \
+ ${PYTHON_PN}-distutils \
+ ${PYTHON_PN}-netserver \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-pickle \
+ ${PYTHON_PN}-pytz \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-threading \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-backports-abc_0.5.bb b/external/meta-python2/recipes-devtools/python/python-backports-abc_0.5.bb
new file mode 100644
index 00000000..b588a31a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-backports-abc_0.5.bb
@@ -0,0 +1,11 @@
+SUMMARY = "collections.abc from Python 3.5"
+DESCRIPTION = "A backport of recent additions to the 'collections.abc' module"
+LICENSE = "PSF"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=dd98d01d471fac8d8dbdd975229dba03"
+
+PYPI_PACKAGE = "backports_abc"
+
+SRC_URI[md5sum] = "7d1936ec183a3586290adf60f6f96764"
+SRC_URI[sha256sum] = "033be54514a03e255df75c5aee8f9e672f663f93abb723444caec8fe43437bde"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-backports-functools-lru-cache_1.6.1.bb b/external/meta-python2/recipes-devtools/python/python-backports-functools-lru-cache_1.6.1.bb
new file mode 100644
index 00000000..aee130f3
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-backports-functools-lru-cache_1.6.1.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Backport of functools.lru_cache from Python 3.3"
+HOMEPAGE = "https://github.com/jaraco/backports.functools_lru_cache"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a33f38bbf47d48c70fe0d40e5f77498e"
+
+PYPI_PACKAGE = "backports.functools_lru_cache"
+
+SRC_URI[md5sum] = "103000b21a8e683647e2ce41929f2a9d"
+SRC_URI[sha256sum] = "8fde5f188da2d593bd5bc0be98d9abc46c95bb8a9dde93429570192ee6cc2d4a"
+
+DEPENDS += "python-setuptools-scm-native"
+
+inherit setuptools pypi python-backports-init
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-pkgutil \
+ ${PYTHON_PN}-pickle \
+ ${PYTHON_PN}-threading \
+ "
+
+do_install() {
+ install -d ${D}${PYTHON_SITEPACKAGES_DIR}/backports
+ install ${B}/backports/functools_lru_cache.py ${D}${PYTHON_SITEPACKAGES_DIR}/backports/
+}
+
+FILES_${PN} = "${PYTHON_SITEPACKAGES_DIR}/backports/functools_lru_cache.py"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-backports-init/backports/__init__.py b/external/meta-python2/recipes-devtools/python/python-backports-init/backports/__init__.py
new file mode 100644
index 00000000..febdb2f8
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-backports-init/backports/__init__.py
@@ -0,0 +1,5 @@
+# A Python "namespace package" http://www.python.org/dev/peps/pep-0382/
+# This always goes inside of a namespace package's __init__.py
+
+from pkgutil import extend_path
+__path__ = extend_path(__path__, __name__)
diff --git a/external/meta-python2/recipes-devtools/python/python-backports-init_1.0.bb b/external/meta-python2/recipes-devtools/python/python-backports-init_1.0.bb
new file mode 100644
index 00000000..8b226aac
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-backports-init_1.0.bb
@@ -0,0 +1,27 @@
+SUMMARY = "Helper package to avoid backports/__init__.py conflicts"
+DETAIL = "backports packages in python2 suffer from a flaw in the namespace \
+implementation and can conflict with each other. For OE purposes, at least \
+fix the conflicting install of .../site-packages/backports/__init__.py"
+AUTHOR = "Tim Orling <ticotimo@gmail.com>"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
+
+SRC_URI = "file://backports/__init__.py"
+
+inherit python-dir
+
+# provide to avoid warnings
+do_compile() {
+ :
+}
+
+do_install() {
+ install -d ${D}${PYTHON_SITEPACKAGES_DIR}/backports
+ install ${WORKDIR}/backports/__init__.py ${D}${PYTHON_SITEPACKAGES_DIR}/backports/
+}
+
+FILES_${PN} = "${PYTHON_SITEPACKAGES_DIR}/backports/__init__.py"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-backports-ssl_3.7.0.1.bb b/external/meta-python2/recipes-devtools/python/python-backports-ssl_3.7.0.1.bb
new file mode 100644
index 00000000..126d0ee5
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-backports-ssl_3.7.0.1.bb
@@ -0,0 +1,19 @@
+SUMMARY = "The ssl.match_hostname() function from Python 3.4"
+DESCRIPTION = "The Secure Sockets layer is only actually secure if you check the hostname in the \
+certificate returned by the server to which you are connecting, and verify that it matches to hostname \
+that you are trying to reach. But the matching logic, defined in RFC2818, can be a bit tricky to implement \
+on your own. So the ssl package in the Standard Library of Python 3.2 and greater now includes a \
+match_hostname() function for performing this check instead of requiring every application to \
+implement the check separately. This backport brings match_hostname() to users of earlier versions of Python"
+
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=b2adbe8bfdeb625c9a01afd9aaa66619"
+
+SRC_URI[md5sum] = "32d2f593af01a046bec3d2f5181a420a"
+SRC_URI[sha256sum] = "bb82e60f9fbf4c080eabd957c39f0641f0fc247d9a16e31e26d594d8f42b9fd2"
+
+PYPI_PACKAGE = "backports.ssl_match_hostname"
+
+inherit pypi setuptools python-backports-init
+
+RDEPENDS_${PN} += "${PYTHON_PN}-pkgutil"
diff --git a/external/meta-python2/recipes-devtools/python/python-bcrypt_3.1.7.bb b/external/meta-python2/recipes-devtools/python/python-bcrypt_3.1.7.bb
new file mode 100644
index 00000000..4e473dd8
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-bcrypt_3.1.7.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Modern password hashing for your software and your servers."
+DESCRIPTION = "Good password hashing for your software and your servers"
+HOMEPAGE = "https://github.com/pyca/bcrypt/"
+SECTION = "devel/python"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8f7bb094c7232b058c7e9f2e431f389c"
+
+SRC_URI[md5sum] = "5d6f93b575ce52470af37a8e7dce76fe"
+SRC_URI[sha256sum] = "0b0069c752ec14172c5f78208f1863d7ad6755a6fae6fe76ec2c80d13be41e42"
+
+DEPENDS += "${PYTHON_PN}-cffi-native"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target += "\
+ ${PYTHON_PN}-cffi \
+ ${PYTHON_PN}-ctypes \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-subprocess \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-beautifulsoup4_4.8.2.bb b/external/meta-python2/recipes-devtools/python/python-beautifulsoup4_4.8.2.bb
new file mode 100644
index 00000000..9f9065e2
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-beautifulsoup4_4.8.2.bb
@@ -0,0 +1,27 @@
+SUMMARY = "Screen-scraping library"
+DESCRIPTION = "Beautiful Soup is a library that makes it easy to scrape \
+information from web pages. It sits atop an HTML or XML parser, providing \
+Pythonic idioms for iterating, searching, and modifying the parse tree."
+HOMEPAGE = " https://www.crummy.com/software/BeautifulSoup/bs4"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://COPYING.txt;md5=f2d38d8a40bf73fd4b3d16ca2e5882d1"
+
+SRC_URI[md5sum] = "5dbdb56c009e4632bae7bed1b385804b"
+SRC_URI[sha256sum] = "05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "\
+ ${PYTHON_PN}-html5lib \
+ ${PYTHON_PN}-lxml \
+ ${PYTHON_PN}-soupsieve \
+"
+
+RDEPENDS_${PN}_append_class-target = "\
+ ${PYTHON_PN}-html \
+ ${PYTHON_PN}-logging \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-behave_1.2.6.bb b/external/meta-python2/recipes-devtools/python/python-behave_1.2.6.bb
new file mode 100644
index 00000000..d38486e6
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-behave_1.2.6.bb
@@ -0,0 +1,25 @@
+SUMMARY = "A behavior-driven development framework, Python style"
+DESCRIPTION = "Behavior-driven development (or BDD) is an agile software \
+development technique that encourages collaboration between developers, QA and \
+non-technical or business participants in a software project.\
+\
+behave uses tests written in a natural language style, backed up by Python code."
+HOMEPAGE = "https://github.com/behave/behave"
+SECTION = "devel/python"
+
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d950439e8ea6ed233e4288f5e1a49c06"
+
+SRC_URI[md5sum] = "3f05c859a1c45f5ed33e925817ad887d"
+SRC_URI[sha256sum] = "b9662327aa53294c1351b0a9c369093ccec1d21026f050c3bd9b3e5cccf81a86"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-argparse \
+ ${PYTHON_PN}-enum34 \
+ ${PYTHON_PN}-parse-type \
+ ${PYTHON_PN}-setuptools \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-traceback2 \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-bitarray_1.2.1.bb b/external/meta-python2/recipes-devtools/python/python-bitarray_1.2.1.bb
new file mode 100644
index 00000000..25b9d84d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-bitarray_1.2.1.bb
@@ -0,0 +1,22 @@
+SUMMARY = "A high-level Python efficient arrays of booleans -- C extension"
+DESCRIPTION = "This module provides an object type which efficiently represents \
+an array of booleans. Bitarrays are sequence types and behave very much like \
+usual lists. Eight bits are represented by one byte in a contiguous block of \
+memory. The user can select between two representations: little-endian and \
+big-endian. All of the functionality is implemented in C. Methods for \
+accessing the machine representation are provided. This can be useful when bit \
+level access to binary files is required, such as portable bitmap image files \
+(.pbm). Also, when dealing with compressed data which uses variable bit length \
+encoding, you may find this module useful."
+HOMEPAGE = "https://github.com/ilanschnell/bitarray"
+SECTION = "devel/python"
+
+LICENSE = "PSF"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=dc301a25ebe210dcc53b0a2d5a038eae"
+
+SRC_URI[md5sum] = "a46bf869f6adf34f5b0dc82b469793b7"
+SRC_URI[sha256sum] = "2ed675f460bb0d3d66fd8042a6f1f0d36cf213e52e72a745283ddb245da7b9cf"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-blinker_1.4.bb b/external/meta-python2/recipes-devtools/python/python-blinker_1.4.bb
new file mode 100644
index 00000000..a83695ac
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-blinker_1.4.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Fast, simple object-to-object and broadcast signaling."
+DESCRIPTION = "Blinker provides a fast dispatching system that allows any \
+number of interested parties to subscribe to events, or 'signals'.\
+\
+Signal receivers can subscribe to specific senders or receive signals sent by \
+any sender."
+HOMEPAGE = "https://pythonhosted.org/blinker/"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=946d7e89af6f7733aeaebed5635d2682"
+
+SRC_URI[md5sum] = "8b3722381f83c2813c52de3016b68d33"
+SRC_URI[sha256sum] = "471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-booleanpy/run-ptest b/external/meta-python2/recipes-devtools/python/python-booleanpy/run-ptest
new file mode 100644
index 00000000..0ba239c2
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-booleanpy/run-ptest
@@ -0,0 +1,2 @@
+#!/bin/sh
+py.test
diff --git a/external/meta-python2/recipes-devtools/python/python-booleanpy_3.7.bb b/external/meta-python2/recipes-devtools/python/python-booleanpy_3.7.bb
new file mode 100644
index 00000000..b80e4344
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-booleanpy_3.7.bb
@@ -0,0 +1,31 @@
+SUMMARY = "Define boolean algebras, create and parse boolean expressions and create custom boolean DSL"
+HOMEPAGE = "https://github.com/bastikr/boolean.py"
+
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e319747a5eb94cddf646037c01ddba47"
+
+SRC_URI += "file://run-ptest"
+SRC_URI[md5sum] = "1189d115a38f84f5df743014926a9159"
+SRC_URI[sha256sum] = "bd19b412435611ecc712603d0fd7d0e280e24698e7a6e3d5f610473870c5dd1e"
+
+PYPI_PACKAGE = "boolean.py"
+
+inherit pypi setuptools ptest
+
+RDEPENDS_${PN}_append_class-target = "\
+ ${PYTHON_PN}-lang \
+"
+
+RDEPENDS_${PN}-ptest += "\
+ ${PYTHON_PN}-unittest \
+ ${PYTHON_PN}-pytest \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/boolean
+ cp -rf ${S}/boolean/test_boolean.py ${D}${PTEST_PATH}/boolean/
+}
+
+FILES_${PN}-test = ""
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-cachetools_3.1.1.bb b/external/meta-python2/recipes-devtools/python/python-cachetools_3.1.1.bb
new file mode 100644
index 00000000..c2828cd7
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-cachetools_3.1.1.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Extensible memoizing collections and decorators"
+DESCRIPTION = "This module provides various memoizing \
+collections and decorators, including variants of the \
+Python 3 Standard Library @lru_cache function decorator."
+HOMEPAGE = "https://github.com/tkem/cachetools"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=27f7518eb6f7dc686d0f953b2f28dae5"
+
+SRC_URI[md5sum] = "91aa9b611b6345154df84e8e37746f41"
+SRC_URI[sha256sum] = "8ea2d3ce97850f31e4a08b0e2b5e6c34997d7216a9d2c98e0f3978630d4da69a"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-can_3.3.2.bb b/external/meta-python2/recipes-devtools/python/python-can_3.3.2.bb
new file mode 100644
index 00000000..478570ae
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-can_3.3.2.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Controller Area Network (CAN) interface module for Python"
+DESCRIPTION = "The Controller Area Network is a bus standard designed to allow \
+microcontrollers and devices to communicate with each other. It has priority \
+based bus arbitration and reliable deterministic communication. It is used in \
+cars, trucks, boats, wheelchairs and more."
+HOMEPAGE = "https://github.com/hardbyte/python-can"
+SECTION = "devel/python"
+
+LICENSE = "LGPL-3.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e6a600fd5e1d9cbde2d983680233ad02"
+
+SRC_URI[md5sum] = "b724553a330478270267380b4888a18e"
+SRC_URI[sha256sum] = "5fefb5c1e7e7f07faefc02c6eac79f9b58376f007048a04d8e7f325d48ec6b2e"
+
+PYPI_PACKAGE="python-can"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target += "\
+ ${PYTHON_PN}-argparse \
+ ${PYTHON_PN}-ctypes \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-misc \
+ ${PYTHON_PN}-netserver \
+ ${PYTHON_PN}-sqlite3 \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-wrapt \
+ ${PYTHON_PN}-zlib \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-certifi_2019.11.28.bb b/external/meta-python2/recipes-devtools/python/python-certifi_2019.11.28.bb
new file mode 100644
index 00000000..3c1f8eb3
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-certifi_2019.11.28.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Python package for providing Mozilla's CA Bundle."
+DESCRIPTION = "This installable Python package contains a CA Bundle that you can reference in your \
+Python code. This is useful for verifying HTTP requests, for example. This is the same CA Bundle \
+which ships with the Requests codebase, and is derived from Mozilla Firefox's canonical set."
+HOMEPAGE = " http://certifi.io/"
+
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=f77f61d14ee6feac4228d3ebd26cc1f1"
+
+SRC_URI[md5sum] = "4d5229c4d9f0a4a79106f9e2c2cfd381"
+SRC_URI[sha256sum] = "25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-cffi_1.13.2.bb b/external/meta-python2/recipes-devtools/python/python-cffi_1.13.2.bb
new file mode 100644
index 00000000..c1d7e417
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-cffi_1.13.2.bb
@@ -0,0 +1,26 @@
+SUMMARY = "Foreign Function Interface for Python calling C code"
+DESCRIPTION = "C Foreign Function Interface for Python. Interact with almost any C code from Python, based on C-like declarations that you can often copy-paste from header files or documentation."
+HOMEPAGE = "http://cffi.readthedocs.org/"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5677e2fdbf7cdda61d6dd2b57df547bf"
+
+SRC_URI[md5sum] = "652203cf99faa254efff7fab23c2f3a2"
+SRC_URI[sha256sum] = "599a1e8ff057ac530c9ad1778293c665cb81a791421f46922d80a86473c13346"
+
+DEPENDS += "libffi ${PYTHON_PN}-pycparser"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-subprocess \
+"
+
+RDEPENDS_${PN}_class-target = " \
+ ${PYTHON_PN}-ctypes \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-pycparser \
+ ${PYTHON_PN}-shell \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-chardet_3.0.4.bb b/external/meta-python2/recipes-devtools/python/python-chardet_3.0.4.bb
new file mode 100644
index 00000000..19d7b77a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-chardet_3.0.4.bb
@@ -0,0 +1,31 @@
+SUMMARY = "Universal encoding detector for Python 2 and 3"
+DESCRIPTION = "Character encoding auto-detection in Python. As smart as your \
+browser. Open source."
+HOMEPAGE = "https://github.com/chardet/chardet"
+
+LICENSE = "LGPL-2.1"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a6f89e2100d9b6cdffcea4f398e37343"
+
+SRC_URI[md5sum] = "7dd1ba7f9c77e32351b0a0cfacf4055c"
+SRC_URI[sha256sum] = "84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"
+
+# setup.py of chardet needs this.
+DEPENDS += "${PYTHON_PN}-pytest-runner-native"
+
+PACKAGES =+ "${PN}-cli"
+
+RDEPENDS_${PN}-cli = "${PN} "
+
+FILES_${PN}-cli += " \
+ ${PYTHON_SITEPACKAGES_DIR}/chardet/cli \
+"
+
+RDEPENDS_${PN}_class-target += " \
+ ${PYTHON_PN}-logging \
+"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "${PYTHON_PN}-argparse"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-cheetah_2.4.4.bb b/external/meta-python2/recipes-devtools/python/python-cheetah_2.4.4.bb
new file mode 100644
index 00000000..20fc2fdc
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-cheetah_2.4.4.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Python template engine and code generation tool"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=aff1107514aa6aae948f9fe71fdc393b"
+
+PR = "r3"
+
+PYPI_PACKAGE = "Cheetah"
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "python-pickle python-pprint"
+RDEPENDS_${PN}_class-native = ""
+
+BBCLASSEXTEND = "native nativesdk"
+
+SRC_URI[md5sum] = "853917116e731afbc8c8a43c37e6ddba"
+SRC_URI[sha256sum] = "be308229f0c1e5e5af4f27d7ee06d90bb19e6af3059794e5fd536a6f29a9b550"
diff --git a/external/meta-python2/recipes-devtools/python/python-click_7.0.bb b/external/meta-python2/recipes-devtools/python/python-click_7.0.bb
new file mode 100644
index 00000000..d54eb028
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-click_7.0.bb
@@ -0,0 +1,30 @@
+SUMMARY = "A simple wrapper around optparse for powerful command line utilities."
+DESCRIPTION = "\
+Click is a Python package for creating beautiful command line interfaces \
+in a composable way with as little code as necessary. It's the "Command \
+Line Interface Creation Kit". It's highly configurable but comes with \
+sensible defaults out of the box."
+HOMEPAGE = "https://palletsprojects.com/p/click/"
+BUGTRACKER = "https://github.com/pallets/click/issues"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=c13ed890b210a882c1778216694c98c7"
+
+SRC_URI[md5sum] = "7f53d50f7b7373ebc7963f9ff697450a"
+SRC_URI[sha256sum] = "5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"
+
+UPSTREAM_CHECK_REGEX = "click/(?P<pver>\d+(\.\d+)+)/"
+
+CLEANBROKEN = "1"
+
+PYPI_PACKAGE = "Click"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-contextlib \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-threading \
+ "
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-cmd2_0.8.9.bb b/external/meta-python2/recipes-devtools/python/python-cmd2_0.8.9.bb
new file mode 100644
index 00000000..74cc5d6f
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-cmd2_0.8.9.bb
@@ -0,0 +1,33 @@
+SUMMARY = "Extra features for standard library's cmd module"
+DESCRIPTION = "cmd2 is a tool for building interactive command line \
+applications in Python. Its goal is to make it quick and easy for developers \
+to build feature-rich and user-friendly interactive command line applications. \
+It provides a simple API which is an extension of Python's built-in cmd module.\
+ cmd2 provides a wealth of features on top of cmd to make your life easier and \
+eliminates much of the boilerplate code which would be necessary when using cmd."
+HOMEPAGE = "http://packages.python.org/cmd2/"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=60bc6842001870a418935bd84570b676"
+
+SRC_URI[md5sum] = "878976772c305486dfbca3aff4b4e779"
+SRC_URI[sha256sum] = "145cb677ebd0e3cae546ab81c30f6c25e0b08ba0f1071df854d53707ea792633"
+
+DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-argparse \
+ ${PYTHON_PN}-doctest \
+ ${PYTHON_PN}-pyparsing \
+ ${PYTHON_PN}-pyperclip \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-stringold \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-textutils \
+ "
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-coloredlogs_10.0.bb b/external/meta-python2/recipes-devtools/python/python-coloredlogs_10.0.bb
new file mode 100644
index 00000000..c7f97b3e
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-coloredlogs_10.0.bb
@@ -0,0 +1,32 @@
+SUMMARY = "Colored terminal output for Python's logging module"
+DESCRIPTION = "The coloredlogs package enables colored terminal output for \
+Python’s logging module. The ColoredFormatter class inherits from \
+logging.Formatter and uses ANSI escape sequences to render your logging \
+messages in color. It uses only standard colors so it should work on any UNIX \
+terminal. It’s currently tested on Python 2.6, 2.7, 3.4, 3.5, 3.6 and PyPy. On \
+Windows coloredlogs automatically pulls in Colorama as a dependency and \
+enables ANSI escape sequence translation using Colorama."
+HOMEPAGE = "https://coloredlogs.readthedocs.io"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=690da298a43805797a4fa7bbe180b3c6"
+
+SRC_URI[md5sum] = "0a186966a1955fff8cf9489373e691d9"
+SRC_URI[sha256sum] = "b869a2dda3fa88154b9dd850e27828d8755bfab5a838a1c97fbc850c6e377c36"
+
+inherit pypi setuptools
+
+do_compile_prepend() {
+ sed -ie "s/find_pth_directory(),/'',/g" ${S}/setup.py
+}
+
+do_install_append() {
+ rm -rf ${D}${datadir}
+}
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-humanfriendly \
+"
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-configargparse_0.15.1.bb b/external/meta-python2/recipes-devtools/python/python-configargparse_0.15.1.bb
new file mode 100644
index 00000000..e107ecd4
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-configargparse_0.15.1.bb
@@ -0,0 +1,26 @@
+
+SUMMARY = "A drop-in replacement for argparse with options to be set via config files or env variables."
+DESCRIPTION = "A drop-in replacement for argparse that allows options to also be set via \
+config files and/or environment variables."
+HOMEPAGE = "https://github.com/bw2/ConfigArgParse"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=da746463714cc35999ed9a42339f2943"
+
+SRC_URI[md5sum] = "aba15b7973b7a70bea86fd69289f8fe3"
+SRC_URI[sha256sum] = "baaf0fd2c1c108d007f402dab5481ac5f12d77d034825bf5a27f8224757bd0ac"
+
+PYPI_PACKAGE = "ConfigArgParse"
+
+inherit pypi setuptools
+
+PACKAGECONFIG ?= "yaml"
+PACKAGECONFIG[yaml] = ",,,${PYTHON_PN}-pyyaml"
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-core \
+ ${PYTHON_PN}-shell \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-configparser_3.8.1.bb b/external/meta-python2/recipes-devtools/python/python-configparser_3.8.1.bb
new file mode 100644
index 00000000..c864e354
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-configparser_3.8.1.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Updated configparser from Python 3.7 for Python 2.6+."
+DESCRIPTION = "This module provides the ConfigParser class which implements a basic \
+configuration language which provides a structure similar to what's found in \
+Microsoft Windows INI files."
+SECTION = "devel/python"
+HOMEPAGE = "https://docs.python.org/3/library/configparser.html"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=10;endline=10;md5=23f9ad5cad3d8cc0336e2a5d8a87e1fa"
+
+SRC_URI[md5sum] = "bc1558ed941cb1acb80ff650726d5af8"
+SRC_URI[sha256sum] = "bc37850f0cc42a1725a796ef7d92690651bf1af37d744cc63161dac62cabee17"
+
+inherit pypi setuptools python-backports-init
+
+RDEPENDS_${PN} += "python-pkgutil"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-constantly_15.1.0.bb b/external/meta-python2/recipes-devtools/python/python-constantly_15.1.0.bb
new file mode 100644
index 00000000..8474485a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-constantly_15.1.0.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Symbolic constants in Python"
+DESCRIPTION = "A library that provides symbolic constant support. It includes \
+collections and constants with text, numeric, and bit flag values. Originally \
+twisted.python.constants from the Twisted project."
+HOMEPAGE = "https://github.com/twisted/constantly"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e393e4ddd223e3a74982efa784f89fd7"
+
+SRC_URI[md5sum] = "f0762f083d83039758e53f8cf0086eef"
+SRC_URI[sha256sum] = "586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "${PYTHON_PN}-json"
diff --git a/external/meta-python2/recipes-devtools/python/python-contextlib2_0.6.0.bb b/external/meta-python2/recipes-devtools/python/python-contextlib2_0.6.0.bb
new file mode 100644
index 00000000..ced6011f
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-contextlib2_0.6.0.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Backports and enhancements for the contextlib module"
+DESCRIPTION = "contextlib2 is a backport of the standard library’s contextlib \
+module to earlier Python versions."
+HOMEPAGE = "http://contextlib2.readthedocs.org/"
+SECTION = "devel/python"
+
+LICENSE = "PSF"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=43d1c7827e8fad6454b553caf0e1d734"
+
+SRC_URI[md5sum] = "d03a631073b40073b5c41364ad8f5979"
+SRC_URI[sha256sum] = "7197aa736777caac513dbd800944c209a49765bf1979b12b037dce0277077ed3"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-cpuset_1.6.bb b/external/meta-python2/recipes-devtools/python/python-cpuset_1.6.bb
new file mode 100644
index 00000000..1255a51f
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-cpuset_1.6.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Cpuset is a Python application to make using the cpusets facilities in the Linux kernel easier"
+SECTION = "devel/python"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f"
+
+S = "${WORKDIR}/git"
+SRCREV = "6c46d71a1c6ee711063153b9f7787280128f7252"
+SRC_URI = "git://github.com/lpechacek/cpuset.git;protocol=https;"
+
+inherit distutils
+
+RDEPENDS_${PN} = "\
+ python-core \
+ python-re \
+ python-logging \
+ python-textutils \
+ python-unixadmin \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-crcmod_1.7.bb b/external/meta-python2/recipes-devtools/python/python-crcmod_1.7.bb
new file mode 100644
index 00000000..b15bb2de
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-crcmod_1.7.bb
@@ -0,0 +1,21 @@
+SUMMARY = "A Python module for generating objects that compute the Cyclic Redundancy Check."
+DESCRIPTION = "The software in this package is a Python module for generating \
+objects that compute the Cyclic Redundancy Check (CRC). There is no attempt in \
+this package to explain how the CRC works. There are a number of resources on \
+the web that give a good explanation of the algorithms. Just do a Google search \
+for 'crc calculation' and browse till you find what you need. Another resource \
+can be found in chapter 20 of the book 'Numerical Recipes in C' by Press et. al"
+HOMEPAGE = "https://pypi.org/project/crcmod"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=f9a19291627cad2d1dfbfcf3c9fb85c2"
+
+SRC_URI[md5sum] = "2d5b92117d958dcead94f9e17f54cd32"
+SRC_URI[sha256sum] = "dc7051a0db5f2bd48665a990d3ec1cc305a466a77358ca4492826f41f283601e"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "${PYTHON_PN}-unittest"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-cryptography-vectors_2.8.bb b/external/meta-python2/recipes-devtools/python/python-cryptography-vectors_2.8.bb
new file mode 100644
index 00000000..a7c36e2e
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-cryptography-vectors_2.8.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Test vectors for the cryptography package."
+DESCRIPTION = "cryptography is a package which provides cryptographic recipes \
+and primitives to Python developers. Our goal is for it to be your 'cryptographic \
+standard library'."
+HOMEPAGE = "https://cryptography.io/"
+SECTION = "devel/python"
+
+LICENSE = "Apache-2.0 | BSD"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8c3617db4fb6fae01f1d253ab91511e4"
+
+SRC_URI[md5sum] = "a744ed29bb9ef56b3a50317fea3b218e"
+SRC_URI[sha256sum] = "6cd32174c56a3eca72f64af43c1daacaae758cfa5ff9d280dfcf818fa11ef116"
+
+DEPENDS += " \
+ ${PYTHON_PN}-cryptography \
+"
+
+
+PYPI_PACKAGE = "cryptography_vectors"
+
+UPSTREAM_CHECK_REGEX = ""
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-cryptography/run-ptest b/external/meta-python2/recipes-devtools/python/python-cryptography/run-ptest
new file mode 100644
index 00000000..0ba239c2
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-cryptography/run-ptest
@@ -0,0 +1,2 @@
+#!/bin/sh
+py.test
diff --git a/external/meta-python2/recipes-devtools/python/python-cryptography_2.8.bb b/external/meta-python2/recipes-devtools/python/python-cryptography_2.8.bb
new file mode 100644
index 00000000..1d4b43f1
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-cryptography_2.8.bb
@@ -0,0 +1,87 @@
+
+SUMMARY = "Provides cryptographic recipes and primitives to python developers"
+DESCRIPTION = "cryptography is a package which provides cryptographic recipes \
+and primitives to Python developers. Our goal is for it to be your 'cryptographic \
+standard library'."
+HOMEPAGE = "https://cryptography.io/"
+SECTION = "devel/python"
+
+LICENSE = "Apache-2.0 | BSD"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=097f805837700cfac572ac274cd38124"
+
+LDSHARED += "-pthread"
+
+DEPENDS += " \
+ ${PYTHON_PN}-cffi \
+ ${PYTHON_PN}-cffi-native \
+ ${PYTHON_PN}-asn1crypto \
+ ${PYTHON_PN}-six \
+"
+
+SRC_URI[md5sum] = "77730058b556c6d9838679a94c6229ce"
+SRC_URI[sha256sum] = "3cda1f0ed8747339bbdf71b9f38ca74c7b592f24f65cdb3ab3765e4b02871651"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-cffi \
+ ${PYTHON_PN}-idna \
+ ${PYTHON_PN}-asn1crypto \
+ ${PYTHON_PN}-setuptools \
+ ${PYTHON_PN}-six \
+"
+
+RDEPENDS_${PN}_class-target += " \
+ ${PYTHON_PN}-cffi \
+ ${PYTHON_PN}-idna \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-asn1crypto \
+ ${PYTHON_PN}-setuptools \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-threading \
+"
+
+RDEPENDS_${PN}-ptest += " \
+ ${PN} \
+ ${PYTHON_PN}-cryptography-vectors \
+ ${PYTHON_PN}-hypothesis \
+ ${PYTHON_PN}-iso8601 \
+ ${PYTHON_PN}-pretend \
+ ${PYTHON_PN}-pytest \
+ ${PYTHON_PN}-pytz \
+"
+
+inherit ptest
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+ install -d ${D}${PTEST_PATH}/tests/hazmat
+ cp -rf ${S}/tests/hazmat/* ${D}${PTEST_PATH}/tests/hazmat/
+}
+
+FILES_${PN}-dbg += " \
+ ${libdir}/${PYTHON_PN}2.7/site-packages/${SRCNAME}/hazmat/bindings/.debug \
+"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+DEPENDS += " \
+ ${PYTHON_PN}-enum34 \
+"
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-enum34 \
+ ${PYTHON_PN}-ipaddress \
+"
+
+RDEPENDS_${PN}_class-target += " \
+ ${PYTHON_PN}-enum34 \
+ ${PYTHON_PN}-ipaddress \
+ ${PYTHON_PN}-contextlib \
+ ${PYTHON_PN}-subprocess \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-cython_0.29.14.bb b/external/meta-python2/recipes-devtools/python/python-cython_0.29.14.bb
new file mode 100644
index 00000000..3e0c6fe2
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-cython_0.29.14.bb
@@ -0,0 +1,50 @@
+SUMMARY = "The Cython compiler for writing C extensions for the Python language."
+DESCRIPTION = "Cython is a language specially designed for writing Python extension modules. \
+It's designed to bridge the gap between the nice, high-level, easy-to-use world of Python \
+and the messy, low-level world of C."
+HOMEPAGE = "https://cython.org/"
+SECTION = "devel/python"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e23fadd6ceef8c618fc1c65191d846fa"
+
+SRC_URI[md5sum] = "6e2f139e30bb08d68366f9370d87964c"
+SRC_URI[sha256sum] = "e4d6bb8703d0319eb04b7319b12ea41580df44fd84d83ccda13ea463c6801414"
+
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/Cython/"
+UPSTREAM_CHECK_REGEX = "/Cython/(?P<pver>(\d+[\.\-_]*)+)"
+
+PYPI_PACKAGE = "Cython"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target += "\
+ ${PYTHON_PN}-distribute \
+ ${PYTHON_PN}-misc \
+ ${PYTHON_PN}-netserver \
+ ${PYTHON_PN}-pkgutil \
+ ${PYTHON_PN}-pyparsing \
+ ${PYTHON_PN}-setuptools \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-xml \
+"
+
+RDEPENDS_${PN}_class-nativesdk += "\
+ nativesdk-${PYTHON_PN}-misc \
+ nativesdk-${PYTHON_PN}-netserver \
+ nativesdk-${PYTHON_PN}-pkgutil \
+ nativesdk-${PYTHON_PN}-pyparsing \
+ nativesdk-${PYTHON_PN}-setuptools \
+ nativesdk-${PYTHON_PN}-shell \
+ nativesdk-${PYTHON_PN}-xml \
+"
+
+do_install_append() {
+ # Make sure we use /usr/bin/env python
+ for PYTHSCRIPT in `grep -rIl '^#!.*python' ${D}`; do
+ sed -i -e '1s|^#!.*|#!/usr/bin/env ${PYTHON_PN}|' $PYTHSCRIPT
+ done
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-daemon/0001-Workaround-for-issue-2-1.patch b/external/meta-python2/recipes-devtools/python/python-daemon/0001-Workaround-for-issue-2-1.patch
new file mode 100644
index 00000000..dbb84071
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-daemon/0001-Workaround-for-issue-2-1.patch
@@ -0,0 +1,31 @@
+From 0981eee9f0198c2045dc0eaa78a005d06fc7bfe4 Mon Sep 17 00:00:00 2001
+From: Carlos Eduardo Moreira dos Santos <cems@cemshost.com.br>
+Date: Tue, 28 Mar 2017 18:23:44 -0300
+Subject: [PATCH] Workaround for issue 2 [1]
+
+[1] https://pagure.io/python-daemon/issue/2
+---
+ version.py | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/version.py b/version.py
+index d58422a377ee..293e2d64c2b7 100644
+--- a/version.py
++++ b/version.py
+@@ -648,9 +648,10 @@ class ChangelogAwareDistribution(distutils.dist.Distribution, object):
+
+ @lru_cache(maxsize=128)
+ def get_version_info(self):
+- changelog_path = get_changelog_path(self)
+- version_info = generate_version_info_from_changelog(changelog_path)
+- return version_info
++ return {
++ 'version': '2.1.2',
++ 'maintainer': 'Ben Finney'
++ }
+
+ def get_version(self):
+ version_info = self.get_version_info()
+--
+2.7.4
+
diff --git a/external/meta-python2/recipes-devtools/python/python-daemon_2.1.2.bb b/external/meta-python2/recipes-devtools/python/python-daemon_2.1.2.bb
new file mode 100644
index 00000000..002da046
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-daemon_2.1.2.bb
@@ -0,0 +1,27 @@
+DESCRIPTION = "Library to implement a well-behaved Unix daemon process"
+HOMEPAGE = "https://pagure.io/python-daemon/"
+SECTION = "devel/python"
+
+DEPENDS += "python-docutils-native"
+RDEPENDS_${PN} = "python-docutils \
+ python-lockfile (>= 0.10) \
+ python-resource \
+"
+
+LICENSE = "Apache-2.0 & GPLv3"
+LIC_FILES_CHKSUM = "file://README;md5=2695c853a2cafc33e68a1d972889ebd2"
+
+inherit pypi setuptools
+
+SRC_URI[md5sum] = "9c57343d81f2a96c51cffeab982b04d2"
+SRC_URI[sha256sum] = "261c859be5c12ae7d4286dc6951e87e9e1a70a882a8b41fd926efc1ec4214f73"
+
+# Fix for build error in Yocto:
+# i = p.rfind('/') + 1
+# AttributeError: 'NoneType' object has no attribute 'rfind'
+#S = "${WORKDIR}/python-daemon"
+SRC_URI_append = " \
+ file://0001-Workaround-for-issue-2-1.patch \
+"
+
+PYPI_PACKAGE = "python-daemon"
diff --git a/external/meta-python2/recipes-devtools/python/python-daemonize_2.5.0.bb b/external/meta-python2/recipes-devtools/python/python-daemonize_2.5.0.bb
new file mode 100644
index 00000000..e0f64fcf
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-daemonize_2.5.0.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Library to enable your code run as a daemon process on Unix-like systems"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=13e982bf1b7b164b9d6d1665dac83873"
+SRCNAME = "daemonize"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "\
+ python-fcntl \
+ python-unixadmin \
+ python-logging \
+ python-resource \
+"
+
+SRC_URI[md5sum] = "3d64e7a0219ad22e3fca62460f893b6a"
+SRC_URI[sha256sum] = "dd026e4ff8d22cb016ed2130bc738b7d4b1da597ef93c074d2adb9e4dea08bc3"
diff --git a/external/meta-python2/recipes-devtools/python/python-dateutil_2.8.1.bb b/external/meta-python2/recipes-devtools/python/python-dateutil_2.8.1.bb
new file mode 100644
index 00000000..c265c3a6
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-dateutil_2.8.1.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Extensions to the standard Python datetime module"
+DESCRIPTION = "The dateutil module provides powerful extensions to the \
+datetime module available in the Python standard library."
+HOMEPAGE = "https://dateutil.readthedocs.org"
+
+LICENSE = "BSD-3-Clause & Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e3155c7bdc71f66e02678411d2abf996"
+
+SRC_URI[md5sum] = "f2a1d4b680b297b367a974664ca3a4f6"
+SRC_URI[sha256sum] = "73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"
+
+DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
+
+PYPI_PACKAGE = "python-dateutil"
+
+inherit pypi setuptools
+
+PACKAGES =+ "${PN}-zoneinfo"
+FILES_${PN}-zoneinfo = "${libdir}/${PYTHON_DIR}/site-packages/dateutil/zoneinfo"
+
+
+RDEPENDS_${PN}_class-target = "\
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-stringold \
+"
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-dbus_1.2.14.bb b/external/meta-python2/recipes-devtools/python/python-dbus_1.2.14.bb
new file mode 100644
index 00000000..409e9a32
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-dbus_1.2.14.bb
@@ -0,0 +1,32 @@
+SUMMARY = "Python bindings for the DBus inter-process communication system"
+SECTION = "devel/python"
+HOMEPAGE = "http://www.freedesktop.org/Software/dbus"
+LICENSE = "MIT & AFL-2.1 | GPLv2"
+LIC_FILES_CHKSUM = "file://COPYING;md5=b03240518994df6d8c974675675e5ca4 \
+ file://dbus-gmain/COPYING;md5=99fece6728a80737c8fd3e7c734c17c4 "
+DEPENDS = "expat dbus dbus-glib virtual/libintl python-pyrex-native"
+
+SRC_URI = "http://dbus.freedesktop.org/releases/dbus-python/dbus-python-${PV}.tar.gz \
+"
+
+SRC_URI[md5sum] = "c8739234fca9fba26368d1a337abe830"
+SRC_URI[sha256sum] = "b10206ba3dd641e4e46411ab91471c88e0eec1749860e4285193ee68df84ac31"
+S = "${WORKDIR}/dbus-python-${PV}"
+
+inherit distutils-base autotools pkgconfig
+
+# documentation needs python-sphinx, which is not in oe-core or meta-python2 for now
+# change to use PACKAGECONFIG when python-sphinx is added to oe-core or meta-python2
+EXTRA_OECONF += "--disable-documentation"
+
+export STAGING_LIBDIR
+export STAGING_INCDIR
+
+RDEPENDS_${PN} = "python-io python-logging python-stringold python-threading python-xml"
+
+FILES_${PN}-dev += "${libdir}/pkgconfig"
+
+do_install_append() {
+ # Remove files that clash with python3-dbus; their content is same
+ rm ${D}${includedir}/dbus-1.0/dbus/dbus-python.h ${D}${libdir}/pkgconfig/dbus-python.pc
+}
diff --git a/external/meta-python2/recipes-devtools/python/python-dbusmock/0001-Add-functionality-to-add-own-objects-to-internal-obj.patch b/external/meta-python2/recipes-devtools/python/python-dbusmock/0001-Add-functionality-to-add-own-objects-to-internal-obj.patch
new file mode 100644
index 00000000..c4d81784
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-dbusmock/0001-Add-functionality-to-add-own-objects-to-internal-obj.patch
@@ -0,0 +1,52 @@
+From c4436fd42f2936e5fb0f95434d06e45aa9959ca0 Mon Sep 17 00:00:00 2001
+From: Simon Busch <simon.busch@lge.com>
+Date: Wed, 9 Apr 2014 13:18:33 +0200
+Subject: [PATCH] Add functionality to add own objects to internal object
+
+ list
+
+In some case the tests might want to create dynamically dbus objects which extended
+functionality from own class definitions within templates. In such cases we need to
+register those objects with the internal object manager of dbusmock.
+
+Signed-off-by: Simon Busch <simon.busch@lge.com>
+
+---
+ dbusmock/__init__.py | 4 ++--
+ dbusmock/mockobject.py | 8 ++++++++
+ 2 files changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/dbusmock/__init__.py b/dbusmock/__init__.py
+index 8a482ab..3d5d71a 100644
+--- a/dbusmock/__init__.py
++++ b/dbusmock/__init__.py
+@@ -14,8 +14,8 @@ __license__ = 'LGPL 3+'
+ __version__ = '0.16.7'
+
+ from dbusmock.mockobject import (DBusMockObject, MOCK_IFACE,
+- OBJECT_MANAGER_IFACE, get_object, get_objects)
++ OBJECT_MANAGER_IFACE, get_object, get_objects, add_object)
+ from dbusmock.testcase import DBusTestCase
+
+ __all__ = ['DBusMockObject', 'MOCK_IFACE', 'OBJECT_MANAGER_IFACE',
+- 'DBusTestCase', 'get_object', 'get_objects']
++ 'DBusTestCase', 'get_object', 'get_objects', 'add_object']
+diff --git a/dbusmock/mockobject.py b/dbusmock/mockobject.py
+index 586dbad..e4f130f 100644
+--- a/dbusmock/mockobject.py
++++ b/dbusmock/mockobject.py
+@@ -688,6 +688,14 @@ dbus.service._method_lookup = _dbusmock_method_lookup
+ # Helper API for templates
+ #
+
++def add_object(path, obj):
++ if path in objects:
++ raise dbus.exceptions.DBusException(
++ 'org.freedesktop.DBus.Mock.NameError',
++ 'object %s already exists' % path)
++
++ objects[path] = obj
++
+
+ def get_objects():
+ '''Return all existing object paths'''
diff --git a/external/meta-python2/recipes-devtools/python/python-dbusmock/0002-Add-possibility-to-import-templates-from-packages.patch b/external/meta-python2/recipes-devtools/python/python-dbusmock/0002-Add-possibility-to-import-templates-from-packages.patch
new file mode 100644
index 00000000..06ab1f05
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-dbusmock/0002-Add-possibility-to-import-templates-from-packages.patch
@@ -0,0 +1,27 @@
+From 03bd5cb77c54033857810bb17562859eefa41221 Mon Sep 17 00:00:00 2001
+From: Simon Busch <simon.busch@lge.com>
+Date: Wed, 9 Apr 2014 13:20:33 +0200
+Subject: [PATCH] Add possibility to import templates from packages
+
+Does not have any unit tests yet.
+
+Signed-off-by: Simon Busch <simon.busch@lge.com>
+
+---
+ dbusmock/mockobject.py | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/dbusmock/mockobject.py b/dbusmock/mockobject.py
+index e4f130f..389df70 100644
+--- a/dbusmock/mockobject.py
++++ b/dbusmock/mockobject.py
+@@ -46,6 +46,9 @@ def load_module(name):
+ exec(f.read(), mod.__dict__, mod.__dict__)
+ return mod
+
++ if '.' in name:
++ return importlib.import_module(name)
++
+ return importlib.import_module('dbusmock.templates.' + name)
+
+
diff --git a/external/meta-python2/recipes-devtools/python/python-dbusmock_0.16.7.bb b/external/meta-python2/recipes-devtools/python/python-dbusmock_0.16.7.bb
new file mode 100644
index 00000000..ec8c54aa
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-dbusmock_0.16.7.bb
@@ -0,0 +1,25 @@
+# Copyright (c) 2014 LG Electronics, Inc.
+
+SUMMARY = "With this program/Python library you can easily create mock objects on D-Bus"
+AUTHOR = "Martin Pitt <martin.pitt@ubuntu.com>"
+
+LICENSE = "GPL-3.0"
+LIC_FILES_CHKSUM = "file://COPYING;md5=e6a600fd5e1d9cbde2d983680233ad02"
+
+SRC_URI[md5sum] = "80f8caa838fad96483a8751e11d384f9"
+SRC_URI[sha256sum] = "2d2ea892fa4633c3ec6ac1e912120ec493047a5c6522849b7d1c95ad755bce75"
+
+SRC_URI += " \
+ file://0001-Add-functionality-to-add-own-objects-to-internal-obj.patch \
+ file://0002-Add-possibility-to-import-templates-from-packages.patch \
+"
+
+PYPI_PACKAGE = "python-dbusmock"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-dbus \
+ ${PYTHON_PN}-pygobject \
+ ${PYTHON_PN}-xml \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-decorator_4.4.1.bb b/external/meta-python2/recipes-devtools/python/python-decorator_4.4.1.bb
new file mode 100644
index 00000000..7249058f
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-decorator_4.4.1.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Python decorator utilities"
+DESCRIPTION = "\
+The aim of the decorator module it to simplify the usage of decorators \
+for the average programmer, and to popularize decorators by showing \
+various non-trivial examples. Of course, as all techniques, decorators \
+can be abused and you should not try to solve every problem with a \
+decorator, just because you can."
+HOMEPAGE = "https://github.com/micheles/decorator"
+
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=be2fd2007972bf96c08af3293d728b22"
+
+SRC_URI[md5sum] = "933981f288c4230816b5beee8d40e6ea"
+SRC_URI[sha256sum] = "54c38050039232e1db4ad7375cfce6748d7b41c29e95a081c8a6d2c30364a2ce"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-contextlib \
+ ${PYTHON_PN}-stringold \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-deprecated_1.2.7.bb b/external/meta-python2/recipes-devtools/python/python-deprecated_1.2.7.bb
new file mode 100644
index 00000000..da2c7600
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-deprecated_1.2.7.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Python @deprecated decorator to deprecate old python classes, functions or methods."
+HOMEPAGE = "https://github.com/tantale/deprecated"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=44288e26f4896bdab14072d4fa35ff01"
+
+SRC_URI[md5sum] = "93d65f6a4efc9aebebfd28c9413dfd19"
+SRC_URI[sha256sum] = "408038ab5fdeca67554e8f6742d1521cd3cd0ee0ff9d47f29318a4f4da31c308"
+
+PYPI_PACKAGE = "Deprecated"
+
+inherit pypi setuptools
+
+S = "${WORKDIR}/${PYPI_PACKAGE}-${PV}"
+
+RDEPENDS_${PN} += "python-wrapt"
diff --git a/external/meta-python2/recipes-devtools/python/python-distutils-extra_2.39.bb b/external/meta-python2/recipes-devtools/python/python-distutils-extra_2.39.bb
new file mode 100644
index 00000000..1668d1e7
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-distutils-extra_2.39.bb
@@ -0,0 +1,19 @@
+SUMMARY = "python-distutils extension"
+DESCRIPTION = "python-distutils extension integrating gettext support, themed icons and scrollkeeper based documentation"
+HOMEPAGE = "https://launchpad.net/python-distutils-extra"
+SECTION = "devel/python"
+
+LICENSE = "GPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4325afd396febcb659c36b49533135d4"
+
+SRC_URI = "https://launchpad.net/python-distutils-extra/trunk/${PV}/+download/python-distutils-extra-${PV}.tar.gz"
+SRC_URI[md5sum] = "16e06db0ef73a35b4bff4b9eed5699b5"
+SRC_URI[sha256sum] = "723f24f4d65fc8d99b33a002fbbb3771d4cc9d664c97085bf37f3997ae8063af"
+
+inherit setuptools
+
+RDEPENDS_${PN} += "\
+ python-distutils \
+"
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-django-south_1.0.2.bb b/external/meta-python2/recipes-devtools/python/python-django-south_1.0.2.bb
new file mode 100644
index 00000000..c0a1e2f6
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-django-south_1.0.2.bb
@@ -0,0 +1,20 @@
+SUMMARY = "Migrations for Django"
+DESCRIPTION = "South is an intelligent database migrations library for the \
+Django web framework. It is database-independent and DVCS-friendly, as well as \
+a whole host of other features."
+HOMEPAGE = "http://south.aeracode.org/"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=17;endline=18;md5=2155d8ae21e7c23101d5febac696b27e"
+
+SRC_URI[md5sum] = "c76a9758b2011bc3b6c39f881bba2f66"
+SRC_URI[sha256sum] = "d360bd31898f9df59f6faa786551065bba45b35e7ee3c39b381b4fbfef7392f4"
+
+PYPI_PACKAGE = "South"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-django \
+ "
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-django_1.11.26.bb b/external/meta-python2/recipes-devtools/python/python-django_1.11.26.bb
new file mode 100644
index 00000000..94a98841
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-django_1.11.26.bb
@@ -0,0 +1,42 @@
+SUMMARY = "A high-level Python Web framework"
+DESCRIPTION = "A high-level Python Web framework that encourages rapid \
+development and clean, pragmatic design."
+HOMEPAGE = "http://www.djangoproject.com/"
+SECTION = "devel/python"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=f09eb47206614a4954c51db8a94840fa"
+
+SRC_URI[md5sum] = "858e5417a10ce565a15d6e4a2ea0ee37"
+SRC_URI[sha256sum] = "861db7f82436ab43e1411832ed8dca81fc5fc0f7c2039c7e07a080a63092fb44"
+
+PYPI_PACKAGE = "Django"
+
+UPSTREAM_CHECK_REGEX = "(?P<pver>1(\.\d+)+)"
+
+FILES_${PN} += "${datadir}/django"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-argparse \
+ ${PYTHON_PN}-compression \
+ ${PYTHON_PN}-ctypes \
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-email \
+ ${PYTHON_PN}-html \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-multiprocessing \
+ ${PYTHON_PN}-netserver \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-pkgutil \
+ ${PYTHON_PN}-pytz \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-unixadmin \
+ ${PYTHON_PN}-xml \
+ ${PYTHON_PN}-zlib \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-djangorestframework_3.9.0.bb b/external/meta-python2/recipes-devtools/python/python-djangorestframework_3.9.0.bb
new file mode 100644
index 00000000..04e56d09
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-djangorestframework_3.9.0.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Web APIs for Django, made easy."
+DESCRIPTION = "Django REST framework is a powerful and flexible toolkit for building Web APIs."
+HOMEPAGE = "https://www.django-rest-framework.org/"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.md;md5=7879a5a716147a784f7e524c9cf103c1"
+
+SRC_URI[md5sum] = "0d481bf8dbb87bb927b46798edc1a9bd"
+SRC_URI[sha256sum] = "607865b0bb1598b153793892101d881466bd5a991de12bd6229abb18b1c86136"
+
+PYPI_PACKAGE = "djangorestframework"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-django \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-dnspython_1.16.0.bb b/external/meta-python2/recipes-devtools/python/python-dnspython_1.16.0.bb
new file mode 100644
index 00000000..0c5fb208
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-dnspython_1.16.0.bb
@@ -0,0 +1,29 @@
+SUMMARY = "DNS toolkit for Python"
+DESCRIPTION = "dnspython is a DNS toolkit for Python. It supports almost all record types. \
+It can be used for queries, zone transfers, and dynamic updates. It supports \
+TSIG authenticated messages and EDNS0.\
+\
+dnspython provides both high and low level access to DNS. The high level \
+classes perform queries for data of a given name, type, and class, and return \
+an answer set. The low level classes allow direct manipulation of DNS zones, \
+messages, names, and records."
+HOMEPAGE = "http://www.dnspython.org/"
+
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5af50906b5929837f667dfe31052bd34"
+
+SRC_URI[md5sum] = "bc9ca3b3a82164667d5730ec6d5248a2"
+SRC_URI[sha256sum] = "36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01"
+
+PYPI_PACKAGE_EXT = "zip"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-crypt \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-math \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-threading \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-docker-pycreds_0.4.0.bb b/external/meta-python2/recipes-devtools/python/python-docker-pycreds_0.4.0.bb
new file mode 100644
index 00000000..4e9b3ac8
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-docker-pycreds_0.4.0.bb
@@ -0,0 +1,9 @@
+SUMMARY = "Python bindings for the docker credentials store API"
+HOMEPAGE = "https://github.com/shin-/dockerpy-creds"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+inherit pypi setuptools
+
+SRC_URI[md5sum] = "322f570cea6b4661c6ac335683988e18"
+SRC_URI[sha256sum] = "6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4"
diff --git a/external/meta-python2/recipes-devtools/python/python-docker_4.2.0.bb b/external/meta-python2/recipes-devtools/python/python-docker_4.2.0.bb
new file mode 100644
index 00000000..cf78cf19
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-docker_4.2.0.bb
@@ -0,0 +1,18 @@
+SUMMARY = "A Python library for the Docker Engine API."
+HOMEPAGE = "https://github.com/docker/docker-py"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=34f3846f940453127309b920eeb89660"
+
+inherit pypi setuptools
+
+SRC_URI[md5sum] = "19f803f6a7113301daa5d82a2d1d0c30"
+SRC_URI[sha256sum] = "ddae66620ab5f4bce769f64bcd7934f880c8abe6aa50986298db56735d0f722e"
+
+RDEPENDS_${PN} += " \
+ python-misc \
+ python-six \
+ python-docker-pycreds \
+ python-requests \
+ python-websocket-client \
+ python-backports-ssl \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-docutils_0.15.2.bb b/external/meta-python2/recipes-devtools/python/python-docutils_0.15.2.bb
new file mode 100644
index 00000000..d26e8190
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-docutils_0.15.2.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Text processing system for documentation"
+HOMEPAGE = "http://docutils.sourceforge.net"
+SECTION = "devel/python"
+LICENSE = "PSF & BSD-2-Clause & GPLv3"
+LIC_FILES_CHKSUM = "file://COPYING.txt;md5=7a4646907ab9083c826280b19e103106"
+
+inherit pypi setuptools
+
+PYPI_PACKAGE = "docutils"
+
+SRC_URI[md5sum] = "e26a308d8000b0bed7416a633217c676"
+SRC_URI[sha256sum] = "a2aeea129088da402665e92e0b25b04b073c04b2dce4ab65caaa38b7ce2e1a99"
+
+BBCLASSEXTEND = "native"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-dominate_2.4.0.bb b/external/meta-python2/recipes-devtools/python/python-dominate_2.4.0.bb
new file mode 100644
index 00000000..c6745e2d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-dominate_2.4.0.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Dominate is a Python library for creating and manipulating HTML documents using an elegant DOM API."
+DESCRIPTION = "Dominate is a Python library for creating and manipulating HTML \
+documents using an elegant DOM API. It allows you to write HTML pages in pure \
+Python very concisely, which eliminates the need to learn another template \
+language, and lets you take advantage of the more powerful features of Python."
+HOMEPAGE = "https://github.com/Knio/dominate/"
+
+LICENSE = "LGPL-3.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b52f2d57d10c4f7ee67a7eb9615d5d24"
+
+SRC_URI[md5sum] = "27d3aa7e0d67902c505e248e705e5e2e"
+SRC_URI[sha256sum] = "a92474b4312bd8b4c1789792f3ec8c571cd8afa8e7502a2b1c64dd48cd67e59c"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-threading \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-editor_1.0.4.bb b/external/meta-python2/recipes-devtools/python/python-editor_1.0.4.bb
new file mode 100644
index 00000000..cc6e0a51
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-editor_1.0.4.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Programmatically open and editor, capture the result"
+DESCRIPTION = "python-editor is a library that provides the editor module for \
+programmatically interfacing with your system’s $EDITOR."
+HOMEPAGE = "https://github.com/fmoo/python-editor"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314"
+
+SRC_URI[md5sum] = "0e52648a4a6e7c89e3be44e9456530b4"
+SRC_URI[sha256sum] = "51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b"
+
+PYPI_PACKAGE = "python-editor"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-engineio_3.11.2.bb b/external/meta-python2/recipes-devtools/python/python-engineio_3.11.2.bb
new file mode 100644
index 00000000..09188b4b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-engineio_3.11.2.bb
@@ -0,0 +1,24 @@
+SUMMARY = "Engine.IO server"
+DESCRIPTION = "Python implementation of the Engine.IO realtime client and server."
+HOMEPAGE = "https://github.com/miguelgrinberg/python-engineio/"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=42d0a9e728978f0eeb759c3be91536b8"
+
+SRC_URI[md5sum] = "13345452be25c3b63d041f8f89e662d1"
+SRC_URI[sha256sum] = "47ae4a9b3b4f2e8a68929f37a518338838e119f24c9a9121af92c49f8bea55c3"
+
+PYPI_PACKAGE = "python-engineio"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_append_class-target = "\
+ ${PYTHON_PN}-compression \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-logging \
+"
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-six \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-enum34_1.1.6.bb b/external/meta-python2/recipes-devtools/python/python-enum34_1.1.6.bb
new file mode 100644
index 00000000..d50b5c7c
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-enum34_1.1.6.bb
@@ -0,0 +1,11 @@
+SUMMARY = "backport of Python 3.4's enum package"
+HOMEPAGE = "https://bitbucket.org/stoneleaf/enum34"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://enum/LICENSE;md5=0a97a53a514564c20efd7b2e8976c87e"
+
+SRC_URI[md5sum] = "5f13a0841a61f7fc295c514490d120d0"
+SRC_URI[sha256sum] = "8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-epydoc_3.0.1.bb b/external/meta-python2/recipes-devtools/python/python-epydoc_3.0.1.bb
new file mode 100644
index 00000000..dd9799fa
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-epydoc_3.0.1.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "Epydoc is a tool for generating API documentation for Python modules, based on their docstrings"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=011c0d78eb6054d731c879132d7313f0"
+HOMEPAGE = "http://epydoc.sourceforge.net/"
+
+SRC_URI[md5sum] = "cdd6f6c76dd8bab5e653a343a0544294"
+SRC_URI[sha256sum] = "d4e5c8d90937d01b05170f592c1fa9b29e9ed0498dfe7f0eb2a3af61725b6ad1"
+
+inherit pypi distutils
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-codecs \
+ ${PYTHON_PN}-pickle \
+ ${PYTHON_PN}-stringold \
+ ${PYTHON_PN}-re \
+ ${PYTHON_PN}-xml \
+ "
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-evdev/0001-Fix-build-on-32bit-arches-with-64bit-time_t.patch b/external/meta-python2/recipes-devtools/python/python-evdev/0001-Fix-build-on-32bit-arches-with-64bit-time_t.patch
new file mode 100644
index 00000000..154172ca
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-evdev/0001-Fix-build-on-32bit-arches-with-64bit-time_t.patch
@@ -0,0 +1,83 @@
+From 435e78aaf6745e4da0fe3d4455473011626c77d1 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 30 Nov 2019 11:21:20 -0800
+Subject: [PATCH] Fix build on 32bit arches with 64bit time_t
+
+time element is deprecated on new input_event structure in kernel's
+input.h [1]
+
+[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit?id=152194fe9c3f
+
+Upstream-Status: Submitted [https://github.com/gvalkov/python-evdev/pull/112]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ evdev/input.c | 13 +++++++++----
+ evdev/uinput.c | 9 ++++++++-
+ 2 files changed, 17 insertions(+), 5 deletions(-)
+
+diff --git a/evdev/input.c b/evdev/input.c
+index 67b9348..432db92 100644
+--- a/evdev/input.c
++++ b/evdev/input.c
+@@ -24,6 +24,11 @@
+ #include <linux/input.h>
+ #endif
+
++#ifndef input_event_sec
++#define input_event_sec time.tv_sec
++#define input_event_usec time.tv_usec
++#endif
++
+ #define MAX_NAME_SIZE 256
+
+ extern char* EV_NAME[EV_CNT];
+@@ -60,8 +65,8 @@ device_read(PyObject *self, PyObject *args)
+ return NULL;
+ }
+
+- PyObject* sec = PyLong_FromLong(event.time.tv_sec);
+- PyObject* usec = PyLong_FromLong(event.time.tv_usec);
++ PyObject* sec = PyLong_FromLong(event.input_event_sec);
++ PyObject* usec = PyLong_FromLong(event.input_event_usec);
+ PyObject* val = PyLong_FromLong(event.value);
+ PyObject* py_input_event = NULL;
+
+@@ -102,8 +107,8 @@ device_read_many(PyObject *self, PyObject *args)
+
+ // Construct a list of event tuples, which we'll make sense of in Python
+ for (unsigned i = 0 ; i < nread/event_size ; i++) {
+- sec = PyLong_FromLong(event[i].time.tv_sec);
+- usec = PyLong_FromLong(event[i].time.tv_usec);
++ sec = PyLong_FromLong(event[i].input_event_sec);
++ usec = PyLong_FromLong(event[i].input_event_usec);
+ val = PyLong_FromLong(event[i].value);
+
+ py_input_event = Py_BuildValue("OOhhO", sec, usec, event[i].type, event[i].code, val);
+diff --git a/evdev/uinput.c b/evdev/uinput.c
+index 192568d..56fe86c 100644
+--- a/evdev/uinput.c
++++ b/evdev/uinput.c
+@@ -16,6 +16,10 @@
+ #include <linux/uinput.h>
+ #endif
+
++#ifndef input_event_sec
++#define input_event_sec time.tv_sec
++#define input_event_usec time.tv_usec
++#endif
+
+ // Workaround for installing on kernels newer than 4.4.
+ #ifndef FF_MAX_EFFECTS
+@@ -232,8 +236,11 @@ uinput_write(PyObject *self, PyObject *args)
+ if (!ret) return NULL;
+
+ struct input_event event;
++ struct timeval tval;
+ memset(&event, 0, sizeof(event));
+- gettimeofday(&event.time, 0);
++ gettimeofday(&tval, 0);
++ event.input_event_usec = tval.tv_usec;
++ event.input_event_sec = tval.tv_sec;
+ event.type = type;
+ event.code = code;
+ event.value = value;
diff --git a/external/meta-python2/recipes-devtools/python/python-evdev_1.2.0.bb b/external/meta-python2/recipes-devtools/python/python-evdev_1.2.0.bb
new file mode 100644
index 00000000..533fa646
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-evdev_1.2.0.bb
@@ -0,0 +1,27 @@
+SUMMARY = "Python evdev lib"
+HOMEPAGE = "https://github.com/gvalkov/python-evdev"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=18debddbb3f52c661a129724a883a8e2"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-evdev:"
+
+SRC_URI += " file://0001-Fix-build-on-32bit-arches-with-64bit-time_t.patch"
+
+SRC_URI[md5sum] = "53e440943dfa2514f95b3c448d6a36cb"
+SRC_URI[sha256sum] = "b03f5e1be5b4a5327494a981b831d251a142b09e8778eda1a8b53eba91100166"
+
+do_compile_prepend() {
+ rm -rf ${S}/evdev/ecodes.c
+}
+
+DISTUTILS_BUILD_ARGS = "build_ecodes --evdev-headers ${STAGING_DIR_TARGET}/usr/include/linux/input.h:${STAGING_DIR_TARGET}/usr/include/linux/input-event-codes.h"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-ctypes \
+ ${PYTHON_PN}-fcntl \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-stringold \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-feedformatter_0.4.bb b/external/meta-python2/recipes-devtools/python/python-feedformatter_0.4.bb
new file mode 100644
index 00000000..2d7aae6b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-feedformatter_0.4.bb
@@ -0,0 +1,25 @@
+SUMMARY = "A Python library for generating news feeds in RSS and Atom formats"
+DESCRIPTION = "feedformatter is intended to be in many ways an "opposite" to \
+the well-known and well-loved Python module feedparser. Whereas feedparser \
+tries to turn any news feed in any format into a friendly data structure of \
+lists and dictionaries, feedformatter tries to turn a friendly data structure \
+of lists and dictionaries into a well-formatted news feed of whatever kind you \
+like."
+HOMEPAGE = "http://code.google.com/p/feedformatter/"
+SECTION = "devel/python"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://COPYING;md5=258e3f39e2383fbd011035d04311008d"
+
+SRC_URI = "git://github.com/marianoguerra/feedformatter.git"
+SRCREV = "7391193c83e10420b5a2d8ef846d23fc368c6d85"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-xml \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-feedparser_5.2.1.bb b/external/meta-python2/recipes-devtools/python/python-feedparser_5.2.1.bb
new file mode 100644
index 00000000..b8ee700f
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-feedparser_5.2.1.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Python Atom and RSS feed parser"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c21a7713ef6dc1b99644061c397e7c2a"
+
+SRC_URI[md5sum] = "d552f7a2a55e8e33b2a3fe1082505b42"
+SRC_URI[sha256sum] = "bd030652c2d08532c034c27fcd7c85868e7fa3cb2b17f230a44a6bbc92519bf9"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-codecs \
+ ${PYTHON_PN}-email \
+ ${PYTHON_PN}-html \
+ ${PYTHON_PN}-netserver \
+ ${PYTHON_PN}-stringold \
+ "
+
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-babel_0.12.2.bb b/external/meta-python2/recipes-devtools/python/python-flask-babel_0.12.2.bb
new file mode 100644
index 00000000..b40a676f
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-babel_0.12.2.bb
@@ -0,0 +1,21 @@
+SUMMARY = "i18n and l10n support for Flask based on babel and pytz"
+DESCRIPTION = "Implements i18n and l10n support for Flask. This is based on \
+the Python babel module as well as pytz both of which are installed \
+automatically for you if you install this library."
+HOMEPAGE = "http://github.com/python-babel/flask-babel"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=51917f3e8e858f5ae295a7d0e2eb3cc9"
+
+SRC_URI[md5sum] = "fcf2f360ff279d3133e40974804efd72"
+SRC_URI[sha256sum] = "316ad183e42003f3922957fa643d0a1e8e34a0f0301a88c3a8f605bc37ba5c86"
+
+PYPI_PACKAGE = "Flask-Babel"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-babel \
+ ${PYTHON_PN}-flask \
+ ${PYTHON_PN}-speaklater \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-bcrypt_0.7.1.bb b/external/meta-python2/recipes-devtools/python/python-flask-bcrypt_0.7.1.bb
new file mode 100644
index 00000000..d090b345
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-bcrypt_0.7.1.bb
@@ -0,0 +1,12 @@
+DESCRIPTION = "Bcrypt hashing for Flask."
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0ee2ee5bee7fe96597770e92db5719a8"
+
+SRC_URI[md5sum] = "d345c36ac6637d3ca9fa942e238d00ca"
+SRC_URI[sha256sum] = "d71c8585b2ee1c62024392ebdbc447438564e2c8c02b4e57b56a4cafd8d13c5f"
+
+PYPI_PACKAGE = "Flask-Bcrypt"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "${PYTHON_PN}-bcrypt ${PYTHON_PN}-flask"
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-bootstrap_3.3.7.1.bb b/external/meta-python2/recipes-devtools/python/python-flask-bootstrap_3.3.7.1.bb
new file mode 100644
index 00000000..eabc6003
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-bootstrap_3.3.7.1.bb
@@ -0,0 +1,21 @@
+SUMMARY = "An extension that includes Bootstrap in your project, without any boilerplate code."
+DESCRIPTION = "Flask-Bootstrap packages Bootstrap into an extension that \
+mostly consists of a blueprint named ‘bootstrap’. It can also create links to \
+serve Bootstrap from a CDN and works with no boilerplate code in your application."
+HOMEPAGE = "http://github.com/mbr/flask-bootstrap"
+
+LICENSE = "BSD"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=a03749709f06118a17349deb5a210619"
+
+SRC_URI[md5sum] = "e40d50f5c5b6438c1c6200a6f2871f81"
+SRC_URI[sha256sum] = "cb08ed940183f6343a64e465e83b3a3f13c53e1baabb8d72b5da4545ef123ac8"
+
+PYPI_PACKAGE = "Flask-Bootstrap"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-dominate \
+ ${PYTHON_PN}-flask \
+ ${PYTHON_PN}-visitor \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-login_0.4.1.bb b/external/meta-python2/recipes-devtools/python/python-flask-login_0.4.1.bb
new file mode 100644
index 00000000..df8c181b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-login_0.4.1.bb
@@ -0,0 +1,16 @@
+SUMMARY = "User session management for Flask"
+DESCRIPTION = "Flask-Login provides user session management for Flask. \
+It handles the common tasks of logging in, logging out, and remembering \
+your users’ sessions over extended periods of time."
+HOMEPAGE = "https://github.com/maxcountryman/flask-login"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8aa87a1cd9fa41d969ad32cfdac2c596"
+
+SRC_URI[md5sum] = "25b34c74bd509792f291c16e184225df"
+SRC_URI[sha256sum] = "c815c1ac7b3e35e2081685e389a665f2c74d7e077cb93cecabaea352da4752ec"
+
+PYPI_PACKAGE = "Flask-Login"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target = "${PYTHON_PN}-flask"
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-mail_0.9.1.bb b/external/meta-python2/recipes-devtools/python/python-flask-mail_0.9.1.bb
new file mode 100644
index 00000000..8e20f08d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-mail_0.9.1.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Flask extension for sending email"
+DESCRIPTION = "One of the most basic functions in a web application is the \
+ability to send emails to your users.\
+\
+The Flask-Mail extension provides a simple interface to set up SMTP with your \
+Flask application and to send messages from your views and scripts."
+HOMEPAGE = "https://github.com/mattupstate/flask-mail"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5b16dfa6d3f275ace5985bb92949f770"
+
+SRC_URI[md5sum] = "04b35a42a44ec7aa724ec8ce55e2e08e"
+SRC_URI[sha256sum] = "22e5eb9a940bf407bcf30410ecc3708f3c56cc44b29c34e1726fe85006935f41"
+
+PYPI_PACKAGE = "Flask-Mail"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "${PYTHON_PN}-flask"
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-migrate_2.5.2.bb b/external/meta-python2/recipes-devtools/python/python-flask-migrate_2.5.2.bb
new file mode 100644
index 00000000..b25167d4
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-migrate_2.5.2.bb
@@ -0,0 +1,20 @@
+SUMMARY = "SQLAlchemy database migrations for Flask applications using Alembic"
+DESCRIPTION = "Flask-Migrate is an extension that handles SQLAlchemy database \
+migrations for Flask applications using Alembic. The database operations are \
+provided as command-line arguments under the flask db command."
+HOMEPAGE = "https://github.com/miguelgrinberg/flask-migrate/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b69377f79f3f48c661701236d5a6a85"
+
+SRC_URI[md5sum] = "bedeb0366740fda6912fea683be11968"
+SRC_URI[sha256sum] = "a96ff1875a49a40bd3e8ac04fce73fdb0870b9211e6168608cbafa4eb839d502"
+
+PYPI_PACKAGE = "Flask-Migrate"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-flask-sqlalchemy \
+ ${PYTHON_PN}-alembic \
+ ${PYTHON_PN}-flask \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-nav_0.6.bb b/external/meta-python2/recipes-devtools/python/python-flask-nav_0.6.bb
new file mode 100644
index 00000000..ce9047db
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-nav_0.6.bb
@@ -0,0 +1,20 @@
+SUMMARY = "Easily create navigation for Flask applications."
+DESCRIPTION = "Flask-Nav is a Flask-Extension to ease the creation of \
+navigational Elements in Applications. It provides means to Express the \
+Navigational structure and different ways to render these, making it easy to \
+custom tailor it for your application."
+HOMEPAGE = "https://github.com/mbr/flask-nav"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=2729ee82259d601d90d28b0574d12416"
+
+SRC_URI[md5sum] = "4d51cfd06d58f8d0fe85775a6696c0e5"
+SRC_URI[sha256sum] = "44e40b755380a1e68ab521a2f9174de259a2c94ddcdaabf36b3aca2e110a33f4"
+
+PYPI_PACKAGE = "flask-nav"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-blinker \
+ ${PYTHON_PN}-flask \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-navigation_0.2.0.bb b/external/meta-python2/recipes-devtools/python/python-flask-navigation_0.2.0.bb
new file mode 100644
index 00000000..b2dc96e3
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-navigation_0.2.0.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "The navigation of Flask application."
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=af2ec695dc1f3eb7bd74f79a68a0d789"
+
+SRC_URI[md5sum] = "d1075ee02a3f69da37e5cadad3395f31"
+SRC_URI[sha256sum] = "c42d30efa989ca877444a410e8a1cd2563546f9effe3d9fe388eedf7a6c69285"
+
+PYPI_PACKAGE = "Flask-Navigation"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-blinker \
+ ${PYTHON_PN}-flask \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-pymongo_2.3.0.bb b/external/meta-python2/recipes-devtools/python/python-flask-pymongo_2.3.0.bb
new file mode 100644
index 00000000..19a3b9df
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-pymongo_2.3.0.bb
@@ -0,0 +1,17 @@
+SUMMARY = "PyMongo support for Flask applications"
+DESCRIPTION = "PyMongo support for Flask applications."
+HOMEPAGE = "https://github.com/mitsuhiko/flask/"
+SECTION = "devel/python"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://flask_pymongo/wrappers.py;beginline=1;endline=24;md5=424c4e1047d28e01b4e4634a069c019d"
+
+DEPENDS = "${PYTHON_PN}-vcversioner ${PYTHON_PN}-vcversioner-native"
+
+SRC_URI[md5sum] = "94df71e6800b1d7915cc91a74b70f959"
+SRC_URI[sha256sum] = "620eb02dc8808a5fcb90f26cab6cba9d6bf497b15032ae3ca99df80366e33314"
+
+PYPI_PACKAGE = "Flask-PyMongo"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "${PYTHON_PN}-pymongo ${PYTHON_PN}-flask"
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-restful_0.3.7.bb b/external/meta-python2/recipes-devtools/python/python-flask-restful_0.3.7.bb
new file mode 100644
index 00000000..6138e8a4
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-restful_0.3.7.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Simple framework for creating REST APIs"
+DESCRIPTION = "\
+Flask-RESTful is an extension for Flask that adds support for quickly building \
+REST APIs"
+HOMEPAGE = "https://github.com/flask-restful/flask-restful"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=685bb55ed99a366bb431995f5eef2783"
+
+SRC_URI[md5sum] = "a7217ef1159be38af5faf61aa09aabef"
+SRC_URI[sha256sum] = "f8240ec12349afe8df1db168ea7c336c4e5b0271a36982bff7394f93275f2ca9"
+
+inherit pypi setuptools
+
+PYPI_PACKAGE = "Flask-RESTful"
+
+RDEPENDS_${PN} = "${PYTHON_PN}-flask"
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-script_2.0.6.bb b/external/meta-python2/recipes-devtools/python/python-flask-script_2.0.6.bb
new file mode 100644
index 00000000..a930ee33
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-script_2.0.6.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Scripting support for flask"
+DESCRIPTION = "Flask support for writing external scripts."
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e686048adb69341fc8a08caeda528b41"
+
+SRC_URI[md5sum] = "3fbd91fe13cebedfb2431331f6eabb68"
+SRC_URI[sha256sum] = "6425963d91054cfcc185807141c7314a9c5ad46325911bd24dcb489bd0161c65"
+
+PYPI_PACKAGE = "Flask-Script"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-flask \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-sijax_0.4.1.bb b/external/meta-python2/recipes-devtools/python/python-flask-sijax_0.4.1.bb
new file mode 100644
index 00000000..40137117
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-sijax_0.4.1.bb
@@ -0,0 +1,18 @@
+
+SUMMARY = "An extension for the Flask microframework that adds Sijax support."
+DESCRIPTION = "Flask-Sijax is an extension for the Flask microframework, to \
+simplify Sijax (PyPi, GitHub) setup and usage for Flask users. \
+\
+Sijax is a Python/jQuery library that makes AJAX easy to use in web applications."
+HOMEPAGE = "https://github.com/spantaleev/flask-sijax"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=266adc7b911b7c84b837bf77196e1ba6"
+
+SRC_URI[sha256sum] = "fb2bf2d4f75408185102195055d75549fee8d9c9e954dca2427186925cdc429f"
+
+PYPI_PACKAGE = "Flask-Sijax"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "${PYTHON_PN}-sijax"
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-socketio_4.2.1.bb b/external/meta-python2/recipes-devtools/python/python-flask-socketio_4.2.1.bb
new file mode 100644
index 00000000..6bff30d3
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-socketio_4.2.1.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Socket.IO integration for Flask applications"
+HOMEPAGE = "https://github.com/miguelgrinberg/Flask-SocketIO/"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=38cc21254909604298ce763a6e4440a0"
+
+SRC_URI[md5sum] = "b23222fb7dd2f0676d78bbe24153fd80"
+SRC_URI[sha256sum] = "2172dff1e42415ba480cee02c30c2fc833671ff326f1598ee3d69aa02cf768ec"
+
+PYPI_PACKAGE = "Flask-SocketIO"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-flask \
+ ${PYTHON_PN}-socketio \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-sqlalchemy_2.4.1.bb b/external/meta-python2/recipes-devtools/python/python-flask-sqlalchemy_2.4.1.bb
new file mode 100644
index 00000000..b91c9e2d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-sqlalchemy_2.4.1.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Adds SQLAlchemy support to your Flask application."
+DESCRIPTION = "Flask-SQLAlchemy is an extension for Flask that adds support \
+for SQLAlchemy to your application. It aims to simplify using SQLAlchemy with \
+Flask by providing useful defaults and extra helpers that make it easier to \
+accomplish common tasks."
+HOMEPAGE = "https://github.com/pallets/flask-sqlalchemy"
+BUGTRACKER = "https://github.com/pallets/flask-sqlalchemy/issues"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75"
+
+SRC_URI[md5sum] = "1f5781cf3e1a2b1aabda47a5b20d2073"
+SRC_URI[sha256sum] = "6974785d913666587949f7c2946f7001e4fa2cb2d19f4e69ead02e4b8f50b33d"
+
+PYPI_PACKAGE = "Flask-SQLAlchemy"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "${PYTHON_PN}-sqlalchemy ${PYTHON_PN}-flask"
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-uploads_0.2.1.bb b/external/meta-python2/recipes-devtools/python/python-flask-uploads_0.2.1.bb
new file mode 100644
index 00000000..04d73bc8
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-uploads_0.2.1.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Flexible and efficient upload handling for Flask"
+DESCRIPTION = "Flask-Uploads provides flexible upload handling for Flask \
+applications. It lets you divide your uploads into sets that the application \
+user can publish separately."
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=b712ac634b39469660c9bdfb8d03421c"
+
+SRC_URI[md5sum] = "e5eee34aa92b64a4d22847672b3858a1"
+SRC_URI[sha256sum] = "53ecbd6033667d50ae02b63adebbaa33c7fc56c09e5293025810cf9d841ecb02"
+
+PYPI_PACKAGE = "Flask-Uploads"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-flask \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-user_0.6.19.bb b/external/meta-python2/recipes-devtools/python/python-flask-user_0.6.19.bb
new file mode 100644
index 00000000..f2319045
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-user_0.6.19.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Customizable user account management for Flask"
+DESCRIPTION = "Customizable User Account Management for Flask; Register \
+Confirm email, Login, Change username, Change password, Forgot Password \
+and more."
+HOMEPAGE = " https://github.com/lingthio/Flask-User"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=97de97cd9d6e23c88129d884588ce71a"
+
+SRC_URI[md5sum] = "f7965e66ca139c8436896da07e66c21f"
+SRC_URI[sha256sum] = "601abcc0343dfbae0c56273d98362d5cdc266ac84d20b3f65a212e4a2c83b302"
+
+PYPI_PACKAGE = "Flask-User"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "${PYTHON_PN}-flask \
+ ${PYTHON_PN}-flask-login \
+ ${PYTHON_PN}-flask-mail \
+ ${PYTHON_PN}-babel"
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-wtf_0.14.2.bb b/external/meta-python2/recipes-devtools/python/python-flask-wtf_0.14.2.bb
new file mode 100644
index 00000000..23162c26
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-wtf_0.14.2.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Simple integration of Flask and WTForms."
+DESCRIPTION = "Simple integration of Flask and WTForms, including CSRF, file \
+upload, and reCAPTCHA."
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3ca6bb31670492f791e6a9f2fb9f8a80"
+
+SRC_URI[md5sum] = "586f50f233926cade42e3d744aca3e8f"
+SRC_URI[sha256sum] = "5d14d55cfd35f613d99ee7cba0fc3fbbe63ba02f544d349158c14ca15561cc36"
+
+PYPI_PACKAGE = "Flask-WTF"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "\
+ ${PYTHON_PN}-flask \
+ ${PYTHON_PN}-itsdangerous \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-wtforms \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch b/external/meta-python2/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch
new file mode 100644
index 00000000..a2d620ad
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch
@@ -0,0 +1,7 @@
+--- Flask-XStatic-0.0.1/setup.py.orig 2015-01-30 08:01:56.000000000 -0800
++++ Flask-XStatic-0.0.1/setup.py 2017-04-17 21:40:32.570181626 -0700
+@@ -1,4 +1,3 @@
+-from pip.req import parse_requirements
+ import setuptools
+
+ with open('README.rst') as f:
diff --git a/external/meta-python2/recipes-devtools/python/python-flask-xstatic_0.0.1.bb b/external/meta-python2/recipes-devtools/python/python-flask-xstatic_0.0.1.bb
new file mode 100644
index 00000000..eea36ebe
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask-xstatic_0.0.1.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Flask support for XStatic assets"
+DESCRIPTION = "Flask is a Python microframework for building websites. \
+\
+XStatic is a format for packaging static assets. For example, XStatic-jQuery \
+is jquery in a form that you can pip install. \
+\
+This (Flask-XStatic) is a Flask extension that simplifies using XStatic assets \
+in your project."
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=659968f6ebd4b70b6c3190d20b4a924c"
+
+SRC_URI[md5sum] = "2f56023e1444c8bd1fec41afe93de743"
+SRC_URI[sha256sum] = "226ea8e97065a9488b59bfe5c94af4c6e2ea70a25052e301fb231a1381490133"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-flask-xstatic:"
+SRC_URI += "file://remove-pip-requires.patch"
+
+PYPI_PACKAGE = "Flask-XStatic"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-flask \
+ ${PYTHON_PN}-xstatic \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-flask_1.1.1.bb b/external/meta-python2/recipes-devtools/python/python-flask_1.1.1.bb
new file mode 100644
index 00000000..432b944d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-flask_1.1.1.bb
@@ -0,0 +1,23 @@
+SUMMARY = "A microframework based on Werkzeug, Jinja2 and good intentions"
+DESCRIPTION = "\
+Flask is a microframework for Python based on Werkzeug, Jinja 2 and good \
+intentions. And before you ask: It’s BSD licensed!"
+HOMEPAGE = "https://github.com/mitsuhiko/flask/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75"
+
+SRC_URI[md5sum] = "0e3ed44ece1c489ed835d1b7047e349c"
+SRC_URI[sha256sum] = "13f9f196f330c7c2c5d7a5cf91af894110ca0215ac051b5844701f2bfd934d52"
+
+CLEANBROKEN = "1"
+
+PYPI_PACKAGE = "Flask"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "\
+ ${PYTHON_PN}-click \
+ ${PYTHON_PN}-itsdangerous \
+ ${PYTHON_PN}-jinja2 \
+ ${PYTHON_PN}-werkzeug \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-funcsigs_1.0.2.bb b/external/meta-python2/recipes-devtools/python/python-funcsigs_1.0.2.bb
new file mode 100644
index 00000000..dad15ee0
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-funcsigs_1.0.2.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+"
+DESCRPTION = " \
+funcsigs is a backport of the `PEP 362`_ function signature features from \
+Python 3.3's `inspect`_ module. The backport is compatible with Python 2.6, \
+2.7 as well as 3.3 and up. 3.2 was supported by version 0.4, but with \
+setuptools and pip no longer supporting 3.2, we cannot make any statement \
+about 3.2 compatibility. \
+"
+
+HOMEPAGE = "http://funcsigs.readthedocs.org"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d6bc91dc8e5793892189fe7481a2d354"
+
+SRC_URI[md5sum] = "7e583285b1fb8a76305d6d68f4ccc14e"
+SRC_URI[sha256sum] = "a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-functools32_3.2.3-2.bb b/external/meta-python2/recipes-devtools/python/python-functools32_3.2.3-2.bb
new file mode 100644
index 00000000..cb4bba49
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-functools32_3.2.3-2.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Backport of the functools module from Python 3.2.3 for use on 2.7 and PyPy."
+LICENSE = "PSF"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=27cf2345969ed18e6730e90fb0063a10"
+
+SRC_URI[md5sum] = "09f24ffd9af9f6cd0f63cb9f4e23d4b2"
+SRC_URI[sha256sum] = "f6253dfbe0538ad2e387bd8fdfd9293c925d63553f5813c4e587745416501e6d"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-future_0.18.2.bb b/external/meta-python2/recipes-devtools/python/python-future_0.18.2.bb
new file mode 100644
index 00000000..8fa066db
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-future_0.18.2.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Clean single-source support for Python 3 and 2"
+DESCRIPTION = "future is the missing compatibility layer between Python 2 and \
+Python 3. It allows you to use a single, clean Python 3.x-compatible codebase \
+to support both Python 2 and Python 3 with minimal overhead."
+HOMEPAGE = "https://python-future.org"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a253924061f8ecc41ad7a2ba1560e8e7"
+
+SRC_URI[md5sum] = "e4579c836b9c025872efe230f6270349"
+SRC_URI[sha256sum] = "b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"
+
+PYPI_PACKAGE_HASH = "99abde815842bc6e97d5a7806ad51236630da14ca2f3b1fce94c0bb94d3d"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_append_class-target = " python-misc"
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-futures_3.3.0.bb b/external/meta-python2/recipes-devtools/python/python-futures_3.3.0.bb
new file mode 100644
index 00000000..1636f737
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-futures_3.3.0.bb
@@ -0,0 +1,13 @@
+DESCRIPTION = "The concurrent.futures module provides a high-level interface for asynchronously executing callables."
+SECTION = "devel/python"
+LICENSE = "PSF"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=834d982f973c48b6d662b5944c5ab567"
+HOMEPAGE = "https://github.com/agronholm/pythonfutures"
+DEPENDS = "python"
+
+SRC_URI[md5sum] = "b43a39ae1475e3fd6940f2b4f7214675"
+SRC_URI[sha256sum] = "7e033af76a5e35f58e56da7a91e687706faf4e7bdfb2cbc3f2cca6b9bcda9794"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-gdata_2.0.18.bb b/external/meta-python2/recipes-devtools/python/python-gdata_2.0.18.bb
new file mode 100644
index 00000000..897581f1
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-gdata_2.0.18.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Google Data APIs Python Client Library"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://README.txt;md5=4c8f0e6846e52a7fe4943acf462d808d"
+HOMEPAGE = "http://code.google.com/p/gdata-python-client/"
+
+SRC_URI[md5sum] = "13b6e6dd8f9e3e9a8e005e05a8329408"
+SRC_URI[sha256sum] = "56e7d22de819c22b13ceb0fe1869729b4287f89ebbd4bb55380d7bcf61a1fdb6"
+
+S = "${WORKDIR}/gdata.py-${PV}"
+
+inherit pypi distutils
+
+FILES_${PN} += "${datadir}"
+
+RDEPENDS_${PN} = " \
+ ${PYTHON_PN}-distutils \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-netserver \
+ ${PYTHON_PN}-stringold \
+ ${PYTHON_PN}-xml \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-gevent/0002-setup.py-do-not-query-for-include-dir.patch b/external/meta-python2/recipes-devtools/python/python-gevent/0002-setup.py-do-not-query-for-include-dir.patch
new file mode 100644
index 00000000..7536b71a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-gevent/0002-setup.py-do-not-query-for-include-dir.patch
@@ -0,0 +1,26 @@
+From a53ed6b2f967a5f95e69d51cad3f8c120d7df65b Mon Sep 17 00:00:00 2001
+From: Alexander Kanavin <alex.kanavin@gmail.com>
+Date: Thu, 7 Feb 2019 15:21:15 +0100
+Subject: [PATCH] setup.py: do not query for include dir
+
+As this will return the native python directory erroneously.
+
+Upstream-Status: Inappropriate [oe-core specific]
+Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com>
+---
+ setup.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index 86d6c5a..5d22291 100755
+--- a/setup.py
++++ b/setup.py
+@@ -52,7 +52,7 @@ from _setupares import ARES
+ # Get access to the greenlet header file.
+ # The sysconfig dir is not enough if we're in a virtualenv
+ # See https://github.com/pypa/pip/issues/4610
+-include_dirs = [sysconfig.get_path("include")]
++include_dirs = []
+ venv_include_dir = os.path.join(sys.prefix, 'include', 'site',
+ 'python' + sysconfig.get_python_version())
+ venv_include_dir = os.path.abspath(venv_include_dir)
diff --git a/external/meta-python2/recipes-devtools/python/python-gevent/libev-conf.patch b/external/meta-python2/recipes-devtools/python/python-gevent/libev-conf.patch
new file mode 100644
index 00000000..79c1867b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-gevent/libev-conf.patch
@@ -0,0 +1,26 @@
+From 2294734ef9d5e2efb05820e9759a1635799bdea9 Mon Sep 17 00:00:00 2001
+From: Andrej Rode <andrej.rode@ettus.com>
+Date: Mon, 10 Apr 2017 19:25:18 -0700
+Subject: [PATCH] libev: make configure crosscompile compatible
+
+Signed-off-by: Andrej Rode <andrej.rode@ettus.com>
+---
+ deps/libev/configure | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/deps/libev/configure b/deps/libev/configure
+index 743817e..96c2366 100755
+--- a/deps/libev/configure
++++ b/deps/libev/configure
+@@ -2208,7 +2208,7 @@ fi
+ ac_ext=c
+ ac_cpp='$CPP $CPPFLAGS'
+ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_link='$CC -static -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+--
+2.10.2
+
diff --git a/external/meta-python2/recipes-devtools/python/python-gevent_1.4.0.bb b/external/meta-python2/recipes-devtools/python/python-gevent_1.4.0.bb
new file mode 100644
index 00000000..311f6724
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-gevent_1.4.0.bb
@@ -0,0 +1,40 @@
+SUMMARY = "A coroutine-based Python networking library"
+DESCRIPTION = "gevent is a coroutine-based Python networking library that uses greenlet to provide \
+a high-level synchronous API on top of the libevent event loop."
+HOMEPAGE = "http://www.gevent.org"
+LICENSE = "MIT & Python-2.0 & BSD"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4de99aac27b470c29c6c309e0c279b65 \
+ file://NOTICE;md5=18108df3583462cafd457f024b9b09b5 \
+ file://deps/libev/LICENSE;md5=d6ad416afd040c90698edcdf1cbee347 \
+ "
+
+SRC_URI[md5sum] = "6b9dd98917061803d9158e5258b8f412"
+SRC_URI[sha256sum] = "1eb7fa3b9bd9174dfe9c3b59b7a09b768ecd496debfc4976a9530a3e15c990d1"
+
+DEPENDS += "libevent ${PYTHON_PN}-greenlet"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-gevent:"
+
+SRC_URI_append = " \
+ file://libev-conf.patch;patch=1;pnum=1 \
+ file://0002-setup.py-do-not-query-for-include-dir.patch \
+"
+
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "\
+ ${PYTHON_PN}-greenlet \
+ ${PYTHON_PN}-mime \
+ ${PYTHON_PN}-pprint \
+ ${PYTHON_PN}-re \
+"
+
+# The python-gevent has no autoreconf ability
+# and the logic for detecting a cross compile is flawed
+# so always force a cross compile
+do_configure_append() {
+ sed -i -e 's/^cross_compiling=no/cross_compiling=yes/' ${S}/deps/libev/configure
+ sed -i -e 's/^cross_compiling=no/cross_compiling=yes/' ${S}/deps/c-ares/configure
+}
+
diff --git a/external/meta-python2/recipes-devtools/python/python-greenlet_0.4.15.bb b/external/meta-python2/recipes-devtools/python/python-greenlet_0.4.15.bb
new file mode 100644
index 00000000..30ba655a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-greenlet_0.4.15.bb
@@ -0,0 +1,9 @@
+SUMMARY = "Python lightweight in-process concurrent programming"
+LICENSE = "MIT & PSF"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=03143d7a1a9f5d8a0fee825f24ca9c36 \
+ file://LICENSE.PSF;md5=c106931d9429eda0492617f037b8f69a"
+
+SRC_URI[md5sum] = "10fa304f673fc18b28fa6d8c6658cb80"
+SRC_URI[sha256sum] = "9416443e219356e3c31f1f918a91badf2e37acf297e2fa13d24d1cc2380f8fbc"
+
+inherit pypi distutils
diff --git a/external/meta-python2/recipes-devtools/python/python-grpcio-tools_1.14.1.bb b/external/meta-python2/recipes-devtools/python/python-grpcio-tools_1.14.1.bb
new file mode 100644
index 00000000..08201695
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-grpcio-tools_1.14.1.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Protobuf code generator for gRPC"
+DESCRIPTION = "Google gRPC tools"
+HOMEPAGE = "http://www.grpc.io/"
+SECTION = "devel/python"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=7145f7cdd263359b62d342a02f005515"
+
+SRC_URI[md5sum] = "b2fabfb54c7824c1e49a02de2aa6628e"
+SRC_URI[sha256sum] = "4ce5aa660d7884f23aac1eafa93b97a4c3e2b512edff871e91fdb6ee86ebd5ea"
+
+DEPENDS_append = " ${PYTHON_PN}-grpcio"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "${PYTHON_PN}-grpcio"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-grpcio/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch b/external/meta-python2/recipes-devtools/python/python-grpcio/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch
new file mode 100644
index 00000000..131daace
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-grpcio/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch
@@ -0,0 +1,64 @@
+From b02be74a2eff8abc612ef84f30e0fbce6a7f65f5 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Fri, 4 Aug 2017 09:04:07 -0700
+Subject: [PATCH] setup.py: Do not mix C and C++ compiler options
+
+EXTRA_ENV_COMPILE_ARGS is used both with CC and CXX
+so using -std=c++11 or -std=gnu99 together will cause
+build time errors espcially with clang
+
+error: invalid argument '-std=gnu99' not allowed with 'C++'
+
+gcc7 ( defaults are -std=gnu11 and -std=gnu++14 )
+ as well clang default to these standards mode or newer
+anyway
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ setup.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/setup.py
++++ b/setup.py
+@@ -144,9 +144,10 @@ ENABLE_DOCUMENTATION_BUILD = os.environ.
+
+ def check_linker_need_libatomic():
+ """Test if linker on system needs libatomic."""
++ compiler, cc_args = os.environ.get('CC').split(' ', 1) or 'cc'
+ code_test = (b'#include <atomic>\n' +
+ b'int main() { return std::atomic<int64_t>{}; }')
+- cc_test = subprocess.Popen(['cc', '-x', 'c++', '-std=c++11', '-'],
++ cc_test = subprocess.Popen([compiler, cc_args, '-x', 'c++', '-std=c++11', '-'],
+ stdin=PIPE,
+ stdout=PIPE,
+ stderr=PIPE)
+@@ -163,7 +164,7 @@ def check_linker_need_libatomic():
+ EXTRA_ENV_COMPILE_ARGS = os.environ.get('GRPC_PYTHON_CFLAGS', None)
+ EXTRA_ENV_LINK_ARGS = os.environ.get('GRPC_PYTHON_LDFLAGS', None)
+ if EXTRA_ENV_COMPILE_ARGS is None:
+- EXTRA_ENV_COMPILE_ARGS = ' -std=c++11'
++ EXTRA_ENV_COMPILE_ARGS = ' '
+ if 'win32' in sys.platform:
+ if sys.version_info < (3, 5):
+ EXTRA_ENV_COMPILE_ARGS += ' -D_hypot=hypot'
+@@ -180,7 +181,7 @@ if EXTRA_ENV_COMPILE_ARGS is None:
+ # available dynamically
+ EXTRA_ENV_COMPILE_ARGS += ' /MT'
+ elif "linux" in sys.platform:
+- EXTRA_ENV_COMPILE_ARGS += ' -std=gnu99 -fvisibility=hidden -fno-wrapv -fno-exceptions'
++ EXTRA_ENV_COMPILE_ARGS += ' -fvisibility=hidden -fno-wrapv -fno-exceptions'
+ elif "darwin" in sys.platform:
+ EXTRA_ENV_COMPILE_ARGS += ' -stdlib=libc++ -fvisibility=hidden -fno-wrapv -fno-exceptions'
+
+--- a/src/python/grpcio/commands.py
++++ b/src/python/grpcio/commands.py
+@@ -216,7 +216,8 @@ class BuildExt(build_ext.build_ext):
+ when invoked in C mode. GCC is okay with this, while clang is not.
+ """
+ # TODO(lidiz) Remove the generated a.out for success tests.
+- cc_test = subprocess.Popen(['cc', '-x', 'c', '-std=c++11', '-'],
++ compiler, cc_args = os.environ.get('CC').split(' ', 1) or 'cc'
++ cc_test = subprocess.Popen([compiler, cc_args, '-x', 'c', '-std=c++11', '-'],
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
diff --git a/external/meta-python2/recipes-devtools/python/python-grpcio/ppc-boringssl-support.patch b/external/meta-python2/recipes-devtools/python/python-grpcio/ppc-boringssl-support.patch
new file mode 100644
index 00000000..8ac2aef8
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-grpcio/ppc-boringssl-support.patch
@@ -0,0 +1,17 @@
+Let boringSSL compile on ppc32 bit
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+
+--- a/third_party/boringssl/include/openssl/base.h
++++ b/third_party/boringssl/include/openssl/base.h
+@@ -99,6 +99,9 @@ extern "C" {
+ #elif (defined(__PPC64__) || defined(__powerpc64__)) && defined(_LITTLE_ENDIAN)
+ #define OPENSSL_64_BIT
+ #define OPENSSL_PPC64LE
++#elif (defined(__PPC__) || defined(__powerpc__))
++#define OPENSSL_32_BIT
++#define OPENSSL_PPC
+ #elif defined(__mips__) && !defined(__LP64__)
+ #define OPENSSL_32_BIT
+ #define OPENSSL_MIPS
diff --git a/external/meta-python2/recipes-devtools/python/python-grpcio/riscv64_support.patch b/external/meta-python2/recipes-devtools/python/python-grpcio/riscv64_support.patch
new file mode 100644
index 00000000..b55d50bd
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-grpcio/riscv64_support.patch
@@ -0,0 +1,16 @@
+Add RISC-V 64bit support
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+--- a/third_party/boringssl/include/openssl/base.h
++++ b/third_party/boringssl/include/openssl/base.h
+@@ -108,6 +108,9 @@ extern "C" {
+ #elif defined(__mips__) && defined(__LP64__)
+ #define OPENSSL_64_BIT
+ #define OPENSSL_MIPS64
++#elif defined(__riscv) && defined(__riscv_xlen)
++#define OPENSSL_64_BIT
++#define OPENSSL_RISCV64
+ #elif defined(__pnacl__)
+ #define OPENSSL_32_BIT
+ #define OPENSSL_PNACL
diff --git a/external/meta-python2/recipes-devtools/python/python-grpcio_1.27.1.bb b/external/meta-python2/recipes-devtools/python/python-grpcio_1.27.1.bb
new file mode 100644
index 00000000..6768e7e1
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-grpcio_1.27.1.bb
@@ -0,0 +1,31 @@
+SUMMARY = "HTTP/2-based RPC framework"
+DESCRIPTION = "Google gRPC"
+HOMEPAGE = "http://www.grpc.io/"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+SRC_URI_append_class-target = " file://0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch \
+ file://ppc-boringssl-support.patch \
+ file://riscv64_support.patch \
+"
+SRC_URI[md5sum] = "ccaf4e7eb4f031d926fb80035d193b98"
+SRC_URI[sha256sum] = "a899725d34769a498ecd3be154021c4368dd22bdc69473f6ec46779696f626c4"
+
+DEPENDS_append = " ${PYTHON_PN}-protobuf"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "\
+ ${PYTHON_PN}-protobuf \
+ ${PYTHON_PN}-setuptools \
+ ${PYTHON_PN}-six \
+ python-enum34 \
+ python-futures \
+"
+
+export GRPC_PYTHON_DISABLE_LIBC_COMPATIBILITY = "1"
+
+CLEANBROKEN = "1"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-html5lib_1.0.1.bb b/external/meta-python2/recipes-devtools/python/python-html5lib_1.0.1.bb
new file mode 100644
index 00000000..21b80f26
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-html5lib_1.0.1.bb
@@ -0,0 +1,17 @@
+SUMMARY = "HTML parser based on the WHATWG HTML specifcation"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=1ba5ada9e6fead1fdc32f43c9f10ba7c"
+
+SRC_URI[md5sum] = "942a0688d6bdf20d087c9805c40182ad"
+SRC_URI[sha256sum] = "66cb0dcfdbbc4f9c3ba1a63fdb511ffdbd4f513b2b6d81b80cd26ce6b3fb3736"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-lxml \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-webencodings \
+ ${PYTHON_PN}-xml \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-humanfriendly_4.18.bb b/external/meta-python2/recipes-devtools/python/python-humanfriendly_4.18.bb
new file mode 100644
index 00000000..96f6f833
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-humanfriendly_4.18.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Human friendly output for text interfaces using Python"
+DESCRIPTION = "Human friendly output for text interfaces using Python"
+HOMEPAGE = "https://humanfriendly.readthedocs.io/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=690da298a43805797a4fa7bbe180b3c6"
+
+PYPI_PACKAGE = "humanfriendly"
+
+SRC_URI[md5sum] = "9573f9f37a5454d8205cfd1b9b8db9d2"
+SRC_URI[sha256sum] = "33ee8ceb63f1db61cce8b5c800c531e1a61023ac5488ccde2ba574a85be00a85"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target += " \
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-fcntl \
+ ${PYTHON_PN}-html \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-math \
+ ${PYTHON_PN}-multiprocessing \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-stringold \
+ ${PYTHON_PN}-unittest \
+"
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-humanize_0.5.1.bb b/external/meta-python2/recipes-devtools/python/python-humanize_0.5.1.bb
new file mode 100644
index 00000000..e91230df
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-humanize_0.5.1.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Python humanize utilities"
+HOMEPAGE = "http://github.com/jmoiron/humanize"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENCE;md5=d2eff82fc25dd07c919a02465884f02e"
+
+SRC_URI[md5sum] = "e8473d9dc1b220911cac2edd53b1d973"
+SRC_URI[sha256sum] = "a43f57115831ac7c70de098e6ac46ac13be00d69abbf60bdcac251344785bb19"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-datetime \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-hyperlink_19.0.0.bb b/external/meta-python2/recipes-devtools/python/python-hyperlink_19.0.0.bb
new file mode 100644
index 00000000..ad68b1b7
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-hyperlink_19.0.0.bb
@@ -0,0 +1,22 @@
+SUMMARY = "A featureful, correct URL for Python"
+DESCRIPTION = "A featureful, correct URL for Python"
+HOMEPAGE = "https://github.com/python-hyper/hyperlink"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3893d4ed05dcc823f8ed685a9ea19bcb"
+
+SRC_URI[sha256sum] = "4288e34705da077fada1111a24a0aa08bb1e76699c9ce49876af722441845654"
+SRC_URI[md5sum] = "4772fb4d87c26a1ab22a6161424e3cba"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-idna \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-stringold \
+"
+
+PACKAGES =. "${PN}-test "
+
+FILES_${PN}-test += " \
+ ${PYTHON_SITEPACKAGES_DIR}/hyperlinkt/test \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-hypothesis_4.50.2.bb b/external/meta-python2/recipes-devtools/python/python-hypothesis_4.50.2.bb
new file mode 100644
index 00000000..4cf7d5d9
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-hypothesis_4.50.2.bb
@@ -0,0 +1,22 @@
+SUMMARY = "A library for property based testing"
+DESCRIPTION = "Hypothesis is an advanced testing library for Python. It lets \
+you write tests which are parametrized by a source of examples, and then \
+generates simple and comprehensible examples that make your tests fail. This \
+lets you find more bugs in your code with less work."
+HOMEPAGE = "https://github.com/HypothesisWorks/hypothesis/tree/master/hypothesis-python"
+BUGTRACKER = "https://github.com/HypothesisWorks/hypothesis/issues"
+SECTION = "devel/python"
+
+LICENSE = "MPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4ee62c16ebd0f4f99d906f36b7de8c3c"
+
+SRC_URI[md5sum] = "2cf187bc0b3a61d08b13743985a71646"
+SRC_URI[sha256sum] = "c50157747f80930c0e9367a2ef10599204cc098007e18ba8daeac0620ee674cb"
+
+DEPENDS = "${PYTHON_PN}-attrs"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-enum34 \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-idna_2.8.bb b/external/meta-python2/recipes-devtools/python/python-idna_2.8.bb
new file mode 100644
index 00000000..74ed8e3e
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-idna_2.8.bb
@@ -0,0 +1,20 @@
+SUMMARY = "Internationalised Domain Names in Applications"
+HOMEPAGE = "https://github.com/kjd/idna"
+LICENSE = "BSD-3-Clause & Python-2.0 & Unicode"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=782775b32f96098512e283fb5d4546cd"
+
+SRC_URI[md5sum] = "2e9ae0b4a0b26d1747c6127cdb060bc1"
+SRC_URI[sha256sum] = "c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target = "\
+ ${PYTHON_PN}-codecs \
+"
+
+# Remove bundled egg-info
+do_compile_prepend() {
+ rm -rf ${S}/idna.egg-info
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-imaging/0001-python-imaging-setup.py-force-paths-for-zlib-freetyp.patch b/external/meta-python2/recipes-devtools/python/python-imaging/0001-python-imaging-setup.py-force-paths-for-zlib-freetyp.patch
new file mode 100644
index 00000000..2575306b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-imaging/0001-python-imaging-setup.py-force-paths-for-zlib-freetyp.patch
@@ -0,0 +1,55 @@
+From 07d4f095a9e22ae676a8d68073101131e65012dc Mon Sep 17 00:00:00 2001
+From: Koen Kooi <koen@dominion.thruhere.net>
+Date: Tue, 15 Nov 2011 13:16:54 +0100
+Subject: [PATCH] python imaging setup.py: force paths for zlib, freetype and jpeg and don't add host paths
+
+Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
+
+Upstream-Status: Inappropriate [embedded specific]
+---
+ setup.py | 14 +++-----------
+ 1 files changed, 3 insertions(+), 11 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index 5d4d53a..b1a22ec 100644
+--- a/setup.py
++++ b/setup.py
+@@ -34,10 +34,10 @@ def libinclude(root):
+ # TIFF_ROOT = libinclude("/opt/tiff")
+
+ TCL_ROOT = None
+-JPEG_ROOT = None
+-ZLIB_ROOT = None
++JPEG_ROOT = os.environ['STAGING_LIBDIR']
++ZLIB_ROOT = os.environ['STAGING_LIBDIR']
+ TIFF_ROOT = None
+-FREETYPE_ROOT = None
++FREETYPE_ROOT = os.environ['STAGING_LIBDIR'], os.environ['STAGING_INCDIR']
+ LCMS_ROOT = None
+
+ # FIXME: add mechanism to explicitly *disable* the use of a library
+@@ -147,7 +147,6 @@ class pil_build_ext(build_ext):
+ add_directory(library_dirs, "/opt/local/lib")
+ add_directory(include_dirs, "/opt/local/include")
+
+- add_directory(library_dirs, "/usr/local/lib")
+ # FIXME: check /opt/stuff directories here?
+
+ prefix = sysconfig.get_config_var("prefix")
+@@ -207,13 +206,6 @@ class pil_build_ext(build_ext):
+ if os.path.isfile(os.path.join(tcl_dir, "tk.h")):
+ add_directory(include_dirs, tcl_dir)
+
+- # standard locations
+- add_directory(library_dirs, "/usr/local/lib")
+- add_directory(include_dirs, "/usr/local/include")
+-
+- add_directory(library_dirs, "/usr/lib")
+- add_directory(include_dirs, "/usr/include")
+-
+ #
+ # insert new dirs *before* default libs, to avoid conflicts
+ # between Python PYD stub libs and real libraries
+--
+1.7.2.5
+
diff --git a/external/meta-python2/recipes-devtools/python/python-imaging/allow.to.disable.some.features.patch b/external/meta-python2/recipes-devtools/python/python-imaging/allow.to.disable.some.features.patch
new file mode 100644
index 00000000..4960ed46
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-imaging/allow.to.disable.some.features.patch
@@ -0,0 +1,65 @@
+At least lcms wasn't deterministicly detected from sysroot.
+
+This will allow to export LCMS_ENABLED=False when lcms isn't in PACKAGECONFIG.
+
+Upstream-Status: Inappropriate [configuration]
+
+Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
+
+diff -uNr Imaging-1.1.7.orig/setup.py Imaging-1.1.7/setup.py
+--- Imaging-1.1.7.orig/setup.py 2013-07-22 10:17:02.081457075 +0200
++++ Imaging-1.1.7/setup.py 2013-07-22 13:10:09.029707492 +0200
+@@ -39,6 +39,12 @@
+ TIFF_ROOT = None
+ FREETYPE_ROOT = os.environ['STAGING_LIBDIR'], os.environ['STAGING_INCDIR']
+ LCMS_ROOT = None
++TCL_ENABLED = os.getenv('TCL_ENABLED', "True")
++JPEG_ENABLED = os.getenv('JPEG_ENABLED', "True")
++ZLIB_ENABLED = os.getenv('ZLIB_ENABLED', "True")
++TIFF_ENABLED = os.getenv('TIFF_ENABLED', "True")
++FREETYPE_ENABLED = os.getenv('FREETYPE_ENABLED', "True")
++LCMS_ENABLED = os.getenv('LCMS_ENABLED', "True")
+
+ # FIXME: add mechanism to explicitly *disable* the use of a library
+
+@@ -220,22 +226,22 @@
+ zlib = jpeg = tiff = freetype = tcl = tk = lcms = None
+ feature = feature()
+
+- if find_include_file(self, "zlib.h"):
++ if ZLIB_ENABLED == 'True' and find_include_file(self, "zlib.h"):
+ if find_library_file(self, "z"):
+ feature.zlib = "z"
+ elif sys.platform == "win32" and find_library_file(self, "zlib"):
+ feature.zlib = "zlib" # alternative name
+
+- if find_include_file(self, "jpeglib.h"):
++ if JPEG_ENABLED == 'True' and find_include_file(self, "jpeglib.h"):
+ if find_library_file(self, "jpeg"):
+ feature.jpeg = "jpeg"
+ elif sys.platform == "win32" and find_library_file(self, "libjpeg"):
+ feature.jpeg = "libjpeg" # alternative name
+
+- if find_library_file(self, "tiff"):
++ if TIFF_ENABLED == 'True' and find_library_file(self, "tiff"):
+ feature.tiff = "tiff"
+
+- if find_library_file(self, "freetype"):
++ if FREETYPE_ENABLED == 'True' and find_library_file(self, "freetype"):
+ # look for freetype2 include files
+ freetype_version = 0
+ for dir in self.compiler.include_dirs:
+@@ -256,11 +262,11 @@
+ if dir:
+ add_directory(self.compiler.include_dirs, dir, 0)
+
+- if find_include_file(self, "lcms.h"):
++ if LCMS_ENABLED == 'True' and find_include_file(self, "lcms.h"):
+ if find_library_file(self, "lcms"):
+ feature.lcms = "lcms"
+
+- if _tkinter and find_include_file(self, "tk.h"):
++ if TCL_ENABLED == 'True' and _tkinter and find_include_file(self, "tk.h"):
+ # the library names may vary somewhat (e.g. tcl84 or tcl8.4)
+ version = TCL_VERSION[0] + TCL_VERSION[2]
+ if find_library_file(self, "tcl" + version):
diff --git a/external/meta-python2/recipes-devtools/python/python-imaging/fix-freetype-includes.patch b/external/meta-python2/recipes-devtools/python/python-imaging/fix-freetype-includes.patch
new file mode 100644
index 00000000..9ecc63a0
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-imaging/fix-freetype-includes.patch
@@ -0,0 +1,30 @@
+Upstream-Status: Backport
+Signed-off-by: Ross Burton <ross.burton@intel.com>
+
+From c6040f618d8f2706a7b46d1cdf37d1a587f9701f Mon Sep 17 00:00:00 2001
+From: Andrew Stromnov <stromnov@gmail.com>
+Date: Thu, 28 Nov 2013 16:58:43 +0400
+Subject: [PATCH] fix compiling with FreeType 2.5.1
+
+---
+ _imagingft.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/_imagingft.c b/_imagingft.c
+index 47d50bd..f19555b 100644
+--- a/_imagingft.c
++++ b/_imagingft.c
+@@ -59,7 +59,11 @@ struct {
+ const char* message;
+ } ft_errors[] =
+
++#if defined(USE_FREETYPE_2_1)
++#include FT_ERRORS_H
++#else
+ #include <freetype/fterrors.h>
++#endif
+
+ /* -------------------------------------------------------------------- */
+ /* font objects */
+--
+1.8.5.1
diff --git a/external/meta-python2/recipes-devtools/python/python-imaging/python-imaging-CVE-2016-2533.patch b/external/meta-python2/recipes-devtools/python/python-imaging/python-imaging-CVE-2016-2533.patch
new file mode 100644
index 00000000..b01136f9
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-imaging/python-imaging-CVE-2016-2533.patch
@@ -0,0 +1,38 @@
+python-imaging: CVE-2016-2533
+
+the patch comes from:
+https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-2533
+https://github.com/python-pillow/Pillow/commit/ae453aa18b66af54e7ff716f4ccb33adca60afd4#diff-8ff6909c159597e22288ad818938fd6b
+
+PCD decoder overruns the shuffle buffer, Fixes #568
+
+Signed-off-by: Li Wang <li.wang@windriver.com>
+---
+ libImaging/PcdDecode.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/libImaging/PcdDecode.c b/libImaging/PcdDecode.c
+index b6898e3..c02d005 100644
+--- a/libImaging/PcdDecode.c
++++ b/libImaging/PcdDecode.c
+@@ -47,7 +47,7 @@ ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes)
+ out[0] = ptr[x];
+ out[1] = ptr[(x+4*state->xsize)/2];
+ out[2] = ptr[(x+5*state->xsize)/2];
+- out += 4;
++ out += 3;
+ }
+
+ state->shuffle((UINT8*) im->image[state->y],
+@@ -62,7 +62,7 @@ ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes)
+ out[0] = ptr[x+state->xsize];
+ out[1] = ptr[(x+4*state->xsize)/2];
+ out[2] = ptr[(x+5*state->xsize)/2];
+- out += 4;
++ out += 3;
+ }
+
+ state->shuffle((UINT8*) im->image[state->y],
+--
+1.7.9.5
+
diff --git a/external/meta-python2/recipes-devtools/python/python-imaging/remove-host-libdir.patch b/external/meta-python2/recipes-devtools/python/python-imaging/remove-host-libdir.patch
new file mode 100644
index 00000000..028a51ad
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-imaging/remove-host-libdir.patch
@@ -0,0 +1,25 @@
+Avoid getting host sysroot paths in the library paths to fix issue like:
+
+| /home/andrei/work/yocto/build-rpi-master/tmp/sysroots/x86_64-linux/usr/lib/libz.so: file not recognized: File format not recognized
+
+Upstream-Status: Inappropriate [configuration]
+
+Signed-off-by: Andrei Gherzan <andrei@gherzan.ro>
+
+
+Index: Imaging-1.1.7/setup.py
+===================================================================
+--- Imaging-1.1.7.orig/setup.py
++++ Imaging-1.1.7/setup.py
+@@ -155,11 +155,6 @@ class pil_build_ext(build_ext):
+
+ # FIXME: check /opt/stuff directories here?
+
+- prefix = sysconfig.get_config_var("prefix")
+- if prefix:
+- add_directory(library_dirs, os.path.join(prefix, "lib"))
+- add_directory(include_dirs, os.path.join(prefix, "include"))
+-
+ #
+ # locate tkinter libraries
+
diff --git a/external/meta-python2/recipes-devtools/python/python-imaging_1.1.7.bb b/external/meta-python2/recipes-devtools/python/python-imaging_1.1.7.bb
new file mode 100644
index 00000000..60dd7d0a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-imaging_1.1.7.bb
@@ -0,0 +1,48 @@
+SUMMARY = "Python Imaging Library (PIL)"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://README;beginline=92;endline=120;md5=c4371af4579f1e489cf881c1443dd4ec"
+DEPENDS = "freetype jpeg tiff"
+SRCNAME = "Imaging"
+PR = "r5"
+
+SRC_URI = "http://effbot.org/downloads/Imaging-${PV}.tar.gz \
+ file://0001-python-imaging-setup.py-force-paths-for-zlib-freetyp.patch \
+ file://allow.to.disable.some.features.patch \
+ file://fix-freetype-includes.patch \
+ file://remove-host-libdir.patch \
+ file://python-imaging-CVE-2016-2533.patch \
+"
+
+SRC_URI[md5sum] = "fc14a54e1ce02a0225be8854bfba478e"
+SRC_URI[sha256sum] = "895bc7c2498c8e1f9b99938f1a40dc86b3f149741f105cf7c7bd2e0725405211"
+S = "${WORKDIR}/${SRCNAME}-${PV}"
+
+# There isn't enable/disable option, and lcms is in meta-oe, at least make it explicit when enabled
+# setup.py already has FIXME: add mechanism to explicitly *disable* the use of a library
+PACKAGECONFIG ??= ""
+PACKAGECONFIG[lcms] = ",,lcms"
+
+inherit distutils
+
+do_compile() {
+ export STAGING_LIBDIR=${STAGING_LIBDIR}
+ export STAGING_INCDIR=${STAGING_INCDIR}
+ export LCMS_ENABLED=${@bb.utils.contains('PACKAGECONFIG', 'lcms', 'True', 'False', d)}
+ distutils_do_compile
+}
+
+do_install() {
+ export STAGING_LIBDIR=${STAGING_LIBDIR}
+ export STAGING_INCDIR=${STAGING_INCDIR}
+ export LCMS_ENABLED=${@bb.utils.contains('PACKAGECONFIG', 'lcms', 'True', 'False', d)}
+ distutils_do_install
+ install -d ${D}${datadir}/doc/${BPN}/html/
+ install -m 0644 ${S}/README ${D}${datadir}/doc/${BPN}/
+ install -m 0644 ${S}/Docs/* ${D}${datadir}/doc/${BPN}/html/
+
+ # get rid of #!/usr/local/bin/python
+ sed -i -e 's:/usr/local/bin/:${bindir}/env :g' ${D}${bindir}/*
+}
+
+RDEPENDS_${PN} += "python-lang python-stringold"
diff --git a/external/meta-python2/recipes-devtools/python/python-importlib-metadata_0.23.bb b/external/meta-python2/recipes-devtools/python/python-importlib-metadata_0.23.bb
new file mode 100644
index 00000000..9a4e8ad2
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-importlib-metadata_0.23.bb
@@ -0,0 +1,27 @@
+SUMMARY = "Read metadata from Python packages"
+DESCRIPTION = "Read metadata from Python packages"
+HOMEPAGE = "https://pypi.org/project/importlib-metadata/"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e88ae122f3925d8bde8319060f2ddb8e"
+
+SRC_URI[md5sum] = "80d677d744995336c9c22d21a85ddeb8"
+SRC_URI[sha256sum] = "aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26"
+
+DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
+
+PYPI_PACKAGE = "importlib_metadata"
+
+inherit pypi setuptools
+
+S = "${WORKDIR}/importlib_metadata-${PV}"
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-zipp \
+ ${PYTHON_PN}-pathlib2 \
+ python-compression \
+ python-configparser \
+ python-contextlib2 \
+ python-pathlib2 \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-incremental_17.5.0.bb b/external/meta-python2/recipes-devtools/python/python-incremental_17.5.0.bb
new file mode 100644
index 00000000..c02c58a6
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-incremental_17.5.0.bb
@@ -0,0 +1,20 @@
+DESCRIPTION = "Incremental is a small library that versions your Python projects"
+HOMEPAGE = "https://github.com/twisted/incremental"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=6ca9b07f08e2c72d48c74d363d1e0e15"
+
+SRC_URI[md5sum] = "602746e0d438e075a5a9e0678140bba2"
+SRC_URI[sha256sum] = "7b751696aaf36eebfab537e458929e194460051ccad279c72b755a167eebd4b3"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-twisted \
+ ${PYTHON_PN}-click \
+"
+
+# -native is needed to build python[3]-twisted, however, we need to take steps to
+# prevent a circular dependency. The build apparently does not use the part of
+# python-incremental which uses python-twisted, so this hack is OK.
+RDEPENDS_${PYTHON_PN}-incremental-native_remove = "${PYTHON_PN}-twisted-native"
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-inflection_0.3.1.bb b/external/meta-python2/recipes-devtools/python/python-inflection_0.3.1.bb
new file mode 100644
index 00000000..64c07b21
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-inflection_0.3.1.bb
@@ -0,0 +1,17 @@
+SUMMARY = "A port of Ruby on Rails' inflection to Python."
+HOMEPAGE = "https://pypi.org/project/inflection"
+LICENSE = "MIT"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=de7833d9c2ce0052a4073928c76a13d7"
+
+SRC_URI[md5sum] = "7941165e9f148e0520023941c0886b40"
+SRC_URI[sha256sum] = "18ea7fb7a7d152853386523def08736aa8c32636b047ade55f7578c4edeb16ca"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-codecs \
+ ${PYTHON_PN}-pytest \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-intervals_1.10.0.bb b/external/meta-python2/recipes-devtools/python/python-intervals_1.10.0.bb
new file mode 100644
index 00000000..4e0de324
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-intervals_1.10.0.bb
@@ -0,0 +1,17 @@
+SUMMARY = "A Python library providing data structure and operations for intervals"
+DESCRIPTION = "This library provides data structure and operations for \
+intervals in Python 2.7+ and Python 3.4+."
+HOMEPAGE = "https://github.com/AlexandreDecan/python-intervals"
+SECTION = "devel/python"
+
+LICENSE = "LGPLv3"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=05f1e16a8e59ce3e9a979e881816c2ab"
+
+SRC_URI[md5sum] = "8955317ff4e42590c90ba6247b1caaed"
+SRC_URI[sha256sum] = "0d26746eaed0be78a61dd289bb7a10721b08770bb3e807614835f490d514f2a5"
+
+PYPI_PACKAGE := "python-intervals"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-ipaddress_1.0.23.bb b/external/meta-python2/recipes-devtools/python/python-ipaddress_1.0.23.bb
new file mode 100644
index 00000000..7897ed60
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-ipaddress_1.0.23.bb
@@ -0,0 +1,11 @@
+SUMMARY = "Python 3.3+'s ipaddress for Python 2.6, 2.7, 3.2."
+HOMEPAGE = "https://github.com/phihag/ipaddress"
+LICENSE = "Python-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=7f538584cc3407bf76042def7168548a"
+
+SRC_URI[md5sum] = "aaee67a8026782af1831148beb0d9060"
+SRC_URI[sha256sum] = "b7f8e0369580bb4a24d5ba1d7cc29660a4a6987763faf1d8a8046830e020e7e2"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-ipy_1.00.bb b/external/meta-python2/recipes-devtools/python/python-ipy_1.00.bb
new file mode 100644
index 00000000..7fdb519b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-ipy_1.00.bb
@@ -0,0 +1,19 @@
+SUMMARY = "IPy - class and tools for handling of IPv4 and IPv6 addresses and networks"
+DESCRIPTION = "IPy is a Python module for handling IPv4 and IPv6 Addresses and Networks \
+in a fashion similar to perl's Net::IP and friends. The IP class allows \
+a comfortable parsing and handling for most notations in use for IPv4 \
+and IPv6 Addresses and Networks."
+SECTION = "devel/python"
+HOMEPAGE = "https://github.com/autocracy/python-ipy"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://COPYING;md5=848d24919845901b4f48bae5f13252e6"
+
+SRC_URI[md5sum] = "1a90c68174234672241a7e60c7ea0fb9"
+SRC_URI[sha256sum] = "2f2bf658a858d43868d8a4352b3889cf78c66e2ce678b300dcf518c9149ba621"
+
+inherit pypi setuptools
+
+PYPI_PACKAGE = "IPy"
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-iso8601_0.1.12.bb b/external/meta-python2/recipes-devtools/python/python-iso8601_0.1.12.bb
new file mode 100644
index 00000000..daf9ff0b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-iso8601_0.1.12.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Simple module to parse ISO 8601 dates"
+HOMEPAGE = "http://pyiso8601.readthedocs.org/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b05625f2336fa024e8d57e65c6595844"
+
+SRC_URI[md5sum] = "4de940f691c5ea759fb254384c8ddcf6"
+SRC_URI[sha256sum] = "49c4b20e1f38aa5cf109ddcd39647ac419f928512c869dc01d5c7098eddede82"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-datetime \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-isodate_0.6.0.bb b/external/meta-python2/recipes-devtools/python/python-isodate_0.6.0.bb
new file mode 100644
index 00000000..aa92338d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-isodate_0.6.0.bb
@@ -0,0 +1,14 @@
+SUMMARY = "ISO 8601 date/time parser"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e910b35b0ef4e1f665b9a75d6afb7709"
+
+SRC_URI[md5sum] = "0e1203fce27ce65e2d01c5f21c4d428f"
+SRC_URI[sha256sum] = "2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-six \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-isort_4.3.21.bb b/external/meta-python2/recipes-devtools/python/python-isort_4.3.21.bb
new file mode 100644
index 00000000..6c9bebc3
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-isort_4.3.21.bb
@@ -0,0 +1,17 @@
+SUMMARY = "A Python utility / library to sort Python imports."
+HOMEPAGE = "https://pypi.python.org/pypi/isort"
+LICENSE = "MIT"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489"
+
+SRC_URI[md5sum] = "05d66f2eb7ce2c2d702e86bac24bf9e4"
+SRC_URI[sha256sum] = "54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-shell \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-itsdangerous_1.1.0.bb b/external/meta-python2/recipes-devtools/python/python-itsdangerous_1.1.0.bb
new file mode 100644
index 00000000..af0b1ffb
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-itsdangerous_1.1.0.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Various helpers to pass trusted data to untrusted environments and back."
+HOMEPAGE = "http://github.com/mitsuhiko/itsdangerous"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=370799bf709a1e4a6a369fa089ac73a6"
+
+SRC_URI[md5sum] = "9b7f5afa7f1e3acfb7786eeca3d99307"
+SRC_URI[sha256sum] = "321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"
+
+inherit pypi setuptools
+
+CLEANBROKEN = "1"
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-simplejson \
+ ${PYTHON_PN}-zlib \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-javaobj-py3_0.4.0.1.bb b/external/meta-python2/recipes-devtools/python/python-javaobj-py3_0.4.0.1.bb
new file mode 100644
index 00000000..97468d6c
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-javaobj-py3_0.4.0.1.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Module for serializing and de-serializing Java objects."
+DESCRIPTION = "python-javaobj is a python library that provides functions\
+ for reading and writing (writing is WIP currently) Java objects serialized\
+ or will be deserialized by ObjectOutputStream. This form of object\
+ representation is a standard data interchange format in Java world."
+HOMEPAGE = "https://github.com/tcalmant/python-javaobj"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://setup.py;beginline=15;endline=27;md5=af9ce26ac2de1b7436eb08c9308b4a1e"
+
+SRC_URI[md5sum] = "352fe0df9336b8699ad0799ef152da6b"
+SRC_URI[sha256sum] = "18c44cfaa214813784a823432b4ab9829c9626b2b00072011627b4008b0067cd"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-enum34 \
+ ${PYTHON_PN}-typing \
+ "
+
+RDEPENDS_${PN}_append_class-target = "\
+ ${PYTHON_PN}-lang \
+ ${PYTHON_PN}-logging \
+ "
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-jinja2_2.10.3.bb b/external/meta-python2/recipes-devtools/python/python-jinja2_2.10.3.bb
new file mode 100644
index 00000000..b2f6102c
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-jinja2_2.10.3.bb
@@ -0,0 +1,33 @@
+
+SUMMARY = "Python Jinja2: A small but fast and easy to use stand-alone template engine written in pure python."
+DESCRIPTION = "Python Jinja2: A small but fast and easy to use stand-alone template engine written in pure python."
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=5dc88300786f1c214c1e9827a5229462"
+
+SRC_URI[md5sum] = "7883559bc5cc3e2781d94b4be61cfdcd"
+SRC_URI[sha256sum] = "9fe95f19286cfefaa917656583d020be14e7859c6b0252588391e47db34527de"
+
+PYPI_PACKAGE = "Jinja2"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-crypt \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-lang \
+ ${PYTHON_PN}-markupsafe \
+ ${PYTHON_PN}-math \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-pickle \
+ ${PYTHON_PN}-pprint \
+ ${PYTHON_PN}-re \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-textutils \
+ ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-numbers \
+"
+
+CLEANBROKEN = "1"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-jsmin_2.2.2.bb b/external/meta-python2/recipes-devtools/python/python-jsmin_2.2.2.bb
new file mode 100644
index 00000000..d00d1e2a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-jsmin_2.2.2.bb
@@ -0,0 +1,11 @@
+DESCRIPTION = "JavaScript minifier."
+HOMEPAGE = "https://github.com/tikitu/jsmin/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3a3301ce2ad647e172f4a1016c67324d"
+
+inherit setuptools pypi
+SRC_URI[md5sum] = "00e7a3179a4591aab2ee707b3214e2fd"
+SRC_URI[sha256sum] = "b6df99b2cd1c75d9d342e4335b535789b8da9107ec748212706ef7bbe5c2553b"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-jsonpatch_1.24.bb b/external/meta-python2/recipes-devtools/python/python-jsonpatch_1.24.bb
new file mode 100644
index 00000000..8b280fa4
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-jsonpatch_1.24.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Appling JSON patches in Python 2.6+ and 3.x"
+HOMEPAGE = "https://github.com/stefankoegl/python-json-patch"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://COPYING;md5=32b15c843b7a329130f4e266a281ebb3"
+
+SRC_URI[md5sum] = "e86503f05fa192fa870d7004b8ce929a"
+SRC_URI[sha256sum] = "cbb72f8bf35260628aea6b508a107245f757d1ec839a19c34349985e2c05645a"
+
+inherit pypi setuptools
+
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-jsonpointer \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-re \
+ ${PYTHON_PN}-stringold \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-jsonpointer_2.0.bb b/external/meta-python2/recipes-devtools/python/python-jsonpointer_2.0.bb
new file mode 100644
index 00000000..0a365ffe
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-jsonpointer_2.0.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Resolve JSON Pointers in Python"
+HOMEPAGE = "https://github.com/stefankoegl/python-json-pointer"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=32b15c843b7a329130f4e266a281ebb3"
+
+SRC_URI[md5sum] = "741b98d0e693b08b5e44e0a9da5a7bb7"
+SRC_URI[sha256sum] = "c192ba86648e05fdae4f08a17ec25180a9aef5008d973407b581798a83975362"
+
+inherit pypi setuptools
+
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-re \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-jsonref_0.2.bb b/external/meta-python2/recipes-devtools/python/python-jsonref_0.2.bb
new file mode 100644
index 00000000..e45952f6
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-jsonref_0.2.bb
@@ -0,0 +1,18 @@
+SUMMARY = "jsonref is a library for automatic dereferencing of JSON Reference objects for Python"
+DESCRIPTION = "jsonref is a library for automatic dereferencing of JSON \
+Reference objects for Python (supporting Python 2.6+ and Python 3.3+).\
+\
+This library lets you use a data structure with JSON reference objects, as if \
+the references had been replaced with the referent data."
+HOMEPAGE = "https://github.com/gazpachoking/jsonref"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a34264f25338d41744dca1abfe4eb18f"
+
+SRC_URI[md5sum] = "42b518b9ccd6852d1d709749bc96cb70"
+SRC_URI[sha256sum] = "f3c45b121cf6257eafabdc3a8008763aed1cd7da06dbabc59a9e4d2a5e4e6697"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-jsonschema_3.2.0.bb b/external/meta-python2/recipes-devtools/python/python-jsonschema_3.2.0.bb
new file mode 100644
index 00000000..8074e694
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-jsonschema_3.2.0.bb
@@ -0,0 +1,59 @@
+
+SUMMARY = "An implementation of JSON Schema validation for Python"
+HOMEPAGE = "https://github.com/Julian/jsonschema"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://COPYING;md5=7a60a81c146ec25599a3e1dabb8610a8 \
+ file://json/LICENSE;md5=9d4de43111d33570c8fe49b4cb0e01af"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-jsonschema:"
+
+SRC_URI[md5sum] = "f1a0b5011f05a02a8dee1070cd10a26d"
+SRC_URI[sha256sum] = "c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"
+
+DEPENDS += "${PYTHON_PN}-vcversioner-native ${PYTHON_PN}-setuptools-scm-native"
+
+PACKAGECONFIG ??= "format"
+PACKAGECONFIG[format] = ",,,\
+ ${PYTHON_PN}-idna \
+ ${PYTHON_PN}-jsonpointer \
+ ${PYTHON_PN}-webcolors \
+ ${PYTHON_PN}-rfc3987 \
+ ${PYTHON_PN}-strict-rfc3339 \
+"
+PACKAGECONFIG[nongpl] = ",,,\
+ ${PYTHON_PN}-idna \
+ ${PYTHON_PN}-jsonpointer \
+ ${PYTHON_PN}-webcolors \
+ ${PYTHON_PN}-rfc3986-validator \
+ ${PYTHON_PN}-rfc3339-validator \
+"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-argparse \
+ ${PYTHON_PN}-attrs \
+ ${PYTHON_PN}-contextlib \
+ ${PYTHON_PN}-core \
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-functools32 \
+ ${PYTHON_PN}-importlib-metadata \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-lang \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-pkgutil \
+ ${PYTHON_PN}-pprint \
+ ${PYTHON_PN}-pyrsistent \
+ ${PYTHON_PN}-re \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-unittest \
+ ${PYTHON_PN}-setuptools-scm \
+ ${PYTHON_PN}-textutils \
+ ${PYTHON_PN}-zipp \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-lazy-object-proxy_1.4.3.bb b/external/meta-python2/recipes-devtools/python/python-lazy-object-proxy_1.4.3.bb
new file mode 100644
index 00000000..e32a1245
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-lazy-object-proxy_1.4.3.bb
@@ -0,0 +1,12 @@
+SUMMARY = "A fast and thorough lazy object proxy"
+HOMEPAGE = "https://python-lazy-object-proxy.readthedocs.io/"
+LICENSE = "BSD-2-Clause"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=9c5c2c74370826468065c5702b8a1fcf"
+
+SRC_URI[md5sum] = "5c64c06affcd2a7c6ddc848af4280cca"
+SRC_URI[sha256sum] = "f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"
+
+DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-ldap_3.2.0.bb b/external/meta-python2/recipes-devtools/python/python-ldap_3.2.0.bb
new file mode 100644
index 00000000..8e43deea
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-ldap_3.2.0.bb
@@ -0,0 +1,37 @@
+#
+# Copyright (C) 2012 Wind River Systems, Inc.
+#
+SUMMARY = "Provides a wrapper in Python to LDAP"
+DESCRIPTION = "This module provides access to the LDAP \
+(Lightweight Directory Access Protocol) through Python operations \
+instead of C API. The module mainly acts as a wrapper for the \
+OpenLDAP 2.x libraries. Errors will appear as exceptions."
+
+LICENSE = "PSF"
+HOMEPAGE = "http://www.python-ldap.org/"
+DEPENDS = "python openldap cyrus-sasl"
+
+PYPI_PACKAGE = "python-ldap"
+inherit pypi setuptools
+
+LIC_FILES_CHKSUM = "file://LICENCE;md5=36ce9d726d0321b73c1521704d07db1b"
+SRC_URI[md5sum] = "fe22522208dc9b06d16eb70f8553eaab"
+SRC_URI[sha256sum] = "7d1c4b15375a533564aad3d3deade789221e450052b21ebb9720fb822eccdb8e"
+
+do_configure_prepend() {
+ sed -i -e 's:^library_dirs =.*::' setup.cfg
+ sed -i -e 's:^include_dirs =.*:include_dirs = =/usr/include/sasl/:' setup.cfg
+}
+
+
+RDEPENDS_${PN} = " \
+ ${PYTHON_PN}-pprint \
+ ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-pyasn1 \
+ ${PYTHON_PN}-pyasn1-modules \
+"
+
+python() {
+ if 'networking-layer' not in d.getVar('BBFILE_COLLECTIONS').split():
+ raise bb.parse.SkipRecipe('Requires networking-layer to be present to provide cyrus-sasl.')
+}
diff --git a/external/meta-python2/recipes-devtools/python/python-license-expression_1.2.bb b/external/meta-python2/recipes-devtools/python/python-license-expression_1.2.bb
new file mode 100644
index 00000000..8caccd26
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-license-expression_1.2.bb
@@ -0,0 +1,20 @@
+SUMMARY = "Utility library to parse, compare, simplify and normalize license expressions"
+HOMEPAGE = "https://github.com/nexB/license-expression"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://apache-2.0.LICENSE;md5=e23fadd6ceef8c618fc1c65191d846fa"
+
+SRC_URI[md5sum] = "fd4cb295cc345be1071274cdbd81c969"
+SRC_URI[sha256sum] = "7960e1dfdf20d127e75ead931476f2b5c7556df05b117a73880b22ade17d1abc"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-booleanpy \
+ "
+
+RDEPENDS_${PN}_append_class-target = "\
+ ${PYTHON_PN}-logging \
+ "
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-linecache2_1.0.0.bb b/external/meta-python2/recipes-devtools/python/python-linecache2_1.0.0.bb
new file mode 100644
index 00000000..386da2da
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-linecache2_1.0.0.bb
@@ -0,0 +1,13 @@
+SUMMARY = "A backport of linecache to older supported Pythons"
+HOMEPAGE = "https://github.com/testing-cabal/linecache2"
+LICENSE = "Python-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=19;endline=19;md5=368ddc8588431c180ae7c33f4fb57519"
+
+DEPENDS = "${PYTHON_PN}-pbr-native"
+
+SRC_URI[md5sum] = "7b25d0289ec36bff1f9e63c4329ce65c"
+SRC_URI[sha256sum] = "4b26ff4e7110db76eeb6f5a7b64a82623839d595c2038eeda662f2a2db78e97c"
+
+inherit pypi setuptools
+
+CLEAN_BROKEN = "1"
diff --git a/external/meta-python2/recipes-devtools/python/python-lockfile_0.12.2.bb b/external/meta-python2/recipes-devtools/python/python-lockfile_0.12.2.bb
new file mode 100644
index 00000000..20ea0180
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-lockfile_0.12.2.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "Platform-independent file locking module"
+HOMEPAGE = "http://launchpad.net/pylockfile"
+SECTION = "devel/python"
+
+RDEPENDS_${PN} = "python-threading"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=2340dffbbfea534b58f1349984eeef72"
+
+inherit pypi setuptools
+
+SRC_URI[md5sum] = "a6a1a82957a23afdf44cfdd039b65ff9"
+SRC_URI[sha256sum] = "6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"
+
+# Satisfy setup.py 'setup_requires'
+DEPENDS += " \
+ python-pbr-native \
+ "
+
diff --git a/external/meta-python2/recipes-devtools/python/python-lrparsing_1.0.16.bb b/external/meta-python2/recipes-devtools/python/python-lrparsing_1.0.16.bb
new file mode 100644
index 00000000..ad2a7cef
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-lrparsing_1.0.16.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Python LR parsing library"
+HOMEPAGE = "http://lrparsing.sourceforge.net/"
+BUGTRACKER = "https://sourceforge.net/p/lrparsing/tickets/"
+SECTION = "devel/python"
+LICENSE = "AGPL-3.0"
+LIC_FILES_CHKSUM = "file://agpl-3.0.txt;md5=73f1eb20517c55bf9493b7dd6e480788"
+
+SRC_URI = "${SOURCEFORGE_MIRROR}/lrparsing/lrparsing-${PV}.tar.gz"
+SRC_URI[md5sum] = "34357d69bce87654d792cd8f02d148b2"
+SRC_URI[sha256sum] = "b45afda44001dc5ba632934f74c043d40cce653f1a7526cfbcb68f6be055b8d7"
+
+S = "${WORKDIR}/lrparsing-${PV}"
+
+UPSTREAM_CHECK_URI = "https://sourceforge.net/projects/lrparsing/files/"
+UPSTREAM_CHECK_REGEX = "lrparsing-(?P<pver>\d+(\.\d+)+)"
+
+inherit setuptools
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-lxml_4.4.2.bb b/external/meta-python2/recipes-devtools/python/python-lxml_4.4.2.bb
new file mode 100644
index 00000000..51ba4b83
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-lxml_4.4.2.bb
@@ -0,0 +1,52 @@
+SUMMARY = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API."
+DESCRIPTION = "lxml is a Pythonic, mature binding for the libxml2 and \
+libxslt libraries. It provides safe and convenient access to these \
+libraries using the ElementTree API. It extends the ElementTree API \
+significantly to offer support for XPath, RelaxNG, XML Schema, XSLT, \
+C14N and much more."
+HOMEPAGE = "http://codespeak.net/lxml"
+SECTION = "devel/python"
+LICENSE = "BSD & GPLv2 & MIT & PSF"
+LIC_FILES_CHKSUM = "file://LICENSES.txt;md5=e4c045ebad958ead4b48008f70838403 \
+ file://doc/licenses/elementtree.txt;md5=eb34d036a6e3d56314ee49a6852ac891 \
+ file://doc/licenses/BSD.txt;md5=700a1fc17f4797d4f2d34970c8ee694b \
+ file://doc/licenses/GPL.txt;md5=94d55d512a9ba36caa9b7df079bae19f \
+ file://src/lxml/isoschematron/resources/rng/iso-schematron.rng;beginline=2;endline=7;md5=fc85684a8dd5fa272c086bceb0d99e10 \
+ file://src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_message.xsl;beginline=2;endline=24;md5=cc86b7b2bbc678e13f58ea403eb9929b \
+ file://src/lxml/isoschematron/resources/xsl/RNG2Schtrn.xsl;beginline=2;endline=7;md5=5b03236d293dc3784205542b409d2f53 \
+ "
+
+SRC_URI[md5sum] = "235c1a22d97a174144e76b66ce62ae46"
+SRC_URI[sha256sum] = "eff69ddbf3ad86375c344339371168640951c302450c5d3e9936e98d6459db06"
+
+DEPENDS += "libxml2 libxslt"
+
+inherit pypi setuptools
+
+# add to the defaults which are set in the setuptools bbclass
+#
+DISTUTILS_BUILD_ARGS += " \
+ --with-xslt-config='pkg-config libxslt' \
+ --with-xml2-config='pkg-config libxml-2.0' \
+"
+
+DISTUTILS_INSTALL_ARGS += " \
+ --with-xslt-config='pkg-config libxslt' \
+ --with-xml2-config='pkg-config libxml-2.0' \
+"
+
+# {standard input}: Assembler messages:
+# {standard input}:1488805: Error: branch out of range
+DEBUG_OPTIMIZATION_remove_mips = " -Og"
+DEBUG_OPTIMIZATION_append_mips = " -O"
+BUILD_OPTIMIZATION_remove_mips = " -Og"
+BUILD_OPTIMIZATION_append_mips = " -O"
+
+DEBUG_OPTIMIZATION_remove_mipsel = " -Og"
+DEBUG_OPTIMIZATION_append_mipsel = " -O"
+BUILD_OPTIMIZATION_remove_mipsel = " -Og"
+BUILD_OPTIMIZATION_append_mipsel = " -O"
+
+RDEPENDS_${PN} += "libxml2 libxslt ${PYTHON_PN}-compression"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch b/external/meta-python2/recipes-devtools/python/python-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch
new file mode 100644
index 00000000..b339d93f
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch
@@ -0,0 +1,35 @@
+From dfb83a41aaeae326e9b6f02b233af375bc7b8815 Mon Sep 17 00:00:00 2001
+From: Koen Kooi <koen@dominion.thruhere.net>
+Date: Fri, 29 Mar 2013 15:17:17 +0100
+Subject: [PATCH] setup.py: link in sysroot, not in host directories
+
+Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
+
+Upstream-status: Unknown
+---
+ setup.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+Index: M2Crypto-0.30.1/setup.py
+===================================================================
+--- M2Crypto-0.30.1.orig/setup.py
++++ M2Crypto-0.30.1/setup.py
+@@ -130,6 +130,7 @@ class _M2CryptoBuildExt(build_ext.build_
+ self.set_undefined_options('build', ('bundledlls', 'bundledlls'))
+
+ self.libraries = ['ssl', 'crypto']
++ self.openssl = os.environ.get( "STAGING_DIR" )
+ if sys.platform == 'win32':
+ self.libraries = ['ssleay32', 'libeay32']
+ if self.openssl and openssl_version(self.openssl, 0x10100000, True):
+@@ -150,8 +151,8 @@ class _M2CryptoBuildExt(build_ext.build_
+
+ if self.openssl is not None:
+ log.debug('self.openssl = %s', self.openssl)
+- openssl_library_dir = os.path.join(self.openssl, 'lib')
+- openssl_include_dir = os.path.join(self.openssl, 'include')
++ openssl_library_dir = os.environ.get( "STAGING_LIBDIR" )
++ openssl_include_dir = os.environ.get( "STAGING_INCDIR" )
+
+ self.library_dirs.append(openssl_library_dir)
+ self.include_dirs.append(openssl_include_dir)
diff --git a/external/meta-python2/recipes-devtools/python/python-m2crypto/cross-compile-platform.patch b/external/meta-python2/recipes-devtools/python/python-m2crypto/cross-compile-platform.patch
new file mode 100644
index 00000000..4b64f461
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-m2crypto/cross-compile-platform.patch
@@ -0,0 +1,33 @@
+Do not compute platform, this does not work in cross compile environment
+since it pokes at the system for getting architecture values
+
+Upstream-Status: Inappropriate
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+
+Index: M2Crypto-0.30.1/setup.py
+===================================================================
+--- M2Crypto-0.30.1.orig/setup.py
++++ M2Crypto-0.30.1/setup.py
+@@ -160,22 +160,6 @@ class _M2CryptoBuildExt(build_ext.build_
+ log.debug('self.include_dirs = %s', self.include_dirs)
+ log.debug('self.library_dirs = %s', self.library_dirs)
+
+- if platform.system() == "Linux":
+- # For RedHat-based distros, the '-D__{arch}__' option for
+- # Swig needs to be normalized, particularly on i386.
+- mach = platform.machine().lower()
+- if mach in ('i386', 'i486', 'i586', 'i686'):
+- arch = '__i386__'
+- elif mach in ('ppc64', 'powerpc64', 'ppc64le', 'ppc64el'):
+- arch = '__powerpc64__'
+- elif mach in ('ppc', 'powerpc'):
+- arch = '__powerpc__'
+- else:
+- arch = '__%s__' % mach
+- self.swig_opts.append('-D%s' % arch)
+- if mach in ('ppc64le', 'ppc64el'):
+- self.swig_opts.append('-D_CALL_ELF=2')
+-
+ self.swig_opts.extend(['-I%s' % i for i in self.include_dirs])
+
+ # Some Linux distributor has added the following line in
diff --git a/external/meta-python2/recipes-devtools/python/python-m2crypto/m2crypto-0.26.4-gcc_macros.patch b/external/meta-python2/recipes-devtools/python/python-m2crypto/m2crypto-0.26.4-gcc_macros.patch
new file mode 100644
index 00000000..7f6dd29f
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-m2crypto/m2crypto-0.26.4-gcc_macros.patch
@@ -0,0 +1,35 @@
+Imported from Fedora
+
+Index: M2Crypto-0.30.1/SWIG/_m2crypto.i
+===================================================================
+--- M2Crypto-0.30.1.orig/SWIG/_m2crypto.i
++++ M2Crypto-0.30.1/SWIG/_m2crypto.i
+@@ -8,6 +8,11 @@
+ *
+ */
+
++%import "gcc_macros.h"
++
++%ignore WCHAR_MAX;
++%ignore WCHAR_MIN;
++
+ %module(threads=1) m2crypto
+ /* We really don't need threadblock (PyGILState_Ensure() etc.) anywhere.
+ Disable threadallow as well, only enable it for operations likely to
+@@ -15,11 +20,6 @@
+ %nothreadblock;
+ %nothreadallow;
+
+-#if SWIG_VERSION >= 0x030000
+-#define __WCHAR_MAX__ __WCHAR_MAX
+-#define __WCHAR_MIN__ __WCHAR_MIN
+-#endif
+-
+ %{
+ #ifdef _WIN32
+ #define _WINSOCKAPI_
+@@ -95,4 +95,3 @@ static PyObject *x509_store_verify_cb_fu
+ %constant int encrypt = 1;
+ %constant int decrypt = 0;
+ #endif
+-
diff --git a/external/meta-python2/recipes-devtools/python/python-m2crypto_0.30.1.bb b/external/meta-python2/recipes-devtools/python/python-m2crypto_0.30.1.bb
new file mode 100644
index 00000000..968dd720
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-m2crypto_0.30.1.bb
@@ -0,0 +1,64 @@
+SUMMARY = "A Python crypto and SSL toolkit"
+HOMEPAGE = "https://gitlab.com/m2crypto/m2crypto"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENCE;md5=b0e1f0b7d0ce8a62c18b1287b991800e"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-m2crypto:"
+
+SRC_URI += "file://0001-setup.py-link-in-sysroot-not-in-host-directories.patch \
+ file://cross-compile-platform.patch \
+ file://m2crypto-0.26.4-gcc_macros.patch \
+ "
+SRC_URI[md5sum] = "7fce3cbf85eb84a669682892b935746b"
+SRC_URI[sha256sum] = "a1b2751cdadc6afac3df8a5799676b7b7c67a6ad144bb62d38563062e7cd3fc6"
+
+DEPENDS += "openssl swig-native"
+
+PYPI_PACKAGE = "M2Crypto"
+
+inherit pypi siteinfo setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-distutils \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-netserver \
+ ${PYTHON_PN}-smtpd \
+ ${PYTHON_PN}-typing \
+ ${PYTHON_PN}-xmlrpc \
+ "
+
+DISTUTILS_BUILD_ARGS += "build_ext --openssl=${STAGING_EXECPREFIXDIR} -I${STAGING_INCDIR}"
+DISTUTILS_INSTALL_ARGS += "build_ext --openssl=${STAGING_EXECPREFIXDIR}"
+
+SWIG_FEATURES_x86 = "-D__i386__"
+SWIG_FEATURES_x32 = "-D__ILP32__"
+SWIG_FEATURES ?= "-D__${HOST_ARCH}__"
+export SWIG_FEATURES
+
+# Get around a problem with swig, but only if the
+# multilib header file exists.
+#
+do_configure_prepend() {
+ ${CPP} -dM - < /dev/null | grep -v '__\(STDC\|REGISTER_PREFIX\|GNUC\|STDC_HOSTED\)__' \
+ | sed 's/^\(#define \([^ ]*\) .*\)$/#undef \2\n\1/' > ${S}/SWIG/gcc_macros.h
+
+ if [ "${SITEINFO_BITS}" = "64" ];then
+ bit="64"
+ else
+ bit="32"
+ fi
+
+ if [ -e ${STAGING_INCDIR}/openssl/opensslconf-${bit}.h ] ;then
+ for i in SWIG/_ec.i SWIG/_evp.i; do
+ sed -i -e "s/opensslconf.*\./opensslconf-${bit}\./" "${S}/$i"
+ done
+ elif [ -e ${STAGING_INCDIR}/openssl/opensslconf-n${bit}.h ] ;then
+ for i in SWIG/_ec.i SWIG/_evp.i; do
+ sed -i -e "s/opensslconf.*\./opensslconf-n${bit}\./" "${S}/$i"
+ done
+ fi
+}
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-mako_1.1.0.bb b/external/meta-python2/recipes-devtools/python/python-mako_1.1.0.bb
new file mode 100644
index 00000000..f7e6332a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-mako_1.1.0.bb
@@ -0,0 +1,22 @@
+SUMMARY = "A super-fast templating language that borrows the best ideas from the existing templating languages"
+HOMEPAGE = "http://www.makotemplates.org/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=df7e6c7c82990acf0228a55e00d29bc9"
+
+SRC_URI[md5sum] = "6c3f2da0b74af529a4c4a537d0848bf2"
+SRC_URI[sha256sum] = "a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b"
+
+PYPI_PACKAGE = "Mako"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = " \
+ ${PYTHON_PN}-html \
+ ${PYTHON_PN}-misc \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-threading \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-markupsafe_1.1.1.bb b/external/meta-python2/recipes-devtools/python/python-markupsafe_1.1.1.bb
new file mode 100644
index 00000000..44e72dc1
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-markupsafe_1.1.1.bb
@@ -0,0 +1,20 @@
+SUMMARY = "Implements a XML/HTML/XHTML Markup safe string for Python"
+DESCRIPTION = "MarkupSafe implements a text object that escapes characters so \
+it is safe to use in HTML and XML. Characters that have special meanings are \
+replaced so that they display as the actual characters. This mitigates \
+injection attacks, meaning untrusted user input can safely be displayed on a \
+page."
+HOMEPAGE = "https://palletsprojects.com/p/markupsafe/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75"
+
+SRC_URI[md5sum] = "43fd756864fe42063068e092e220c57b"
+SRC_URI[sha256sum] = "29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"
+
+PYPI_PACKAGE = "MarkupSafe"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "${PYTHON_PN}-re ${PYTHON_PN}-stringold"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-matplotlib/fix_setupext.patch b/external/meta-python2/recipes-devtools/python/python-matplotlib/fix_setupext.patch
new file mode 100644
index 00000000..21b9094a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-matplotlib/fix_setupext.patch
@@ -0,0 +1,110 @@
+This fixes the numpy import problem in setupext.py using a hard-coded path.
+
+Index: matplotlib-2.0.2/setupext.py
+===================================================================
+--- matplotlib-2.0.2.orig/setupext.py
++++ matplotlib-2.0.2/setupext.py
+@@ -148,6 +148,7 @@ def has_include_file(include_dirs, filen
+ Returns `True` if `filename` can be found in one of the
+ directories in `include_dirs`.
+ """
++ return True
+ if sys.platform == 'win32':
+ include_dirs += os.environ.get('INCLUDE', '.').split(';')
+ for dir in include_dirs:
+@@ -172,7 +173,7 @@ def get_base_dirs():
+ Returns a list of standard base directories on this platform.
+ """
+ if options['basedirlist']:
+- return options['basedirlist']
++ return [os.environ['STAGING_LIBDIR']]
+
+ basedir_map = {
+ 'win32': ['win32_static', ],
+@@ -260,14 +261,6 @@ def make_extension(name, files, *args, *
+ `distutils.core.Extension` constructor.
+ """
+ ext = DelayedExtension(name, files, *args, **kwargs)
+- for dir in get_base_dirs():
+- include_dir = os.path.join(dir, 'include')
+- if os.path.exists(include_dir):
+- ext.include_dirs.append(include_dir)
+- for lib in ('lib', 'lib64'):
+- lib_dir = os.path.join(dir, lib)
+- if os.path.exists(lib_dir):
+- ext.library_dirs.append(lib_dir)
+ ext.include_dirs.append('.')
+
+ return ext
+@@ -314,6 +307,7 @@ class PkgConfig(object):
+ " matplotlib may not be able to find some of its dependencies")
+
+ def set_pkgconfig_path(self):
++ return
+ pkgconfig_path = sysconfig.get_config_var('LIBDIR')
+ if pkgconfig_path is None:
+ return
+@@ -875,14 +869,14 @@ class Numpy(SetupPackage):
+ reload(numpy)
+
+ ext = Extension('test', [])
+- ext.include_dirs.append(numpy.get_include())
++ ext.include_dirs.append(os.path.join(os.environ['STAGING_LIBDIR'], 'python2.7/site-packages/numpy/core/include/'))
+ if not has_include_file(
+ ext.include_dirs, os.path.join("numpy", "arrayobject.h")):
+ warnings.warn(
+ "The C headers for numpy could not be found. "
+ "You may need to install the development package")
+
+- return [numpy.get_include()]
++ return [os.path.join(os.environ['STAGING_LIBDIR'], 'python2.7/site-packages/numpy/core/include/')]
+
+ def check(self):
+ min_version = extract_versions()['__version__numpy__']
+Index: matplotlib-2.0.2/setup.py
+===================================================================
+--- matplotlib-2.0.2.orig/setup.py
++++ matplotlib-2.0.2/setup.py
+@@ -66,28 +66,6 @@ mpl_packages = [
+ setupext.Python(),
+ setupext.Platform(),
+ 'Required dependencies and extensions',
+- setupext.Numpy(),
+- setupext.Six(),
+- setupext.Dateutil(),
+- setupext.FuncTools32(),
+- setupext.Subprocess32(),
+- setupext.Pytz(),
+- setupext.Cycler(),
+- setupext.Tornado(),
+- setupext.Pyparsing(),
+- setupext.LibAgg(),
+- setupext.FreeType(),
+- setupext.FT2Font(),
+- setupext.Png(),
+- setupext.Qhull(),
+- setupext.Image(),
+- setupext.TTConv(),
+- setupext.Path(),
+- setupext.ContourLegacy(),
+- setupext.Contour(),
+- setupext.Delaunay(),
+- setupext.QhullWrap(),
+- setupext.Tri(),
+ 'Optional subpackages',
+ setupext.SampleData(),
+ setupext.Toolkits(),
+@@ -100,13 +78,8 @@ mpl_packages = [
+ setupext.BackendMacOSX(),
+ setupext.BackendQt5(),
+ setupext.BackendQt4(),
+- setupext.BackendGtk3Agg(),
+ setupext.BackendGtk3Cairo(),
+- setupext.BackendGtkAgg(),
+- setupext.BackendTkAgg(),
+- setupext.BackendWxAgg(),
+ setupext.BackendGtk(),
+- setupext.BackendAgg(),
+ setupext.BackendCairo(),
+ setupext.Windowing(),
+ 'Optional LaTeX dependencies',
diff --git a/external/meta-python2/recipes-devtools/python/python-mccabe/0001-python-mccabe-remove-unnecessary-setup_requires-pyte.patch b/external/meta-python2/recipes-devtools/python/python-mccabe/0001-python-mccabe-remove-unnecessary-setup_requires-pyte.patch
new file mode 100644
index 00000000..941bed3d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-mccabe/0001-python-mccabe-remove-unnecessary-setup_requires-pyte.patch
@@ -0,0 +1,33 @@
+From 3484bdfa7adbaebcf8bb8e7d4820f64b12717932 Mon Sep 17 00:00:00 2001
+From: Mingli Yu <mingli.yu@windriver.com>
+Date: Fri, 29 Jul 2016 15:37:18 +0800
+Subject: [PATCH] python-mccabe: remove unnecessary setup_requires
+ pytest-runner
+
+* Remove setup_requires pytest-runner as the
+ setup_requires pytest-runner actually is not
+ used for pytest which only in do_compile phase
+ via setup.py build
+
+Upstream-Status: Pending
+
+Signed-off-by: Mingli Yu <mingli.yu@windriver.com>
+---
+ setup.py | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index e59903d..bf2aaba 100644
+--- a/setup.py
++++ b/setup.py
+@@ -33,7 +33,6 @@ setup(
+ license='Expat license',
+ py_modules=['mccabe'],
+ zip_safe=False,
+- setup_requires=['pytest-runner'],
+ tests_require=['pytest'],
+ entry_points={
+ 'flake8.extension': [
+--
+2.8.1
+
diff --git a/external/meta-python2/recipes-devtools/python/python-mccabe_0.4.0.bb b/external/meta-python2/recipes-devtools/python/python-mccabe_0.4.0.bb
new file mode 100644
index 00000000..6b63cd78
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-mccabe_0.4.0.bb
@@ -0,0 +1,20 @@
+SUMMARY = "McCabe checker, plugin for flake8"
+HOMEPAGE = "https://github.com/dreamhost/cliff"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://README.rst;md5=f8b50fba1711ecac6bcdb6324f85a66d"
+
+SRC_URI += " \
+ file://0001-python-mccabe-remove-unnecessary-setup_requires-pyte.patch \
+"
+
+SRC_URI[md5sum] = "8c425db05f310adcd4bb174b991f26f5"
+SRC_URI[sha256sum] = "9a2b12ebd876e77c72e41ebf401cc2e7c5b566649d50105ca49822688642207b"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ python-prettytable \
+ python-cmd2 \
+ python-pyparsing"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-mock_3.0.5.bb b/external/meta-python2/recipes-devtools/python/python-mock_3.0.5.bb
new file mode 100644
index 00000000..db710664
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-mock_3.0.5.bb
@@ -0,0 +1,22 @@
+SUMMARY = "A Python Mocking and Patching Library for Testing"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=de9dfbf780446b18aab11f00baaf5b7e"
+
+SRC_URI[md5sum] = "d834a46d9a129be3e76fdcc99751e82c"
+SRC_URI[sha256sum] = "83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3"
+
+inherit pypi setuptools
+
+DEPENDS += " \
+ python-pbr-native"
+
+RDEPENDS_${PN} += " \
+ python-prettytable \
+ python-cmd2 \
+ python-pyparsing \
+ python-mccabe \
+ python-pep8 \
+ python-pyflakes \
+ python-pbr \
+ python-funcsigs \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-monotonic_1.5.bb b/external/meta-python2/recipes-devtools/python/python-monotonic_1.5.bb
new file mode 100644
index 00000000..01e7b1ca
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-monotonic_1.5.bb
@@ -0,0 +1,10 @@
+SUMMARY = "An implementation of time.monotonic() for Python 2.0 through 3.2"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314"
+
+SRC_URI[md5sum] = "9f81cb0e5966479754453dea2b6822f4"
+SRC_URI[sha256sum] = "23953d55076df038541e648a53676fb24980f7a1be290cdda21300b3bc21dfb0"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "${PYTHON_PN}-ctypes ${PYTHON_PN}-io ${PYTHON_PN}-re ${PYTHON_PN}-threading"
diff --git a/external/meta-python2/recipes-devtools/python/python-more-itertools_5.0.0.bb b/external/meta-python2/recipes-devtools/python/python-more-itertools_5.0.0.bb
new file mode 100644
index 00000000..e381e75c
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-more-itertools_5.0.0.bb
@@ -0,0 +1,17 @@
+SUMMARY = "More routines for operating on iterables, beyond itertools"
+DESCRIPTION = "Python’s itertools library is a gem - you can compose elegant \
+solutions for a variety of problems with the functions it provides. In \
+more-itertools we collect additional building blocks, recipes, and routines \
+for working with Python iterables."
+HOMEPAGE = "https://github.com/erikrose/more-itertools"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3396ea30f9d21389d7857719816f83b5"
+
+SRC_URI[md5sum] = "f2ea58aa336ce6c13b7b225b3bbe305d"
+SRC_URI[sha256sum] = "38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4"
+
+inherit pypi setuptools
+
+PE = "1"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-msgpack_0.6.2.bb b/external/meta-python2/recipes-devtools/python/python-msgpack_0.6.2.bb
new file mode 100644
index 00000000..b83bb5c0
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-msgpack_0.6.2.bb
@@ -0,0 +1,15 @@
+SUMMARY = "MessagePack (de)serializer"
+HOMEPAGE = "https://msgpack.org/"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://COPYING;md5=cd9523181d9d4fbf7ffca52eaa2a5751"
+
+SRC_URI[md5sum] = "ba46fdee995565f40e332bd7eea882f1"
+SRC_URI[sha256sum] = "ea3c2f859346fcd55fc46e96885301d9c2f7a36d453f5d8f2967840efa1e1830"
+
+PYPI_PACKAGE = "msgpack"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target += "\
+ ${PYTHON_PN}-io \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-native/0001-python-native-fix-one-do_populate_sysroot-warning.patch b/external/meta-python2/recipes-devtools/python/python-native/0001-python-native-fix-one-do_populate_sysroot-warning.patch
new file mode 100644
index 00000000..707ee596
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-native/0001-python-native-fix-one-do_populate_sysroot-warning.patch
@@ -0,0 +1,40 @@
+From 6cbb7529cf7ff0da3ca649fb3486facd9620d625 Mon Sep 17 00:00:00 2001
+From: Changqing Li <changqing.li@windriver.com>
+Date: Thu, 25 Oct 2018 07:32:14 +0000
+Subject: [PATCH] python-native: fix one do_populate_sysroot warning
+
+Fix below warning:
+WARNING: Skipping RPATH /usr/lib64 as is a standard search path for
+work/x86_64-linux/python-native/2.7.15-r1.1/recipe-sysroot-native/
+usr/lib/python2.7/lib-dynload/_bsddb.so
+
+setup.py will check db.h under include_dirs, for native build,
+/usr/lib64 will be insert to postion 0 of include_dirs, so
+it's priority is higher then our sysroot, cause db.h sysroot
+is ignored, and rpath set to /usr/lib64. and this cause warning
+when do_populate_sysroot. use append to fix it.
+
+Upstream-Status: Inappropriate [oe-specific]
+
+Signed-off-by: Changqing Li <changqing.li@windriver.com>
+
+---
+ setup.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index a2c8127..22f9e23 100644
+--- a/setup.py
++++ b/setup.py
+@@ -47,7 +47,7 @@ def add_dir_to_list(dirlist, dir):
+ else:
+ dir_exists = os.path.isdir(dir)
+ if dir_exists:
+- dirlist.insert(0, dir)
++ dirlist.append(dir)
+
+ MACOS_SDK_ROOT = None
+
+--
+2.17.1
+
diff --git a/external/meta-python2/recipes-devtools/python/python-native/10-distutils-fix-swig-parameter.patch b/external/meta-python2/recipes-devtools/python/python-native/10-distutils-fix-swig-parameter.patch
new file mode 100644
index 00000000..a39247ce
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-native/10-distutils-fix-swig-parameter.patch
@@ -0,0 +1,18 @@
+Upstream-Status: Pending
+
+# Some versions of SWIG do not use the extension parameter.
+# Make it optional.
+# Signed-Off: Michael 'Mickey' Lauer <mickey@vanille-media.de>
+Index: Python-2.6.1/Lib/distutils/command/build_ext.py
+===================================================================
+--- Python-2.6.1.orig/Lib/distutils/command/build_ext.py
++++ Python-2.6.1/Lib/distutils/command/build_ext.py
+@@ -566,7 +566,7 @@ class build_ext (Command):
+ target_lang=language)
+
+
+- def swig_sources (self, sources, extension):
++ def swig_sources (self, sources, extension=None):
+
+ """Walk the list of source files in 'sources', looking for SWIG
+ interface (.i) files. Run SWIG on all that are found, and
diff --git a/external/meta-python2/recipes-devtools/python/python-native/11-distutils-never-modify-shebang-line.patch b/external/meta-python2/recipes-devtools/python/python-native/11-distutils-never-modify-shebang-line.patch
new file mode 100644
index 00000000..c92469b9
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-native/11-distutils-never-modify-shebang-line.patch
@@ -0,0 +1,20 @@
+Upstream-Status: Pending
+
+# Don't modify the she-bang line for a cross-build.
+# Otherwise it points to our hostpython (which we do not want)
+#
+# Signed-Off: Michael 'Mickey' Lauer <mickey@vanille-media.de>
+
+Index: Python-2.6.1/Lib/distutils/command/build_scripts.py
+===================================================================
+--- Python-2.6.1.orig/Lib/distutils/command/build_scripts.py
++++ Python-2.6.1/Lib/distutils/command/build_scripts.py
+@@ -87,7 +87,7 @@ class build_scripts (Command):
+ continue
+
+ match = first_line_re.match(first_line)
+- if match:
++ if False: #match:
+ adjust = 1
+ post_interp = match.group(1) or ''
+
diff --git a/external/meta-python2/recipes-devtools/python/python-native/multilib.patch b/external/meta-python2/recipes-devtools/python/python-native/multilib.patch
new file mode 100644
index 00000000..af0f173c
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-native/multilib.patch
@@ -0,0 +1,235 @@
+Rebased for Python 2.7.9
+
+Signed-off-by: Alejandro Hernandez <alejandro.hernandez@linux.intel.com>
+
+2011/09/29
+The python recipe building was failing because python-native
+could not handle sys.lib var. sys.lib var is defined in the
+multilib patch hence added this multilib.patch for python-native
+recipe.
+
+Upstream-Status: Inappropriate [oe-specific]
+
+Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
+
+Index: Python-2.7.14/Include/pythonrun.h
+===================================================================
+--- Python-2.7.14.orig/Include/pythonrun.h
++++ Python-2.7.14/Include/pythonrun.h
+@@ -108,6 +108,7 @@ PyAPI_FUNC(char *) Py_GetPath(void);
+ /* In their own files */
+ PyAPI_FUNC(const char *) Py_GetVersion(void);
+ PyAPI_FUNC(const char *) Py_GetPlatform(void);
++PyAPI_FUNC(const char *) Py_GetLib(void);
+ PyAPI_FUNC(const char *) Py_GetCopyright(void);
+ PyAPI_FUNC(const char *) Py_GetCompiler(void);
+ PyAPI_FUNC(const char *) Py_GetBuildInfo(void);
+Index: Python-2.7.14/Lib/distutils/command/install.py
+===================================================================
+--- Python-2.7.14.orig/Lib/distutils/command/install.py
++++ Python-2.7.14/Lib/distutils/command/install.py
+@@ -22,6 +22,8 @@ from site import USER_BASE
+ from site import USER_SITE
+
+
++libname = sys.lib
++
+ if sys.version < "2.2":
+ WINDOWS_SCHEME = {
+ 'purelib': '$base',
+@@ -42,7 +44,7 @@ else:
+ INSTALL_SCHEMES = {
+ 'unix_prefix': {
+ 'purelib': '$base/lib/python$py_version_short/site-packages',
+- 'platlib': '$platbase/lib/python$py_version_short/site-packages',
++ 'platlib': '$platbase/'+libname+'/python$py_version_short/site-packages',
+ 'headers': '$base/include/python$py_version_short/$dist_name',
+ 'scripts': '$base/bin',
+ 'data' : '$base',
+Index: Python-2.7.14/Lib/pydoc.py
+===================================================================
+--- Python-2.7.14.orig/Lib/pydoc.py
++++ Python-2.7.14/Lib/pydoc.py
+@@ -375,7 +375,7 @@ class Doc:
+ docmodule = docclass = docroutine = docother = docproperty = docdata = fail
+
+ def getdocloc(self, object,
+- basedir=os.path.join(sys.exec_prefix, "lib",
++ basedir=os.path.join(sys.exec_prefix, "sys.lib",
+ "python"+sys.version[0:3])):
+ """Return the location of module docs or None"""
+
+Index: Python-2.7.14/Lib/site.py
+===================================================================
+--- Python-2.7.14.orig/Lib/site.py
++++ Python-2.7.14/Lib/site.py
+@@ -288,13 +288,19 @@ def getsitepackages():
+ if sys.platform in ('os2emx', 'riscos'):
+ sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
+ elif os.sep == '/':
+- sitepackages.append(os.path.join(prefix, "lib",
++ sitepackages.append(os.path.join(prefix, sys.lib,
+ "python" + sys.version[:3],
+ "site-packages"))
+- sitepackages.append(os.path.join(prefix, "lib", "site-python"))
++ if sys.lib != "lib":
++ sitepackages.append(os.path.join(prefix, "lib",
++ "python" + sys.version[:3],
++ "site-packages"))
++ sitepackages.append(os.path.join(prefix, sys.lib, "site-python"))
++ if sys.lib != "lib":
++ sitepackages.append(os.path.join(prefix, "lib", "site-python"))
+ else:
+ sitepackages.append(prefix)
+- sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
++ sitepackages.append(os.path.join(prefix, sys.lib, "site-packages"))
+ return sitepackages
+
+ def addsitepackages(known_paths):
+Index: Python-2.7.14/Lib/test/test_dl.py
+===================================================================
+--- Python-2.7.14.orig/Lib/test/test_dl.py
++++ Python-2.7.14/Lib/test/test_dl.py
+@@ -4,10 +4,11 @@
+ import unittest
+ from test.test_support import verbose, import_module
+ dl = import_module('dl', deprecated=True)
++import sys
+
+ sharedlibs = [
+- ('/usr/lib/libc.so', 'getpid'),
+- ('/lib/libc.so.6', 'getpid'),
++ ('/usr/'+sys.lib+'/libc.so', 'getpid'),
++ ('/'+sys.lib+'/libc.so.6', 'getpid'),
+ ('/usr/bin/cygwin1.dll', 'getpid'),
+ ('/usr/lib/libc.dylib', 'getpid'),
+ ]
+Index: Python-2.7.14/Lib/trace.py
+===================================================================
+--- Python-2.7.14.orig/Lib/trace.py
++++ Python-2.7.14/Lib/trace.py
+@@ -754,10 +754,10 @@ def main(argv=None):
+ # should I also call expanduser? (after all, could use $HOME)
+
+ s = s.replace("$prefix",
+- os.path.join(sys.prefix, "lib",
++ os.path.join(sys.prefix, sys.lib,
+ "python" + sys.version[:3]))
+ s = s.replace("$exec_prefix",
+- os.path.join(sys.exec_prefix, "lib",
++ os.path.join(sys.exec_prefix, sys.lib,
+ "python" + sys.version[:3]))
+ s = os.path.normpath(s)
+ ignore_dirs.append(s)
+Index: Python-2.7.14/Makefile.pre.in
+===================================================================
+--- Python-2.7.14.orig/Makefile.pre.in
++++ Python-2.7.14/Makefile.pre.in
+@@ -91,6 +91,7 @@ PY_CFLAGS= $(CFLAGS) $(CPPFLAGS) $(CFLAG
+
+ # Machine-dependent subdirectories
+ MACHDEP= @MACHDEP@
++LIB= @LIB@
+
+ # Multiarch directory (may be empty)
+ MULTIARCH= @MULTIARCH@
+@@ -110,7 +111,7 @@ LIBDIR= @libdir@
+ MANDIR= @mandir@
+ INCLUDEDIR= @includedir@
+ CONFINCLUDEDIR= $(exec_prefix)/include
+-SCRIPTDIR= $(prefix)/lib
++SCRIPTDIR= $(prefix)/@LIB@
+
+ # Detailed destination directories
+ BINLIBDEST= $(LIBDIR)/python$(VERSION)
+@@ -644,6 +645,7 @@ Modules/getpath.o: $(srcdir)/Modules/get
+ -DEXEC_PREFIX='"$(exec_prefix)"' \
+ -DVERSION='"$(VERSION)"' \
+ -DVPATH='"$(VPATH)"' \
++ -DLIB='"$(LIB)"' \
+ -o $@ $(srcdir)/Modules/getpath.c
+
+ Modules/python.o: $(srcdir)/Modules/python.c
+@@ -692,7 +694,7 @@ regen-ast:
+ Python/compile.o Python/symtable.o Python/ast.o: $(srcdir)/Include/graminit.h $(srcdir)/Include/Python-ast.h
+
+ Python/getplatform.o: $(srcdir)/Python/getplatform.c
+- $(CC) -c $(PY_CFLAGS) -DPLATFORM='"$(MACHDEP)"' -o $@ $(srcdir)/Python/getplatform.c
++ $(CC) -c $(PY_CFLAGS) -DPLATFORM='"$(MACHDEP)"' -DLIB='"$(LIB)"' -o $@ $(srcdir)/Python/getplatform.c
+
+ Python/importdl.o: $(srcdir)/Python/importdl.c
+ $(CC) -c $(PY_CFLAGS) -I$(DLINCLDIR) -o $@ $(srcdir)/Python/importdl.c
+Index: Python-2.7.14/Modules/getpath.c
+===================================================================
+--- Python-2.7.14.orig/Modules/getpath.c
++++ Python-2.7.14/Modules/getpath.c
+@@ -100,6 +100,13 @@
+ #error "PREFIX, EXEC_PREFIX, VERSION, and VPATH must be constant defined"
+ #endif
+
++#define LIB_PYTHON LIB "/python" VERSION
++
++#ifndef PYTHONPATH
++#define PYTHONPATH PREFIX "/" LIB_PYTHON ":" \
++ EXEC_PREFIX "/" LIB_PYTHON "/lib-dynload"
++#endif
++
+ #ifndef LANDMARK
+ #define LANDMARK "os.py"
+ #endif
+@@ -108,7 +115,7 @@ static char prefix[MAXPATHLEN+1];
+ static char exec_prefix[MAXPATHLEN+1];
+ static char progpath[MAXPATHLEN+1];
+ static char *module_search_path = NULL;
+-static char lib_python[] = "lib/python" VERSION;
++static char lib_python[] = LIB_PYTHON;
+
+ static void
+ reduce(char *dir)
+Index: Python-2.7.14/Python/getplatform.c
+===================================================================
+--- Python-2.7.14.orig/Python/getplatform.c
++++ Python-2.7.14/Python/getplatform.c
+@@ -10,3 +10,13 @@ Py_GetPlatform(void)
+ {
+ return PLATFORM;
+ }
++
++#ifndef LIB
++#define LIB "lib"
++#endif
++
++const char *
++Py_GetLib(void)
++{
++ return LIB;
++}
+Index: Python-2.7.14/Python/sysmodule.c
+===================================================================
+--- Python-2.7.14.orig/Python/sysmodule.c
++++ Python-2.7.14/Python/sysmodule.c
+@@ -1437,6 +1437,8 @@ _PySys_Init(void)
+ PyString_FromString(Py_GetCopyright()));
+ SET_SYS_FROM_STRING("platform",
+ PyString_FromString(Py_GetPlatform()));
++ SET_SYS_FROM_STRING("lib",
++ PyString_FromString(Py_GetLib()));
+ SET_SYS_FROM_STRING("executable",
+ PyString_FromString(Py_GetProgramFullPath()));
+ SET_SYS_FROM_STRING("prefix",
+Index: Python-2.7.14/configure.ac
+===================================================================
+--- Python-2.7.14.orig/configure.ac
++++ Python-2.7.14/configure.ac
+@@ -758,6 +758,11 @@ SunOS*)
+ ;;
+ esac
+
++AC_SUBST(LIB)
++AC_MSG_CHECKING(LIB)
++LIB=`basename ${libdir}`
++AC_MSG_RESULT($LIB)
++
+
+ AC_SUBST(LIBRARY)
+ AC_MSG_CHECKING(LIBRARY)
diff --git a/external/meta-python2/recipes-devtools/python/python-native/nohostlibs.patch b/external/meta-python2/recipes-devtools/python/python-native/nohostlibs.patch
new file mode 100644
index 00000000..078060b4
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-native/nohostlibs.patch
@@ -0,0 +1,54 @@
+Upstream-Status: Inappropriate [embedded specific]
+
+2014/12/15
+Rebased for python-2.7.9
+Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
+Signed-off-by: Alejandro Hernandez <alejandro.hernandez@linux.intel.com>
+
+Index: Python-2.7.9/setup.py
+===================================================================
+--- Python-2.7.9.orig/setup.py
++++ Python-2.7.9/setup.py
+@@ -439,9 +439,9 @@ class PyBuildExt(build_ext):
+
+ def detect_modules(self):
+ # Ensure that /usr/local is always used
+- if not cross_compiling:
+- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
+- add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
++ # if not cross_compiling:
++ # add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
++ # add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
+ if cross_compiling:
+ self.add_gcc_paths()
+ self.add_multiarch_paths()
+@@ -480,15 +480,15 @@ class PyBuildExt(build_ext):
+ for directory in reversed(options.dirs):
+ add_dir_to_list(dir_list, directory)
+
+- if os.path.normpath(sys.prefix) != '/usr' \
+- and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
++ #if os.path.normpath(sys.prefix) != '/usr' \
++ #and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
+ # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
+ # (PYTHONFRAMEWORK is set) to avoid # linking problems when
+ # building a framework with different architectures than
+ # the one that is currently installed (issue #7473)
+- add_dir_to_list(self.compiler.library_dirs,
++ add_dir_to_list(self.compiler.library_dirs,
+ sysconfig.get_config_var("LIBDIR"))
+- add_dir_to_list(self.compiler.include_dirs,
++ add_dir_to_list(self.compiler.include_dirs,
+ sysconfig.get_config_var("INCLUDEDIR"))
+
+ try:
+@@ -761,8 +761,7 @@ class PyBuildExt(build_ext):
+ pass # Issue 7384: Already linked against curses or tinfo.
+ elif curses_library:
+ readline_libs.append(curses_library)
+- elif self.compiler.find_library_file(lib_dirs +
+- ['/usr/lib/termcap'],
++ elif self.compiler.find_library_file(lib_dirs,
+ 'termcap'):
+ readline_libs.append('termcap')
+ exts.append( Extension('readline', ['readline.c'],
diff --git a/external/meta-python2/recipes-devtools/python/python-native/revert_use_of_sysconfigdata.patch b/external/meta-python2/recipes-devtools/python/python-native/revert_use_of_sysconfigdata.patch
new file mode 100644
index 00000000..202aaf10
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-native/revert_use_of_sysconfigdata.patch
@@ -0,0 +1,86 @@
+On older versions of Python, sysconfig read the data from both the Makefile and
+the Python.h file generated at build time, created dictionaries with their variables
+and used those when using get_config_var(), now it uses _sysconfigdata.build_time_vars[]
+which contains information from the HOST, erroneous in our case, this patch reverts this
+behavior and uses Python.h and Makefile to get information.
+
+Upstream-Status: Inappropriate [oe-specific]
+
+Signed-off-by: Alejandro Hernandez <alejandro.hernandez@linux.intel.com>
+
+Index: Python-2.7.9/Lib/distutils/sysconfig.py
+===================================================================
+--- Python-2.7.9.orig/Lib/distutils/sysconfig.py
++++ Python-2.7.9/Lib/distutils/sysconfig.py
+@@ -401,12 +401,66 @@ _config_vars = None
+
+ def _init_posix():
+ """Initialize the module as appropriate for POSIX systems."""
+- # _sysconfigdata is generated at build time, see the sysconfig module
+- from _sysconfigdata import build_time_vars
+- global _config_vars
+- _config_vars = {}
+- _config_vars.update(build_time_vars)
++ g = {}
++ # load the installed Makefile:
++ try:
++ filename = get_makefile_filename()
++ parse_makefile(filename, g)
++ except IOError, msg:
++ my_msg = "invalid Python installation: unable to open %s" % filename
++ if hasattr(msg, "strerror"):
++ my_msg = my_msg + " (%s)" % msg.strerror
++
++ raise DistutilsPlatformError(my_msg)
++
++ # load the installed pyconfig.h:
++ try:
++ filename = get_config_h_filename()
++ parse_config_h(file(filename), g)
++ except IOError, msg:
++ my_msg = "invalid Python installation: unable to open %s" % filename
++ if hasattr(msg, "strerror"):
++ my_msg = my_msg + " (%s)" % msg.strerror
++
++ raise DistutilsPlatformError(my_msg)
++
++ # On AIX, there are wrong paths to the linker scripts in the Makefile
++ # -- these paths are relative to the Python source, but when installed
++ # the scripts are in another directory.
++ if python_build:
++ g['LDSHARED'] = g['BLDSHARED']
+
++ elif get_python_version() < '2.1':
++ # The following two branches are for 1.5.2 compatibility.
++ if sys.platform == 'aix4': # what about AIX 3.x ?
++ # Linker script is in the config directory, not in Modules as the
++ # Makefile says.
++ python_lib = get_python_lib(standard_lib=1)
++ ld_so_aix = os.path.join(python_lib, 'config', 'ld_so_aix')
++ python_exp = os.path.join(python_lib, 'config', 'python.exp')
++
++ g['LDSHARED'] = "%s %s -bI:%s" % (ld_so_aix, g['CC'], python_exp)
++
++ elif sys.platform == 'beos':
++ # Linker script is in the config directory. In the Makefile it is
++ # relative to the srcdir, which after installation no longer makes
++ # sense.
++ python_lib = get_python_lib(standard_lib=1)
++ linkerscript_path = string.split(g['LDSHARED'])[0]
++ linkerscript_name = os.path.basename(linkerscript_path)
++ linkerscript = os.path.join(python_lib, 'config',
++ linkerscript_name)
++
++ # XXX this isn't the right place to do this: adding the Python
++ # library to the link, if needed, should be in the "build_ext"
++ # command. (It's also needed for non-MS compilers on Windows, and
++ # it's taken care of for them by the 'build_ext.get_libraries()'
++ # method.)
++ g['LDSHARED'] = ("%s -L%s/lib -lpython%s" %
++ (linkerscript, PREFIX, get_python_version()))
++
++ global _config_vars
++ _config_vars = g
+
+ def _init_nt():
+ """Initialize the module as appropriate for NT"""
diff --git a/external/meta-python2/recipes-devtools/python/python-native/unixccompiler.patch b/external/meta-python2/recipes-devtools/python/python-native/unixccompiler.patch
new file mode 100644
index 00000000..45028291
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-native/unixccompiler.patch
@@ -0,0 +1,20 @@
+Upstream-Status: Pending
+
+The CC variable,sometimes like:"x86_64-poky-linux-gcc -m64 --sysroot=/${TMPDIR}/sysroots/qemux86-64", contains option information.
+This will lead to wrong compiler name "qemux86-64" rather than "x86_64-poky-linux-gcc" when python finding the compiler name.
+
+Signed-off-by: Mei Lei <lei.mei@intel.com>
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+Index: Python-2.7.2/Lib/distutils/unixccompiler.py
+===================================================================
+--- Python-2.7.2.orig/Lib/distutils/unixccompiler.py 2011-11-24 13:51:10.539998722 -0800
++++ Python-2.7.2/Lib/distutils/unixccompiler.py 2011-11-24 15:54:36.872137766 -0800
+@@ -282,7 +282,7 @@
+ # this time, there's no way to determine this information from
+ # the configuration data stored in the Python installation, so
+ # we use this hack.
+- compiler = os.path.basename(sysconfig.get_config_var("CC"))
++ compiler = sysconfig.get_config_var("CC")
+ if sys.platform[:6] == "darwin":
+ # MacOSX's linker doesn't understand the -R flag at all
+ return "-L" + dir
diff --git a/external/meta-python2/recipes-devtools/python/python-native_2.7.18.bb b/external/meta-python2/recipes-devtools/python/python-native_2.7.18.bb
new file mode 100644
index 00000000..72aa34c2
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-native_2.7.18.bb
@@ -0,0 +1,90 @@
+require python.inc
+EXTRANATIVEPATH += "bzip2-native"
+DEPENDS = "openssl-native bzip2-replacement-native zlib-native readline-native sqlite3-native expat-native gdbm-native db-native"
+
+SRC_URI += "\
+ file://05-enable-ctypes-cross-build.patch \
+ file://10-distutils-fix-swig-parameter.patch \
+ file://11-distutils-never-modify-shebang-line.patch \
+ file://0001-distutils-set-the-prefix-to-be-inside-staging-direct.patch \
+ file://unixccompiler.patch \
+ file://nohostlibs.patch \
+ file://multilib.patch \
+ file://add-md5module-support.patch \
+ file://0001-python-Resolve-intermediate-staging-issues.patch \
+ file://parallel-makeinst-create-bindir.patch \
+ file://revert_use_of_sysconfigdata.patch \
+ file://0001-python-native-fix-one-do_populate_sysroot-warning.patch \
+ "
+
+S = "${WORKDIR}/Python-${PV}"
+
+FILESEXTRAPATHS =. "${FILE_DIRNAME}/${PN}:"
+
+inherit native
+
+EXTRA_OECONF_append = " --bindir=${bindir}/${PN} --with-system-expat=${STAGING_DIR_HOST}"
+
+EXTRA_OEMAKE = '\
+ LIBC="" \
+ STAGING_LIBDIR=${STAGING_LIBDIR_NATIVE} \
+ STAGING_INCDIR=${STAGING_INCDIR_NATIVE} \
+'
+
+do_configure_append() {
+ autoreconf --verbose --install --force --exclude=autopoint ../Python-${PV}/Modules/_ctypes/libffi
+}
+
+# Cross-compiling Python needs a native pgen, build it here for use later.
+do_compile_append() {
+ oe_runmake Parser/pgen
+}
+
+do_install() {
+ oe_runmake 'DESTDIR=${D}' install
+ install -d ${D}${bindir}/${PN}
+ install -m 0755 Parser/pgen ${D}${bindir}/${PN}
+
+ # Make sure we use /usr/bin/env python
+ for PYTHSCRIPT in `grep -rIl ${bindir}/${PN}/python ${D}${bindir}/${PN}`; do
+ sed -i -e '1s|^#!.*|#!/usr/bin/env python|' $PYTHSCRIPT
+ done
+
+ # Add a symlink to the native Python so that scripts can just invoke
+ # "nativepython" and get the right one without needing absolute paths
+ # (these often end up too long for the #! parser in the kernel as the
+ # buffer is 128 bytes long).
+ ln -s python-native/python ${D}${bindir}/nativepython
+
+ # We don't want modules in ~/.local being used in preference to those
+ # installed in the native sysroot, so disable user site support.
+ sed -i -e 's,^\(ENABLE_USER_SITE = \).*,\1False,' ${D}${libdir}/python${PYTHON_MAJMIN}/site.py
+}
+
+python(){
+
+ # Read JSON manifest
+ import json
+ pythondir = d.getVar('THISDIR')
+ with open(pythondir+'/python/python2-manifest.json') as manifest_file:
+ manifest_str = manifest_file.read()
+ json_start = manifest_str.find('# EOC') + 6
+ manifest_file.seek(json_start)
+ manifest_str = manifest_file.read()
+ python_manifest = json.loads(manifest_str)
+
+ rprovides = d.getVar('RPROVIDES').split()
+
+ # Hardcoded since it cant be python-native-foo, should be python-foo-native
+ pn = 'python'
+
+ # ${PN}-misc-native is not in the manifest
+ rprovides.append(pn + '-misc-native')
+
+ for key in python_manifest:
+ pypackage = pn + '-' + key + '-native'
+ if pypackage not in rprovides:
+ rprovides.append(pypackage)
+
+ d.setVar('RPROVIDES', ' '.join(rprovides))
+}
diff --git a/external/meta-python2/recipes-devtools/python/python-ndg-httpsclient_0.5.1.bb b/external/meta-python2/recipes-devtools/python/python-ndg-httpsclient_0.5.1.bb
new file mode 100644
index 00000000..4795f300
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-ndg-httpsclient_0.5.1.bb
@@ -0,0 +1,40 @@
+
+SUMMARY = "Provides enhanced HTTPS support for httplib and urllib2 using PyOpenSSL"
+DESCRIPTION = "A HTTPS client implementation for \
+\
+ httplib (Python 2), http.client (Python 3) and \
+ urllib2 (Python 2) and urllib (Python 3) \
+\
+… based on PyOpenSSL. PyOpenSSL provides a more fully featured SSL \
+implementation over the default provided with Python and importantly enables \
+full verification of the SSL peer using pyasn1."
+HOMEPAGE = "https://github.com/cedadev/ndg_httpsclient/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://MANIFEST.in;md5=ce22c0cd986d2de3f7073cd6b5523ae0"
+
+SRC_URI[md5sum] = "b0fc8ea38f87d2c1ab1ed79a95c078f9"
+SRC_URI[sha256sum] = "d72faed0376ab039736c2ba12e30695e2788c4aa569c9c3e3d72131de2592210"
+
+PYPI_PACKAGE = "ndg_httpsclient"
+
+DEPENDS += " \
+ ${PYTHON_PN}-pyopenssl \
+ ${PYTHON_PN}-pyasn1 \
+"
+
+inherit pypi setuptools update-alternatives
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-pyopenssl \
+ ${PYTHON_PN}-pyasn1 \
+"
+
+UPSTREAM_CHECK_REGEX = ""
+
+ALTERNATIVE_${PN} = "ndg_httpclient"
+ALTERNATIVE_LINK_NAME[ndg_httpclient] = "${bindir}/ndg_httpclient"
+ALTERNATIVE_PRIORITY = "20"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-netaddr_0.7.19.bb b/external/meta-python2/recipes-devtools/python/python-netaddr_0.7.19.bb
new file mode 100644
index 00000000..0353c2f9
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-netaddr_0.7.19.bb
@@ -0,0 +1,14 @@
+SUMMARY = "A network address manipulation library for Python."
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e6345d695ffe3776f68a56fe7962db44"
+
+SRC_URI[md5sum] = "51019ef59c93f3979bcb37d3b8527e07"
+SRC_URI[sha256sum] = "38aeec7cdd035081d3a4c306394b19d677623bf76fa0913f6695127c7753aefd"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-pprint \
+ ${PYTHON_PN}-textutils \
+ ${PYTHON_PN}-xml \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-netifaces_0.10.9.bb b/external/meta-python2/recipes-devtools/python/python-netifaces_0.10.9.bb
new file mode 100644
index 00000000..ba6bd161
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-netifaces_0.10.9.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Portable network interface information for Python"
+DESCRIPTION = "Portable network interface information for Python"
+HOMEPAGE = "https://github.com/al45tair/netifaces"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=a53cbc7cb75660694e138ba973c148df"
+
+SRC_URI[md5sum] = "de92cc322b4f56047c073f802ad77860"
+SRC_URI[sha256sum] = "2dee9ffdd16292878336a58d04a20f0ffe95555465fee7c9bd23b3490ef2abf3"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-networkx_2.2.bb b/external/meta-python2/recipes-devtools/python/python-networkx_2.2.bb
new file mode 100644
index 00000000..c8d36192
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-networkx_2.2.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Python package for creating and manipulating graphs and networks"
+DESCRIPTION = "NetworkX is a Python package for the creation, manipulation, \
+and study of the structure, dynamics, and functions of complex networks."
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3376ff7c9c58048c62d91431f7f08cde"
+
+SRC_URI[md5sum] = "82608a3686fb3e61f20cf13bfd3c1b4a"
+SRC_URI[sha256sum] = "45e56f7ab6fe81652fb4bc9f44faddb0e9025f469f602df14e3b2551c2ea5c8b"
+
+inherit pypi setuptools
+
+PYPI_PACKAGE_EXT = "zip"
+
+RDEPENDS_${PN} += "${PYTHON_PN}-decorator"
diff --git a/external/meta-python2/recipes-devtools/python/python-numeric/0001-it-tries-to-define-this-function-differently-than-it.patch b/external/meta-python2/recipes-devtools/python/python-numeric/0001-it-tries-to-define-this-function-differently-than-it.patch
new file mode 100644
index 00000000..81ed744c
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-numeric/0001-it-tries-to-define-this-function-differently-than-it.patch
@@ -0,0 +1,30 @@
+From 322e781c67d7a78fc2cfc3d377f50b825fc64abb Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Fri, 2 Jun 2017 20:21:01 -0700
+Subject: [PATCH] it tries to define this function differently than it is
+ defined in sys/time.h.
+
+Use the definition from system
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ Packages/RNG/Src/ranf.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/Packages/RNG/Src/ranf.c b/Packages/RNG/Src/ranf.c
+index 5ca7dc5..e669fa8 100644
+--- a/Packages/RNG/Src/ranf.c
++++ b/Packages/RNG/Src/ranf.c
+@@ -149,9 +149,6 @@ void Mixranf(int *s,u32 s48[2])
+ #else
+ struct timeval tv;
+ struct timezone tz;
+-#if !defined(__sgi)
+- int gettimeofday(struct timeval *, struct timezone *);
+-#endif
+
+ (void)gettimeofday(&tv,&tz);
+ s48[0] = (u32)tv.tv_sec;
+--
+2.13.0
+
diff --git a/external/meta-python2/recipes-devtools/python/python-numeric_24.2.bb b/external/meta-python2/recipes-devtools/python/python-numeric_24.2.bb
new file mode 100644
index 00000000..c91d77c8
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-numeric_24.2.bb
@@ -0,0 +1,16 @@
+SUMMARY = "A sophisticated Numeric Processing Package for Python"
+SECTION = "devel/python"
+LICENSE = "PSF & LLNL"
+LIC_FILES_CHKSUM = "file://Legal.htm;md5=e3ce75dedd4043918d15979ae43e312e"
+
+PR = "ml3"
+
+SRC_URI = "${SOURCEFORGE_MIRROR}/numpy/Numeric-${PV}.tar.gz \
+ file://0001-it-tries-to-define-this-function-differently-than-it.patch \
+"
+S = "${WORKDIR}/Numeric-${PV}"
+
+inherit distutils
+
+SRC_URI[md5sum] = "2ae672656e06716a149acb048cca3093"
+SRC_URI[sha256sum] = "5f72e729eb6ff57442f2a38bfc9931738b59e5077928e2e70d22b4610ff15258"
diff --git a/external/meta-python2/recipes-devtools/python/python-packaging_20.0.bb b/external/meta-python2/recipes-devtools/python/python-packaging_20.0.bb
new file mode 100644
index 00000000..e19bca30
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-packaging_20.0.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Core utilities for Python packages"
+DESCRIPTION = "The packaging project includes the following: version handling, \
+specifiers, markers, requirements, tags, utilities."
+HOMEPAGE = "https://github.com/pypa/packaging"
+LICENSE = "Apache-2.0 & BSD"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=faadaedca9251a90b205c9167578ce91"
+
+SRC_URI[md5sum] = "93d6ccbdfcb5b7697b6ecea53ecc294b"
+SRC_URI[sha256sum] = "fe1d8331dfa7cc0a883b49d75fc76380b2ab2734b220fbb87d774e4fd4b851f8"
+
+inherit pypi setuptools
+
+DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
+
+RDEPENDS_${PN} += "${PYTHON_PN}-six ${PYTHON_PN}-pyparsing"
diff --git a/external/meta-python2/recipes-devtools/python/python-paho-mqtt_1.5.0.bb b/external/meta-python2/recipes-devtools/python/python-paho-mqtt_1.5.0.bb
new file mode 100644
index 00000000..01643d54
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-paho-mqtt_1.5.0.bb
@@ -0,0 +1,25 @@
+SUMMARY = "MQTT version 3.1/3.1.1 client library"
+HOMEPAGE = "http://eclipse.org/paho"
+LICENSE = "EPL-1.0 | EDL-1.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=eb48c6ee2cb9f5b8b9fe75e6f817bdfc \
+ file://epl-v10;md5=8d383c379e91d20ba18a52c3e7d3a979 \
+ file://edl-v10;md5=c09f121939f063aeb5235972be8c722c \
+"
+
+SRC_URI[md5sum] = "45e80d9b8066a8d0ba1ecfffe271bd3d"
+SRC_URI[sha256sum] = "e3d286198baaea195c8b3bc221941d25a3ab0e1507fc1779bdb7473806394be4"
+
+SRCNAME = "paho-mqtt"
+
+inherit pypi setuptools
+
+DEPENDS += "${PYTHON_PN}-pytest-runner-native"
+
+RDEPENDS_${PN} = "\
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-math \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-threading \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-pam_1.8.2.bb b/external/meta-python2/recipes-devtools/python/python-pam_1.8.2.bb
new file mode 100644
index 00000000..bac34961
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pam_1.8.2.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "Python PAM module using ctypes, py3/py2."
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=64326d42471b493c5c088305364ad5da"
+
+SRC_URI[md5sum] = "db71b6b999246fb05d78ecfbe166629d"
+SRC_URI[sha256sum] = "26efe4e79b869b10f97cd8c4a6bbb04a4e54d41186364e975b4108c9c071812c"
+
+PYPI_PACKAGE = "python-pam"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "libpam"
+
+inherit features_check
+REQUIRED_DISTRO_FEATURES = "pam"
diff --git a/external/meta-python2/recipes-devtools/python/python-pamela_0.3.0.bb b/external/meta-python2/recipes-devtools/python/python-pamela_0.3.0.bb
new file mode 100644
index 00000000..7c39f28a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pamela_0.3.0.bb
@@ -0,0 +1,18 @@
+DESCRIPTION = "Pamela: yet another Python wrapper for PAM"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=bfb663f37eb99232bc8ccfa4ea8f1202"
+
+SRC_URI[md5sum] = "de6516118d51eb5fc97017f3b6d5c68b"
+SRC_URI[sha256sum] = "1e198446a6cdd87704aa0def7621d62e7c20b0e6068e2788b9a866a8355e5d6b"
+
+PYPI_PACKAGE = "pamela"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "libpam"
+
+inherit features_check
+REQUIRED_DISTRO_FEATURES = "pam"
+
+# meta-python recipe did not follow Debian naming
+PROVIDES += "pamela"
diff --git a/external/meta-python2/recipes-devtools/python/python-parse-type_0.4.2.bb b/external/meta-python2/recipes-devtools/python/python-parse-type_0.4.2.bb
new file mode 100644
index 00000000..c81dade6
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-parse-type_0.4.2.bb
@@ -0,0 +1,13 @@
+SUMMARY = "Simplifies building parse types based on the parse module"
+HOMEPAGE = "https://github.com/jenisys/parse_type"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d07323820cca0f1d192cbbf8a0516f95"
+
+SRC_URI[md5sum] = "b5fa59e45965d1b2896023742df2e707"
+SRC_URI[sha256sum] = "f596bdc75d3dd93036fbfe3d04127da9f6df0c26c36e01e76da85adef4336b3c"
+
+PYPI_PACKAGE = "parse_type"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "${PYTHON_PN}-parse"
diff --git a/external/meta-python2/recipes-devtools/python/python-parse_1.14.0.bb b/external/meta-python2/recipes-devtools/python/python-parse_1.14.0.bb
new file mode 100644
index 00000000..1fd51163
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-parse_1.14.0.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Parse strings using a specification based on the Python format() syntax"
+HOMEPAGE = "https://github.com/r1chardj0n3s/parse"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://parse.py;beginline=1325;endline=1345;md5=fa03bae3f51a2db25e239e869c647437"
+
+SRC_URI[md5sum] = "07cbb5ba1025cbfe92fc3376c372dda5"
+SRC_URI[sha256sum] = "95a4f4469e37c57b5e924629ac99926f28bee7da59515dc5b8078c4c3e779249"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_append_class-target = "\
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-numbers \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-passlib_1.7.2.bb b/external/meta-python2/recipes-devtools/python/python-passlib_1.7.2.bb
new file mode 100644
index 00000000..e47d18f9
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-passlib_1.7.2.bb
@@ -0,0 +1,21 @@
+SUMMARY = "comprehensive password hashing framework supporting over 30 schemes"
+DESCRIPTION = "\
+Passlib is a password hashing library for Python 2 & 3, which provides cross-platform \
+implementations of over 30 password hashing algorithms, as well as a framework for \
+managing existing password hashes. It’s designed to be useful for a wide range of \
+tasks, from verifying a hash found in /etc/shadow, to providing full-strength password \
+hashing for multi-user applications."
+HOMEPAGE = "https://bitbucket.org/ecollins/passlib"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=44fd7dcd5d42b48d6dea59ac643a0179"
+
+SRC_URI[md5sum] = "b908529cfd4c33057c244324c692eae7"
+SRC_URI[sha256sum] = "8d666cef936198bc2ab47ee9b0410c94adf2ba798e5a84bf220be079ae7ab6a8"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-crypt \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-netclient \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-paste_3.2.3.bb b/external/meta-python2/recipes-devtools/python/python-paste_3.2.3.bb
new file mode 100644
index 00000000..c3d4fddf
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-paste_3.2.3.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Tools for using a Web Server Gateway Interface stack"
+HOMEPAGE = "http://pythonpaste.org/"
+LICENSE = "MIT"
+RDEPENDS_${PN} = "python-six"
+
+LIC_FILES_CHKSUM = "file://docs/license.txt;md5=1798f29d55080c60365e6283cb49779c"
+
+SRC_URI[md5sum] = "7dc6dbd20e358dd95bd42eef5c6cc84c"
+SRC_URI[sha256sum] = "8bdc7f6be907eed7cd63868c79d88af2b87d02d840fb5acfc93d4bda572b1567"
+
+PYPI_PACKAGE = "Paste"
+inherit pypi setuptools
+
+FILES_${PN} += "/usr/lib/*"
+
+DEPENDS += "${PYTHON_PN}-pytest-runner-native"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-pathlib2_2.3.5.bb b/external/meta-python2/recipes-devtools/python/python-pathlib2_2.3.5.bb
new file mode 100644
index 00000000..3d83a290
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pathlib2_2.3.5.bb
@@ -0,0 +1,24 @@
+SUMMARY = "Object-oriented filesystem paths"
+DESCRIPTION = "The old pathlib module on bitbucket is in bugfix-only mode. \
+The goal of pathlib2 is to provide a backport of standard pathlib module which \
+tracks the standard library module, so all the newest features of the standard \
+pathlib can be used also on older Python versions."
+HOMEPAGE = "https://github.com/mcmtroffaes/pathlib2"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=042856c23a3e903b33bf361ea1cbe29a"
+
+SRC_URI[md5sum] = "f2bd0a363eb0f8fa0556f35c1d9e66fb"
+SRC_URI[sha256sum] = "6cd9a47b597b37cc57de1c05e56fb1a1c9cc9fab04fe78c29acd090418529868"
+
+inherit pypi setuptools
+
+# Needs python-misc for ntpath
+# Could probably be removed by patching out Windows code
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-six \
+ python-misc \
+ python-scandir \
+ python-shell \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pbr_5.4.4.bb b/external/meta-python2/recipes-devtools/python/python-pbr_5.4.4.bb
new file mode 100644
index 00000000..9d7d8d7b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pbr_5.4.4.bb
@@ -0,0 +1,13 @@
+inherit setuptools
+# The inc file is in oe-core
+require recipes-devtools/python/python-pbr.inc
+
+SRC_URI[md5sum] = "65cdc32e1a1ff56d481fc15aa8caf988"
+SRC_URI[sha256sum] = "139d2625547dbfa5fb0b81daebb39601c478c21956dc57e2e07b74450a8c506b"
+
+do_install_append() {
+ if [ -f ${D}${bindir}/pbr ]; then
+ mv ${D}${bindir}/pbr ${D}${bindir}/pbr-2
+ fi
+}
+
diff --git a/external/meta-python2/recipes-devtools/python/python-pep8_1.7.1.bb b/external/meta-python2/recipes-devtools/python/python-pep8_1.7.1.bb
new file mode 100644
index 00000000..54ce9781
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pep8_1.7.1.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Python style guide checker"
+HOMEPAGE = "https://github.com/dreamhost/cliff"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://README.rst;md5=d8ebbbe831259ce010179d2f310b0f3e"
+
+SRC_URI[md5sum] = "603821d06db945c71d811b5a8d78423c"
+SRC_URI[sha256sum] = "fe249b52e20498e59e0b5c5256aa52ee99fc295b26ec9eaa85776ffdb9fe6374"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ python-prettytable \
+ python-cmd2 \
+ python-pyparsing"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-periphery_2.0.0.bb b/external/meta-python2/recipes-devtools/python/python-periphery_2.0.0.bb
new file mode 100644
index 00000000..1a28e23a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-periphery_2.0.0.bb
@@ -0,0 +1,12 @@
+
+DESCRIPTION = "A pure Python 2/3 library for peripheral I/O (GPIO, LED, PWM, SPI, I2C, MMIO, Serial) in Linux."
+HOMEPAGE = "http://pythonhosted.org/python-periphery/"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=19f978bd6c8afe3fa9e408b71330512f"
+
+PYPI_PACKAGE = "python-periphery"
+
+inherit pypi setuptools
+
+SRC_URI[sha256sum] = "2df05528a7668db4fb3faaff516b34ed99e9009ed9610a4efe3ea6c0ea8a3aab"
diff --git a/external/meta-python2/recipes-devtools/python/python-pexpect_4.7.0.bb b/external/meta-python2/recipes-devtools/python/python-pexpect_4.7.0.bb
new file mode 100644
index 00000000..3efdafd2
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pexpect_4.7.0.bb
@@ -0,0 +1,23 @@
+SUMMARY = "A Pure Python Expect like Module for Python"
+HOMEPAGE = "http://pexpect.readthedocs.org/"
+SECTION = "devel/python"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=1c7a725251880af8c6a148181665385b"
+
+SRC_URI[md5sum] = "ed003242cbf308aee1b1eaecdef59e43"
+SRC_URI[sha256sum] = "9e2c1fd0e6ee3a49b28f95d4b33bc389c89b20af6a1255906e90ff1262ce62eb"
+
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/pexpect"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "\
+ ${PYTHON_PN}-core \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-terminal \
+ ${PYTHON_PN}-resource \
+ ${PYTHON_PN}-fcntl \
+ ${PYTHON_PN}-ptyprocess \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pika_1.1.0.bb b/external/meta-python2/recipes-devtools/python/python-pika_1.1.0.bb
new file mode 100644
index 00000000..910a7d5d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pika_1.1.0.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Pika is a RabbitMQ (AMQP 0-9-1) client library for Python."
+DESCRIPTION = " \
+Pika is a pure-Python implementation of the AMQP 0-9-1 protocol \
+including RabbitMQ’s extensions. \
+"
+SECTION = "devel/python"
+HOMEPAGE = "https://pika.readthedocs.io"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=535836bf0a5de515a7bfee026075701d"
+
+SRC_URI[md5sum] = "6002400cdd33bf85ec8680ece72910d4"
+SRC_URI[sha256sum] = "9fa76ba4b65034b878b2b8de90ff8660a59d925b087c5bb88f8fdbb4b64a1dbf"
+
+inherit pypi setuptools
+
+PYPI_PACKAGE = "pika"
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-tornado \
+ ${PYTHON_PN}-twisted \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-pint_0.9.bb b/external/meta-python2/recipes-devtools/python/python-pint_0.9.bb
new file mode 100644
index 00000000..71ddf547
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pint_0.9.bb
@@ -0,0 +1,24 @@
+SUMMARY = "Physical quantities module"
+DESCRIPTION = "Pint is a Python package to define, operate and manipulate \
+physical quantities: the product of a numerical value and a unit of \
+measurement. It allows arithmetic operations between them and conversions from \
+and to different units. \
+\
+It is distributed with a comprehensive list of physical units, prefixes and \
+constants. Due to its modular design, you can extend (or even rewrite!) the \
+complete list without changing the source code. It supports a lot of numpy \
+mathematical operations without monkey patching or wrapping numpy."
+HOMEPAGE = "https://github.com/hgrecco/pint"
+SECTION = "devel/python"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=bccf824202692270a1e0829a62e3f47b"
+
+PYPI_PACKAGE = "Pint"
+
+SRC_URI[md5sum] = "d0681cb7cfaca9fc68ce7edab0d08d88"
+SRC_URI[sha256sum] = "32d8a9a9d63f4f81194c0014b3b742679dce81a26d45127d9810a68a561fe4e2"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-pip_19.3.1.bb b/external/meta-python2/recipes-devtools/python/python-pip_19.3.1.bb
new file mode 100644
index 00000000..2827a125
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pip_19.3.1.bb
@@ -0,0 +1,14 @@
+SUMMARY = "PIP is a tool for installing and managing Python packages"
+HOMEPAGE = "https://pip.pypa.io/"
+LICENSE = "MIT & LGPL-2.1"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=8ba06d529c955048e5ddd7c45459eb2e"
+
+SRC_URI[md5sum] = "1aaaf90fbafc50e7ba1e66ffceb00960"
+SRC_URI[sha256sum] = "21207d76c1031e517668898a6b46a9fb1501c7a4710ef5dfd6a40ad9e6757ea7"
+
+inherit pypi setuptools
+
+# Since PIP is like CPAN for PERL we need to drag in all python modules to ensure everything works
+RDEPENDS_${PN}_class-target = "python-modules python-distribute python-misc"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pluggy_0.13.1.bb b/external/meta-python2/recipes-devtools/python/python-pluggy_0.13.1.bb
new file mode 100644
index 00000000..47763507
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pluggy_0.13.1.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Plugin and hook calling mechanisms for python"
+HOMEPAGE = "https://github.com/pytest-dev/pluggy"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=1c8206d16fd5cc02fa9b0bb98955e5c2"
+
+SRC_URI[md5sum] = "7f610e28b8b34487336b585a3dfb803d"
+SRC_URI[sha256sum] = "15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"
+
+DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
+RDEPENDS_${PN} += "${PYTHON_PN}-importlib-metadata \
+ ${PYTHON_PN}-more-itertools \
+"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-ply_3.11.bb b/external/meta-python2/recipes-devtools/python/python-ply_3.11.bb
new file mode 100644
index 00000000..0faec95d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-ply_3.11.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Python Lex and Yacc"
+DESCRIPTION = "Python ply: PLY is yet another implementation of lex and yacc for Python"
+HOMEPAGE = "https://pypi.python.org/pypi/ply"
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://README.md;beginline=5;endline=32;md5=f5ee5c355c0e6719c787a71b8f0fa96c"
+
+SRC_URI[md5sum] = "6465f602e656455affcd7c5734c638f8"
+SRC_URI[sha256sum] = "00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target += "\
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-shell \
+"
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-pretend_1.0.9.bb b/external/meta-python2/recipes-devtools/python/python-pretend_1.0.9.bb
new file mode 100644
index 00000000..0c7c3c7a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pretend_1.0.9.bb
@@ -0,0 +1,11 @@
+SUMMARY = "A library for stubbing in Python"
+HOMEPAGE = "https://github.com/alex/pretend"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=411780c0b7fa756753e94affeee5bc99"
+
+SRC_URI[md5sum] = "ad53883ede48aeac7ae584f0de0240e8"
+SRC_URI[sha256sum] = "c90eb810cde8ebb06dafcb8796f9a95228ce796531bc806e794c2f4649aa1b10"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-prettytable_0.7.2.bb b/external/meta-python2/recipes-devtools/python/python-prettytable_0.7.2.bb
new file mode 100644
index 00000000..264a81fc
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-prettytable_0.7.2.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Python library for displaying tabular data in a ASCII table format"
+HOMEPAGE = "http://code.google.com/p/prettytable"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://COPYING;md5=3e73500ffa52de5071cff65990055282"
+
+# file not found at path pypi.bbclass expects, unclear why...
+SRC_URI = "https://pypi.python.org/packages/source/P/PrettyTable/${SRCNAME}-${PV}.zip"
+
+SRC_URI[md5sum] = "0c1361104caff8b09f220748f9d69899"
+SRC_URI[sha256sum] = "a53da3b43d7a5c229b5e3ca2892ef982c46b7923b51e98f0db49956531211c4f"
+
+SRCNAME = "prettytable"
+
+inherit setuptools
+
+S = "${WORKDIR}/${SRCNAME}-${PV}"
+
+do_install_append() {
+ perm_files=`find "${D}${PYTHON_SITEPACKAGES_DIR}/" -name "*.txt" -o -name "PKG-INFO"`
+ for f in $perm_files; do
+ chmod 644 "${f}"
+ done
+}
+
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/PrettyTable/"
+UPSTREAM_CHECK_REGEX = "/PrettyTable/(?P<pver>(\d+[\.\-_]*)+)"
+
+BBCLASSEXTEND = "native nativesdk"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-progress_1.5.bb b/external/meta-python2/recipes-devtools/python/python-progress_1.5.bb
new file mode 100644
index 00000000..01003fc9
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-progress_1.5.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Easy progress reporting for Python"
+HOMEPAGE = "http://github.com/verigak/progress/"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=aef5566ac4fede9815eccf124c281317"
+
+SRC_URI[md5sum] = "408df0e3db0ad4b74f19f6beec814ae4"
+SRC_URI[sha256sum] = "69ecedd1d1bbe71bf6313d88d1e6c4d2957b7f1d4f71312c211257f7dae64372"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target += " \
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-math \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-prompt-toolkit_2.0.10.bb b/external/meta-python2/recipes-devtools/python/python-prompt-toolkit_2.0.10.bb
new file mode 100644
index 00000000..13acbc5c
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-prompt-toolkit_2.0.10.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Library for building powerful interactive command lines in Python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b2cde7da89f0c1f3e49bf968d00d554f"
+
+SRC_URI[md5sum] = "5016c523e603cd7119644fbc0f00ce53"
+SRC_URI[sha256sum] = "f15af68f66e664eaa559d4ac8a928111eebd5feda0c11738b5998045224829db"
+
+PYPI_PACKAGE = "prompt_toolkit"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-core \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-terminal \
+ ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-wcwidth \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-protobuf_3.9.2.bb b/external/meta-python2/recipes-devtools/python/python-protobuf_3.9.2.bb
new file mode 100644
index 00000000..84ce2201
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-protobuf_3.9.2.bb
@@ -0,0 +1,33 @@
+SUMMARY = "Protocol Buffers"
+DESCRIPTION = "Protocol Buffers are Google’s data interchange format"
+HOMEPAGE = "https://developers.google.com/protocol-buffers/"
+SECTION = "devel/python"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=19e8f490f9526b1de84f8d949cfcfd4e"
+
+inherit pypi setuptools
+
+SRC_URI[md5sum] = "d634666c898148e4565ac62f3ba4a2ca"
+SRC_URI[sha256sum] = "843f498e98ad1469ad54ecb4a7ccf48605a1c5d2bd26ae799c7a2cddab4a37ec"
+
+# http://errors.yoctoproject.org/Errors/Details/184715/
+# Can't find required file: ../src/google/protobuf/descriptor.proto
+CLEANBROKEN = "1"
+
+UPSTREAM_CHECK_REGEX = "protobuf/(?P<pver>\d+(\.\d+)+)/"
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-pkgutil \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-unittest \
+"
+
+# For usage in other recipies when compiling protobuf files (e.g. by grpcio-tools)
+BBCLASSEXTEND = "native nativesdk"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-psutil_5.6.7.bb b/external/meta-python2/recipes-devtools/python/python-psutil_5.6.7.bb
new file mode 100644
index 00000000..82d032ff
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-psutil_5.6.7.bb
@@ -0,0 +1,25 @@
+SUMMARY = "A cross-platform process and system utilities module for Python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e35fd9f271d19d5f742f20a9d1f8bb8b"
+
+SRC_URI[md5sum] = "b2c94e0368fc6e6f237a7252f8e85ca2"
+SRC_URI[sha256sum] = "ffad8eb2ac614518bbe3c0b8eb9dffdb3a8d2e3a7d5da51c5b974fb723a5c5aa"
+
+inherit pypi setuptools
+
+PACKAGES =+ "${PN}-tests"
+
+FILES_${PN}-tests += " \
+ ${PYTHON_SITEPACKAGES_DIR}/psutil/test* \
+ ${PYTHON_SITEPACKAGES_DIR}/psutil/__pycache__/test* \
+"
+
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-xml \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-ptyprocess_0.6.0.bb b/external/meta-python2/recipes-devtools/python/python-ptyprocess_0.6.0.bb
new file mode 100644
index 00000000..bd4613e3
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-ptyprocess_0.6.0.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Run a subprocess in a pseudo terminal"
+HOMEPAGE = "http://ptyprocess.readthedocs.io/en/latest/"
+SECTION = "devel/python"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=cfdcd51fa7d5808da4e74346ee394490"
+
+SRCNAME = "ptyprocess"
+
+SRC_URI[md5sum] = "37402d69f3b50913d4d483587bffad8f"
+SRC_URI[sha256sum] = "923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0"
+
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/ptyprocess"
+
+S = "${WORKDIR}/${SRCNAME}-${PV}"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "\
+ ${PYTHON_PN}-core \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-py_1.8.1.bb b/external/meta-python2/recipes-devtools/python/python-py_1.8.1.bb
new file mode 100644
index 00000000..5038e983
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-py_1.8.1.bb
@@ -0,0 +1,13 @@
+SUMMARY = "Library with cross-python path, ini-parsing, io, code, log facilities"
+HOMEPAGE = "http://py.readthedocs.io/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a6bb0320b04a0a503f12f69fea479de9"
+
+SRC_URI[md5sum] = "42c67de84b07ac9cc867b8b70843a45b"
+SRC_URI[sha256sum] = "5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa"
+
+DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyalsaaudio_0.8.4.bb b/external/meta-python2/recipes-devtools/python/python-pyalsaaudio_0.8.4.bb
new file mode 100644
index 00000000..2cd3e760
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyalsaaudio_0.8.4.bb
@@ -0,0 +1,14 @@
+
+SUMMARY = "Support for the Linux 2.6.x ALSA Sound System"
+SECTION = "devel/python"
+LICENSE = "PSF"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=1a3b161aa0fcec32a0c8907a2219ad9d"
+
+SRC_URI[md5sum] = "b46f69561bc85fc52e698b2440ca251e"
+SRC_URI[sha256sum] = "84e8f8da544d7f4bd96479ce4a237600077984d9be1d7f16c1d9a492ecf50085"
+
+DEPENDS += "alsa-lib"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "libasound"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyasn1-modules_0.2.7.bb b/external/meta-python2/recipes-devtools/python/python-pyasn1-modules_0.2.7.bb
new file mode 100644
index 00000000..c3df6b14
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyasn1-modules_0.2.7.bb
@@ -0,0 +1,16 @@
+SUMMARY = "A collection of ASN.1-based protocols modules."
+DESCRIPTION = "A collection of ASN.1 modules expressed in form of pyasn1\
+ classes. Includes protocols PDUs definition (SNMP, LDAP etc.) and various\
+ data structures (X.509, PKCS etc.)."
+HOMEPAGE = "https://github.com/etingof/pyasn1-modules"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a14482d15c2249de3b6f0e8a47e021fd"
+
+SRC_URI[md5sum] = "18c77d56abeef631d94f95ff2d652859"
+SRC_URI[sha256sum] = "0c35a52e00b672f832e5846826f1fb7507907f7d52fba6faa9e3c4cbe874fe4b"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "${PYTHON_PN}-pyasn1"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyasn1_0.4.8.bb b/external/meta-python2/recipes-devtools/python/python-pyasn1_0.4.8.bb
new file mode 100644
index 00000000..40855795
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyasn1_0.4.8.bb
@@ -0,0 +1,20 @@
+
+SUMMARY = "Python library implementing ASN.1 types."
+HOMEPAGE = "http://pyasn1.sourceforge.net/"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=a14482d15c2249de3b6f0e8a47e021fd"
+
+SRC_URI[md5sum] = "dffae4ff9f997a83324b3f33fe62be54"
+SRC_URI[sha256sum] = "aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target += " \
+ ${PYTHON_PN}-codecs \
+ ${PYTHON_PN}-lang \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-math \
+ ${PYTHON_PN}-shell \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pybind11_2.4.3.bb b/external/meta-python2/recipes-devtools/python/python-pybind11_2.4.3.bb
new file mode 100644
index 00000000..a1309801
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pybind11_2.4.3.bb
@@ -0,0 +1,9 @@
+SUMMARY = "Seamless operability between C++11 and Python"
+HOMEPAGE = "https://github.com/wjakob/pybind11"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=beb87117af69fd10fbf9fb14c22a2e62"
+
+SRC_URI[md5sum] = "23fdca8191b16ce3e7f38fb9e4252b2d"
+SRC_URI[sha256sum] = "72e6def53fb491f7f4e92692029d2e7bb5a0783314f20d80222735ff10a75758"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-pybluez_0.22.bb b/external/meta-python2/recipes-devtools/python/python-pybluez_0.22.bb
new file mode 100644
index 00000000..4da22923
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pybluez_0.22.bb
@@ -0,0 +1,25 @@
+
+SUMMARY = "Bluetooth Python extension module"
+DESCRIPTION = "Bluetooth Python extension module"
+HOMEPAGE = "https://pybluez.readthedocs.io/"
+SECTION = "devel/python"
+
+DEPENDS = "bluez5"
+
+LICENSE = "GPL-2.0"
+LIC_FILES_CHKSUM = "file://COPYING;md5=8a71d0475d08eee76d8b6d0c6dbec543"
+
+SRC_URI[md5sum] = "49dab9d5a8f0b798c8125c7f649be3cd"
+SRC_URI[sha256sum] = "4ce006716a54d9d18e8186a3f1c8b12a8e6befecffe8fd5828a291fb694ce49d"
+
+S = "${WORKDIR}/PyBluez-${PV}"
+
+PYPI_PACKAGE = "PyBluez"
+PYPI_PACKAGE_EXT = "zip"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ bluez5 \
+ ${PYTHON_PN}-fcntl \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-pycodestyle_2.5.0.bb b/external/meta-python2/recipes-devtools/python/python-pycodestyle_2.5.0.bb
new file mode 100644
index 00000000..38ed8439
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pycodestyle_2.5.0.bb
@@ -0,0 +1,21 @@
+
+SUMMARY = "Python style guide checker (formly called pep8)"
+HOMEPAGE = "https://pypi.org/project/pycodestyle"
+LICENSE = "MIT"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=01831ddbaf398471da3cc87f5037e822"
+
+SRC_URI[md5sum] = "40e7a76f364a18f531aaba11a4476e21"
+SRC_URI[sha256sum] = "e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "${PYTHON_PN}-lang"
+
+do_install_append () {
+ if [ -f ${D}${bindir}/pycodestyle ]; then
+ mv ${D}${bindir}/pycodestyle ${D}${bindir}/pycodestyle-2
+ fi
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pycparser_2.19.bb b/external/meta-python2/recipes-devtools/python/python-pycparser_2.19.bb
new file mode 100644
index 00000000..63c5a681
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pycparser_2.19.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Parser of the C language, written in pure Python"
+HOMEPAGE = "https://github.com/eliben/pycparser"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=86f1cedb4e6410a88ce8e30b91079169"
+
+SRC_URI[md5sum] = "76396762adc3fa769c83d8e202d36b6f"
+SRC_URI[sha256sum] = "a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target += "\
+ ${PYTHON_PN}-ply \
+ ${PYTHON_PN}-pprint \
+ ${PYTHON_PN}-subprocess \
+ cpp \
+ cpp-symlinks \
+ "
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pycrypto/CVE-2013-7459.patch b/external/meta-python2/recipes-devtools/python/python-pycrypto/CVE-2013-7459.patch
new file mode 100644
index 00000000..9006c5c3
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pycrypto/CVE-2013-7459.patch
@@ -0,0 +1,98 @@
+From 8dbe0dc3eea5c689d4f76b37b93fe216cf1f00d4 Mon Sep 17 00:00:00 2001
+From: Legrandin <helderijs@gmail.com>
+Date: Sun, 22 Dec 2013 22:24:46 +0100
+Subject: [PATCH] Throw exception when IV is used with ECB or CTR
+
+The IV parameter is currently ignored when initializing
+a cipher in ECB or CTR mode.
+
+For CTR mode, it is confusing: it takes some time to see
+that a different parameter is needed (the counter).
+
+For ECB mode, it is outright dangerous.
+
+This patch forces an exception to be raised.
+
+Upstream-Status: Backport
+[https://github.com/dlitz/pycrypto/commit/8dbe0dc3eea5c689d4f76b37b93fe216cf1f00d4]
+
+CVE: CVE-2013-7459
+
+Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
+---
+ lib/Crypto/SelfTest/Cipher/common.py | 31 +++++++++++++++++++++++--------
+ src/block_template.c | 11 +++++++++++
+ 2 files changed, 34 insertions(+), 8 deletions(-)
+
+diff --git a/lib/Crypto/SelfTest/Cipher/common.py b/lib/Crypto/SelfTest/Cipher/common.py
+index 8bebed9..91ec743 100644
+--- a/lib/Crypto/SelfTest/Cipher/common.py
++++ b/lib/Crypto/SelfTest/Cipher/common.py
+@@ -239,19 +239,34 @@ class RoundtripTest(unittest.TestCase):
+ return """%s .decrypt() output of .encrypt() should not be garbled""" % (self.module_name,)
+
+ def runTest(self):
+- for mode in (self.module.MODE_ECB, self.module.MODE_CBC, self.module.MODE_CFB, self.module.MODE_OFB, self.module.MODE_OPENPGP):
++
++ ## ECB mode
++ mode = self.module.MODE_ECB
++ encryption_cipher = self.module.new(a2b_hex(self.key), mode)
++ ciphertext = encryption_cipher.encrypt(self.plaintext)
++ decryption_cipher = self.module.new(a2b_hex(self.key), mode)
++ decrypted_plaintext = decryption_cipher.decrypt(ciphertext)
++ self.assertEqual(self.plaintext, decrypted_plaintext)
++
++ ## OPENPGP mode
++ mode = self.module.MODE_OPENPGP
++ encryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv)
++ eiv_ciphertext = encryption_cipher.encrypt(self.plaintext)
++ eiv = eiv_ciphertext[:self.module.block_size+2]
++ ciphertext = eiv_ciphertext[self.module.block_size+2:]
++ decryption_cipher = self.module.new(a2b_hex(self.key), mode, eiv)
++ decrypted_plaintext = decryption_cipher.decrypt(ciphertext)
++ self.assertEqual(self.plaintext, decrypted_plaintext)
++
++ ## All other non-AEAD modes (but CTR)
++ for mode in (self.module.MODE_CBC, self.module.MODE_CFB, self.module.MODE_OFB):
+ encryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv)
+ ciphertext = encryption_cipher.encrypt(self.plaintext)
+-
+- if mode != self.module.MODE_OPENPGP:
+- decryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv)
+- else:
+- eiv = ciphertext[:self.module.block_size+2]
+- ciphertext = ciphertext[self.module.block_size+2:]
+- decryption_cipher = self.module.new(a2b_hex(self.key), mode, eiv)
++ decryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv)
+ decrypted_plaintext = decryption_cipher.decrypt(ciphertext)
+ self.assertEqual(self.plaintext, decrypted_plaintext)
+
++
+ class PGPTest(unittest.TestCase):
+ def __init__(self, module, params):
+ unittest.TestCase.__init__(self)
+diff --git a/src/block_template.c b/src/block_template.c
+index c36b316..8746948 100644
+--- a/src/block_template.c
++++ b/src/block_template.c
+@@ -170,6 +170,17 @@ ALGnew(PyObject *self, PyObject *args, PyObject *kwdict)
+ "Key cannot be the null string");
+ return NULL;
+ }
++ if (IVlen != 0 && mode == MODE_ECB)
++ {
++ PyErr_Format(PyExc_ValueError, "ECB mode does not use IV");
++ return NULL;
++ }
++ if (IVlen != 0 && mode == MODE_CTR)
++ {
++ PyErr_Format(PyExc_ValueError,
++ "CTR mode needs counter parameter, not IV");
++ return NULL;
++ }
+ if (IVlen != BLOCK_SIZE && mode != MODE_ECB && mode != MODE_CTR)
+ {
+ PyErr_Format(PyExc_ValueError,
+--
+2.7.4
+
diff --git a/external/meta-python2/recipes-devtools/python/python-pycrypto/cross-compiling.patch b/external/meta-python2/recipes-devtools/python/python-pycrypto/cross-compiling.patch
new file mode 100644
index 00000000..712f3e8d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pycrypto/cross-compiling.patch
@@ -0,0 +1,23 @@
+Index: pycrypto-2.6/setup.py
+===================================================================
+--- pycrypto-2.6.orig/setup.py
++++ pycrypto-2.6/setup.py
+@@ -271,7 +271,8 @@ class PCTBuildConfigure(Command):
+ if not os.path.exists("config.status"):
+ if os.system("chmod 0755 configure") != 0:
+ raise RuntimeError("chmod error")
+- cmd = "sh configure" # we use "sh" here so that it'll work on mingw32 with standard python.org binaries
++ host = os.environ.get("HOST_SYS")
++ cmd = "ac_cv_func_malloc_0_nonnull=yes sh configure --host " + host # we use "sh" here so that it'll work on mingw32 with standard python.org binaries
+ if self.verbose < 1:
+ cmd += " -q"
+ if os.system(cmd) != 0:
+@@ -370,7 +371,7 @@ kw = {'name':"pycrypto",
+ 'ext_modules': plat_ext + [
+ # _fastmath (uses GNU mp library)
+ Extension("Crypto.PublicKey._fastmath",
+- include_dirs=['src/','/usr/include/'],
++ include_dirs=['src/'],
+ libraries=['gmp'],
+ sources=["src/_fastmath.c"]),
+
diff --git a/external/meta-python2/recipes-devtools/python/python-pycrypto_2.6.1.bb b/external/meta-python2/recipes-devtools/python/python-pycrypto_2.6.1.bb
new file mode 100644
index 00000000..155027cd
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pycrypto_2.6.1.bb
@@ -0,0 +1,36 @@
+SUMMARY = "Cryptographic modules for Python."
+DESCRIPTION = "This is a collection of both secure hash functions (such as \
+SHA256 and RIPEMD160), and various encryption algorithms (AES, DES, RSA, \
+ElGamal, etc.). The package is structured to make adding new modules easy. \
+This section is essentially complete, and the software interface will almost \
+certainly not change in an incompatible way in the future; all that remains to \
+be done is to fix any bugs that show up."
+HOMEPAGE = "http://www.pycrypto.org/"
+LICENSE = "PSFv2"
+LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=35f354d199e8cb7667b059a23578e63d"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-pycrypto:"
+
+DEPENDS += " gmp"
+
+export HOST_SYS
+
+inherit autotools pypi autotools-brokensep distutils
+
+SRC_URI += "file://cross-compiling.patch \
+ file://CVE-2013-7459.patch \
+ "
+
+SRC_URI[md5sum] = "55a61a054aa66812daf5161a0d5d7eda"
+SRC_URI[sha256sum] = "f2ce1e989b272cfcb677616763e0a2e7ec659effa67a88aa92b3a65528f60a3c"
+
+do_compile[noexec] = "1"
+
+# We explicitly call distutils_do_install, since we want it to run, but
+# *don't* want the autotools install to run, since this package doesn't
+# provide a "make install" target.
+do_install() {
+ distutils_do_install
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pycryptodomex_3.9.4.bb b/external/meta-python2/recipes-devtools/python/python-pycryptodomex_3.9.4.bb
new file mode 100644
index 00000000..5201788d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pycryptodomex_3.9.4.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Cryptographic library for Python"
+DESCRIPTION = "PyCryptodome is a self-contained Python package of low-level\
+ cryptographic primitives."
+HOMEPAGE = "http://www.pycryptodome.org"
+LICENSE = "PD & BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=6dc0e2a13d2f25d6f123c434b761faba"
+
+SRC_URI[md5sum] = "46ba513d95b6e323734074d960a7d57b"
+SRC_URI[sha256sum] = "22d970cee5c096b9123415e183ae03702b2cd4d3ba3f0ced25c4e1aba3967167"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-math \
+"
+
+RDEPENDS_${PN}-tests += " \
+ ${PYTHON_PN}-unittest \
+"
+
+PACKAGES =+ "${PN}-tests"
+
+FILES_${PN}-tests += " \
+ ${PYTHON_SITEPACKAGES_DIR}/Crypto/SelfTest/ \
+ ${PYTHON_SITEPACKAGES_DIR}/Crypto/SelfTest/__pycache__/ \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pycurl_7.43.0.3.bb b/external/meta-python2/recipes-devtools/python/python-pycurl_7.43.0.3.bb
new file mode 100644
index 00000000..6d833cf0
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pycurl_7.43.0.3.bb
@@ -0,0 +1,27 @@
+
+SUMMARY = "A Python Interface To The cURL library"
+DESCRIPTION = "\
+PycURL is a Python interface to libcurl, the multiprotocol file \
+transfer library. Similarly to the urllib Python module, PycURL can \
+be used to fetch objects identified by a URL from a Python program \
+"
+SECTION = "devel/python"
+HOMEPAGE = "http://pycurl.io/"
+
+LICENSE = "LGPLv2 | MIT"
+LIC_FILES_CHKSUM = " \
+ file://COPYING-LGPL;md5=4fbd65380cdd255951079008b364516c \
+ file://COPYING-MIT;md5=2df767ed35d8ea83de4a93feb55e7815 \
+"
+
+SRC_URI[md5sum] = "f0ed4c805e8bec734990e2e0ee78568e"
+SRC_URI[sha256sum] = "6f08330c5cf79fa8ef68b9912b9901db7ffd34b63e225dce74db56bb21deda8e"
+
+inherit pypi setuptools
+
+PYPI_PACKAGE = "pycurl"
+
+DEPENDS = "\
+ curl \
+ ${PYTHON_PN}\
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-pydbus_0.6.0.bb b/external/meta-python2/recipes-devtools/python/python-pydbus_0.6.0.bb
new file mode 100644
index 00000000..bb848d7c
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pydbus_0.6.0.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Pythonic DBus library"
+DESCRIPTION = "Pythonic DBus library"
+HOMEPAGE = "https://pypi.python.org/pypi/pydbus/"
+LICENSE = "LGPLv2.1"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a916467b91076e631dd8edb7424769c7"
+
+SRC_URI[md5sum] = "c6abd44862322679bd4e907bebc3e0d0"
+SRC_URI[sha256sum] = "4207162eff54223822c185da06c1ba8a34137a9602f3da5a528eedf3f78d0f2c"
+
+S = "${WORKDIR}/pydbus-${PV}"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "${PYTHON_PN}-pygobject"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyelftools_0.25.bb b/external/meta-python2/recipes-devtools/python/python-pyelftools_0.25.bb
new file mode 100644
index 00000000..27846372
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyelftools_0.25.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Library for analyzing ELF files and DWARF debugging information"
+DESCRIPTION = "pyelftools is a pure-Python library for parsing and analyzing \
+ELF files and DWARF debugging information"
+HOMEPAGE = "https://github.com/eliben/pyelftools"
+SECTION = "devel/python"
+LICENSE = "PD"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5ce2a2b07fca326bc7c146d10105ccfc"
+
+SRC_URI[md5sum] = "c5629b9a5d19c82107a946cce52eeec2"
+SRC_URI[sha256sum] = "89c6da6f56280c37a5ff33468591ba9a124e17d71fe42de971818cbff46c1b24"
+
+PYPI_PACKAGE = "pyelftools"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyexpect_1.0.19.bb b/external/meta-python2/recipes-devtools/python/python-pyexpect_1.0.19.bb
new file mode 100644
index 00000000..d4547cf7
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyexpect_1.0.19.bb
@@ -0,0 +1,11 @@
+SUMMARY = "Python expectaton library"
+DESCRIPTION = "Minimal but very flexible implementation of the expect pattern"
+SECTION = "devel/python"
+HOMEPAGE = " https://bitbucket.org/dwt/pyexpect"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://README.md;md5=500b884e9dcd5f677a53cbbee8ace939"
+
+inherit pypi setuptools
+
+SRC_URI[md5sum] = "dc744289858001925c75d21e26f1260f"
+SRC_URI[sha256sum] = "bff4654b113dac6c2231e486e11dcb23281ddc0742a5404467303fe7638829ef"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyfirmata_1.1.0.bb b/external/meta-python2/recipes-devtools/python/python-pyfirmata_1.1.0.bb
new file mode 100644
index 00000000..c43127ab
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyfirmata_1.1.0.bb
@@ -0,0 +1,14 @@
+
+SUMMARY = "A Python interface for the Firmata protocol"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=84ddcef430b7c44caa22b2ff4b37a3df"
+PYPI_PACKAGE = "pyFirmata"
+
+RDEPENDS_${PN} = "\
+ ${PYTHON_PN}-pyserial \
+"
+
+SRC_URI[md5sum] = "159673cfb56c72ceafc30fe91eedd847"
+SRC_URI[sha256sum] = "cc180d1b30c85a2bbca62c15fef1b871db048cdcfa80959968356d97bd3ff08e"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-pyflakes_2.1.1.bb b/external/meta-python2/recipes-devtools/python/python-pyflakes_2.1.1.bb
new file mode 100644
index 00000000..1c03f399
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyflakes_2.1.1.bb
@@ -0,0 +1,16 @@
+SUMMARY = "passive checker of Python programs"
+HOMEPAGE = "https://github.com/dreamhost/cliff"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://README.rst;md5=5127315117a8561a1504343d59620647"
+
+SRC_URI[md5sum] = "a0f71a15724e553c46e03ba5ed56703c"
+SRC_URI[sha256sum] = "d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-prettytable \
+ ${PYTHON_PN}-cmd2 \
+ ${PYTHON_PN}-pyparsing"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyflame_1.6.7.bb b/external/meta-python2/recipes-devtools/python/python-pyflame_1.6.7.bb
new file mode 100644
index 00000000..ad8003ff
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyflame_1.6.7.bb
@@ -0,0 +1,30 @@
+SUMMARY = "Pyflame: A Ptracing Profiler For Python"
+DESCRIPTION = "Pyflame is a high performance profiling tool that generates \
+flame graphs for Python. Pyflame is implemented in C++, and uses the Linux \
+ptrace(2) system call to collect profiling information. It can take snapshots \
+of the Python call stack without explicit instrumentation, meaning you can \
+profile a program without modifying its source code. Pyflame is capable of \
+profiling embedded Python interpreters like uWSGI. It fully supports profiling \
+multi-threaded Python programs."
+HOMEPAGE = "https://github.com/uber/pyflame"
+SECTION = "devel/python"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=2ee41112a44fe7014dce33e26468ba93"
+
+SRC_URI = "git://github.com/uber/pyflame.git;protocol=https;nobranch=1"
+# v1.6.7
+SRCREV = "c151d2f34737f28a1f5266a003b2b0720bbd9f96"
+
+DEPENDS = "python"
+
+S = "${WORKDIR}/git"
+
+inherit pkgconfig autotools
+
+COMPATIBLE_HOST_libc-musl_class-target = "null"
+COMPATIBLE_HOST_mipsarch_class-target = "null"
+COMPATIBLE_HOST_aarch64_class-target = "null"
+COMPATIBLE_HOST_powerpc_class-target = "null"
+COMPATIBLE_HOST_riscv64_class-target = "null"
+COMPATIBLE_HOST_riscv32_class-target = "null"
diff --git a/external/meta-python2/recipes-devtools/python/python-pygobject/0001-python-pyobject-fix-install-dir.patch b/external/meta-python2/recipes-devtools/python/python-pygobject/0001-python-pyobject-fix-install-dir.patch
new file mode 100644
index 00000000..848cda5a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pygobject/0001-python-pyobject-fix-install-dir.patch
@@ -0,0 +1,121 @@
+From 8b4648d5bc50cb1c14961ed38bf97d5a693f5237 Mon Sep 17 00:00:00 2001
+From: Changqing Li <changqing.li@windriver.com>
+Date: Mon, 24 Jun 2019 14:51:52 +0800
+Subject: [PATCH] python-pyobject: fix the wrong install dir for python2
+
+* after upgrade to 3.32.1, pygobject switch to build with meson, and
+ default python option is python3, switch to python2
+
+* default install dir get by python.install_sources and
+python.get_install_dir is get from python's sysconfig info,
+not like python3, for python2, the install dir include the basedir of
+recipe-sysroot-native, add stagedir option for user to config
+correct install dir.
+
+Upstream-Status: Inappropriate [oe-specific]
+
+Signed-off-by: Changqing Li <changqing.li@windriver.com>
+---
+ gi/meson.build | 7 +++----
+ gi/overrides/meson.build | 4 ++--
+ gi/repository/meson.build | 4 ++--
+ meson.build | 4 +++-
+ meson_options.txt | 1 +
+ pygtkcompat/meson.build | 4 ++--
+ 6 files changed, 13 insertions(+), 11 deletions(-)
+
+diff --git a/gi/meson.build b/gi/meson.build
+index c1afd68..249c23d 100644
+--- a/gi/meson.build
++++ b/gi/meson.build
+@@ -60,9 +60,8 @@ python_sources = [
+ 'types.py',
+ ]
+
+-python.install_sources(python_sources,
+- pure : false,
+- subdir : 'gi'
++install_data(python_sources,
++ install_dir: join_paths(stagedir, 'gi')
+ )
+
+ # https://github.com/mesonbuild/meson/issues/4117
+@@ -76,7 +75,7 @@ giext = python.extension_module('_gi', sources,
+ dependencies : [python_ext_dep, glib_dep, gi_dep, ffi_dep],
+ include_directories: include_directories('..'),
+ install: true,
+- subdir : 'gi',
++ install_dir: join_paths(stagedir, 'gi'),
+ c_args: pyext_c_args + main_c_args
+ )
+
+diff --git a/gi/overrides/meson.build b/gi/overrides/meson.build
+index 6ff073f..964fef1 100644
+--- a/gi/overrides/meson.build
++++ b/gi/overrides/meson.build
+@@ -10,6 +10,6 @@ python_sources = [
+ 'keysyms.py',
+ '__init__.py']
+
+-python.install_sources(python_sources,
+- subdir : join_paths('gi', 'overrides')
++install_data(python_sources,
++ install_dir: join_paths(stagedir, 'gi', 'overrides')
+ )
+diff --git a/gi/repository/meson.build b/gi/repository/meson.build
+index fdc136b..fc88adf 100644
+--- a/gi/repository/meson.build
++++ b/gi/repository/meson.build
+@@ -1,5 +1,5 @@
+ python_sources = ['__init__.py']
+
+-python.install_sources(python_sources,
+- subdir : join_paths('gi', 'repository')
++install_data(python_sources,
++ install_dir: join_paths(stagedir, 'gi', 'repository')
+ )
+diff --git a/meson.build b/meson.build
+index d27a005..ecd55d5 100644
+--- a/meson.build
++++ b/meson.build
+@@ -165,12 +165,14 @@ else
+ py_version = pygobject_version
+ endif
+
++stagedir = get_option('stagedir')
++
+ pkginfo_conf = configuration_data()
+ pkginfo_conf.set('VERSION', py_version)
+ configure_file(input : 'PKG-INFO.in',
+ output : 'PyGObject-@0@.egg-info'.format(py_version),
+ configuration : pkginfo_conf,
+- install_dir : python.get_install_dir(pure : false))
++ install_dir : stagedir)
+
+ subdir('gi')
+ subdir('pygtkcompat')
+diff --git a/meson_options.txt b/meson_options.txt
+index 5dd4cbc..21def16 100644
+--- a/meson_options.txt
++++ b/meson_options.txt
+@@ -1,3 +1,4 @@
+ option('python', type : 'string', value : 'python3')
+ option('pycairo', type : 'boolean', value : true, description : 'build with pycairo integration')
+ option('tests', type : 'boolean', value : true, description : 'build unit tests')
++option('stagedir', type : 'string', value : '')
+diff --git a/pygtkcompat/meson.build b/pygtkcompat/meson.build
+index 9e43c44..ef3322d 100644
+--- a/pygtkcompat/meson.build
++++ b/pygtkcompat/meson.build
+@@ -3,6 +3,6 @@ python_sources = [
+ 'generictreemodel.py',
+ 'pygtkcompat.py']
+
+-python.install_sources(python_sources,
+- subdir : 'pygtkcompat'
++install_data(python_sources,
++ install_dir: join_paths(stagedir, 'pygtkcompat')
+ )
+--
+2.7.4
+
diff --git a/external/meta-python2/recipes-devtools/python/python-pygobject_3.34.0.bb b/external/meta-python2/recipes-devtools/python/python-pygobject_3.34.0.bb
new file mode 100644
index 00000000..2fd0b513
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pygobject_3.34.0.bb
@@ -0,0 +1,40 @@
+SUMMARY = "Python GObject bindings"
+HOMEPAGE = "http://www.pygtk.org/"
+SECTION = "devel/python"
+LICENSE = "LGPLv2.1"
+LIC_FILES_CHKSUM = "file://COPYING;md5=a916467b91076e631dd8edb7424769c7"
+
+GNOMEBASEBUILDCLASS = "meson"
+inherit gnomebase gobject-introspection distutils-base upstream-version-is-even
+
+DEPENDS += "python glib-2.0"
+
+SRCNAME = "pygobject"
+SRC_URI = " \
+ http://ftp.gnome.org/pub/GNOME/sources/${SRCNAME}/${@gnome_verdir("${PV}")}/${SRCNAME}-${PV}.tar.xz \
+ file://0001-python-pyobject-fix-install-dir.patch \
+"
+
+SRC_URI[md5sum] = "ca1dc4f31c1d6d283758e8f315a88ab6"
+SRC_URI[sha256sum] = "87e2c9aa785f352ef111dcc5f63df9b85cf6e05e52ff04f803ffbebdacf5271a"
+
+S = "${WORKDIR}/${SRCNAME}-${PV}"
+
+UNKNOWN_CONFIGURE_WHITELIST = "introspection"
+
+EXTRA_OEMESON_append = " -Dpython=python2"
+
+PACKAGECONFIG ??= "stagedir"
+
+PACKAGECONFIG[cairo] = "-Dpycairo=true,-Dpycairo=false, cairo python-pycairo, python-pycairo"
+PACKAGECONFIG[tests] = "-Dtests=true, -Dtests=false, , "
+PACKAGECONFIG[stagedir] = "-Dstagedir=${PYTHON_SITEPACKAGES_DIR}, -Dstagedir="", , "
+
+BBCLASSEXTEND = "native"
+RDEPENDS_${PN} = "python-io python-pkgutil"
+RDEPENDS_${PN}_class-native = ""
+
+do_install_append() {
+ # Remove files that clash with python3-pygobject; their content is same
+ rm -r ${D}${includedir}/pygobject-3.0/pygobject.h ${D}${libdir}/pkgconfig
+}
diff --git a/external/meta-python2/recipes-devtools/python/python-pygpgme/0001-reflect-2.1-reporting-for-key-imports.patch b/external/meta-python2/recipes-devtools/python/python-pygpgme/0001-reflect-2.1-reporting-for-key-imports.patch
new file mode 100644
index 00000000..1f31cb80
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pygpgme/0001-reflect-2.1-reporting-for-key-imports.patch
@@ -0,0 +1,90 @@
+From ed44474c11f577c1644910964a917a4cf701bb0f Mon Sep 17 00:00:00 2001
+From: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+Date: Tue, 26 Jan 2016 14:24:26 -0500
+Subject: [PATCH] reflect 2.1 reporting for key imports
+
+GnuPG 2.1 changes how it reports key imports. These changes should
+make the pygpgme test suite compatible with GnuPG 2.1.
+
+See also:
+https://lists.gnupg.org/pipermail/gnupg-devel/2016-January/030718.html
+
+Upstream-Status: Backport
+
+Signed-off-by: Catalin Enache <catalin.enache@windriver.com>
+
+---
+ tests/test_import.py | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+diff --git a/tests/test_import.py b/tests/test_import.py
+index 10eb816..597eb47 100644
+--- a/tests/test_import.py
++++ b/tests/test_import.py
+@@ -55,7 +55,7 @@ class ImportTestCase(GpgHomeTestCase):
+ ctx = gpgme.Context()
+ with self.keyfile('key1.sec') as fp:
+ result = ctx.import_(fp)
+- self.assertEqual(result.considered, 1)
++ self.assertEqual(result.considered, 3)
+ self.assertEqual(result.no_user_id, 0)
+ self.assertEqual(result.imported, 1)
+ self.assertEqual(result.imported_rsa, 0)
+@@ -64,18 +64,18 @@ class ImportTestCase(GpgHomeTestCase):
+ self.assertEqual(result.new_sub_keys, 0)
+ self.assertEqual(result.new_signatures, 0)
+ self.assertEqual(result.new_revocations, 0)
+- self.assertEqual(result.secret_read, 1)
+- self.assertEqual(result.secret_imported, 1)
++ self.assertEqual(result.secret_read, 3)
++ self.assertEqual(result.secret_imported, 2)
+ self.assertEqual(result.secret_unchanged, 0)
+ self.assertEqual(result.skipped_new_keys, 0)
+ self.assertEqual(result.not_imported, 0)
+ self.assertEqual(len(result.imports), 2)
+ self.assertEqual(result.imports[0],
+ ('E79A842DA34A1CA383F64A1546BB55F0885C65A4',
+- None, gpgme.IMPORT_NEW | gpgme.IMPORT_SECRET))
++ None, gpgme.IMPORT_NEW))
+ self.assertEqual(result.imports[1],
+ ('E79A842DA34A1CA383F64A1546BB55F0885C65A4',
+- None, gpgme.IMPORT_NEW))
++ None, gpgme.IMPORT_NEW | gpgme.IMPORT_SECRET))
+ # can we get the public key?
+ key = ctx.get_key('E79A842DA34A1CA383F64A1546BB55F0885C65A4')
+ # can we get the secret key?
+@@ -102,17 +102,17 @@ class ImportTestCase(GpgHomeTestCase):
+ fp = BytesIO(b'\n'.join(keys))
+ ctx = gpgme.Context()
+ result = ctx.import_(fp)
+- self.assertEqual(result.considered, 3)
++ self.assertEqual(result.considered, 5)
+ self.assertEqual(result.no_user_id, 0)
+ self.assertEqual(result.imported, 2)
+- self.assertEqual(result.imported_rsa, 1)
++ self.assertEqual(result.imported_rsa, 0)
+ self.assertEqual(result.unchanged, 0)
+ self.assertEqual(result.new_user_ids, 0)
+ self.assertEqual(result.new_sub_keys, 0)
+ self.assertEqual(result.new_signatures, 1)
+ self.assertEqual(result.new_revocations, 0)
+- self.assertEqual(result.secret_read, 1)
+- self.assertEqual(result.secret_imported, 1)
++ self.assertEqual(result.secret_read, 3)
++ self.assertEqual(result.secret_imported, 2)
+ self.assertEqual(result.secret_unchanged, 0)
+ self.assertEqual(result.skipped_new_keys, 0)
+ self.assertEqual(result.not_imported, 0)
+@@ -122,10 +122,10 @@ class ImportTestCase(GpgHomeTestCase):
+ None, gpgme.IMPORT_NEW))
+ self.assertEqual(result.imports[1],
+ ('E79A842DA34A1CA383F64A1546BB55F0885C65A4',
+- None, gpgme.IMPORT_NEW | gpgme.IMPORT_SECRET))
++ None, gpgme.IMPORT_SIG))
+ self.assertEqual(result.imports[2],
+ ('E79A842DA34A1CA383F64A1546BB55F0885C65A4',
+- None, gpgme.IMPORT_SIG))
++ None, gpgme.IMPORT_NEW | gpgme.IMPORT_SECRET))
+ self.assertEqual(result.imports[3],
+ ('93C2240D6B8AA10AB28F701D2CF46B7FC97E6B0F',
+ None, gpgme.IMPORT_NEW))
diff --git a/external/meta-python2/recipes-devtools/python/python-pygpgme/0002-passphrase_cb-is-deprecated.patch b/external/meta-python2/recipes-devtools/python/python-pygpgme/0002-passphrase_cb-is-deprecated.patch
new file mode 100644
index 00000000..c18cf3fe
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pygpgme/0002-passphrase_cb-is-deprecated.patch
@@ -0,0 +1,52 @@
+From ba0dc8273e4f83bcd2d43baa5910aae34b93048c Mon Sep 17 00:00:00 2001
+From: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+Date: Mon, 1 Feb 2016 19:25:12 -0500
+Subject: [PATCH] passphrase_cb is deprecated
+
+https://bugs.gnupg.org/gnupg/issue767 indicates that
+gpgme_set_passphrase_cb is a deprecated corner of the API and that
+developers using gpgme should really rely on the gpg-agent to handle
+this stuff. This should actually simplify things for most
+installations -- just strip out all passphrase handling from your
+application entirely, relying on gpg to figure out how to find the
+agent, and relying on the agent figuring out how to prompt the user
+(if necessary).
+
+However, if a developer really wants to use the passphrase callback
+approach, they'll have to use loopback pinentry. This sets up the
+test suite to be able to make those tests.
+
+Upstream-Status: Backport
+
+Signed-off-by: Catalin Enache <catalin.enache@windriver.com>
+
+---
+ tests/util.py | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/tests/util.py b/tests/util.py
+index cd803c2..86892ca 100644
+--- a/tests/util.py
++++ b/tests/util.py
+@@ -28,7 +28,9 @@ keydir = os.path.join(os.path.dirname(__file__), 'keys')
+
+ class GpgHomeTestCase(unittest.TestCase):
+
+- gpg_conf_contents = ''
++ gpg_conf_contents = 'pinentry-mode loopback'
++ gpg_agent_conf_contents = 'allow-loopback-pinentry'
++
+ import_keys = []
+
+ def keyfile(self, key):
+@@ -41,6 +43,10 @@ class GpgHomeTestCase(unittest.TestCase):
+ fp.write(self.gpg_conf_contents.encode('UTF-8'))
+ fp.close()
+
++ fp = open(os.path.join(self._gpghome, 'gpg-agent.conf'), 'wb')
++ fp.write(self.gpg_agent_conf_contents.encode('UTF-8'))
++ fp.close()
++
+ # import requested keys into the keyring
+ ctx = gpgme.Context()
+ for key in self.import_keys:
diff --git a/external/meta-python2/recipes-devtools/python/python-pygpgme/0003-handle-generic-error-when-no-passphrase-callback-pre.patch b/external/meta-python2/recipes-devtools/python/python-pygpgme/0003-handle-generic-error-when-no-passphrase-callback-pre.patch
new file mode 100644
index 00000000..6acb68bf
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pygpgme/0003-handle-generic-error-when-no-passphrase-callback-pre.patch
@@ -0,0 +1,30 @@
+From 579b5930e15de8855bf63b3c20b6c3aaf894c3eb Mon Sep 17 00:00:00 2001
+From: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+Date: Mon, 1 Feb 2016 19:27:59 -0500
+Subject: [PATCH] handle generic error when no passphrase callback present
+
+apparently gpg 2.1 returns ERR_GENERAL right now if the pinentry was
+in loopback mode and no passphrase callback was supplied. Earlier
+versions supplied ERR_BAD_PASSPHRASE.
+
+Upstream-Status: Backport
+
+Signed-off-by: Catalin Enache <catalin.enache@windriver.com>
+
+---
+ tests/test_passphrase.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tests/test_passphrase.py b/tests/test_passphrase.py
+index 0a235e9..35b3c59 100644
+--- a/tests/test_passphrase.py
++++ b/tests/test_passphrase.py
+@@ -41,7 +41,7 @@ class PassphraseTestCase(GpgHomeTestCase):
+ new_sigs = ctx.sign(plaintext, signature, gpgme.SIG_MODE_CLEAR)
+ except gpgme.GpgmeError as exc:
+ self.assertEqual(exc.args[0], gpgme.ERR_SOURCE_GPGME)
+- self.assertEqual(exc.args[1], gpgme.ERR_BAD_PASSPHRASE)
++ self.assertEqual(exc.args[1], gpgme.ERR_GENERAL)
+ else:
+ self.fail('gpgme.GpgmeError not raised')
+
diff --git a/external/meta-python2/recipes-devtools/python/python-pygpgme/run-ptest b/external/meta-python2/recipes-devtools/python/python-pygpgme/run-ptest
new file mode 100644
index 00000000..ce2abb66
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pygpgme/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+GPG_AGENT_INFO= python test_all.py -v 2>&1 | sed -e '/\.\.\. ok/ s/^/PASS: /g' -e '/\.\.\. [ERROR|FAIL]/ s/^/FAIL: /g' -e '/\.\.\. skipped/ s/^/SKIP: /g' -e 's/ \.\.\. ok//g' -e 's/ \.\.\. ERROR//g' -e 's/ \.\.\. FAIL//g' -e 's/ \.\.\. skipped//g'
diff --git a/external/meta-python2/recipes-devtools/python/python-pygpgme_0.3.bb b/external/meta-python2/recipes-devtools/python/python-pygpgme_0.3.bb
new file mode 100644
index 00000000..14e967db
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pygpgme_0.3.bb
@@ -0,0 +1,26 @@
+SUMMARY = "A Python module for working with OpenPGP messages"
+DESCRIPTION = "PyGPGME is a Python module that lets you sign, verify, \
+ encrypt and decrypt messages using the OpenPGP format."
+HOMEPAGE = "https://launchpad.net/pygpgme"
+
+LICENSE = "LGPL-2.1"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=6517bdc8f2416f27ab725d4702f7aac3"
+
+SRC_URI = "file://run-ptest \
+ file://0001-reflect-2.1-reporting-for-key-imports.patch \
+ file://0002-passphrase_cb-is-deprecated.patch \
+ file://0003-handle-generic-error-when-no-passphrase-callback-pre.patch \
+"
+
+SRC_URI[md5sum] = "d38355af73f0352cde3d410b25f34fd0"
+SRC_URI[sha256sum] = "5fd887c407015296a8fd3f4b867fe0fcca3179de97ccde90449853a3dfb802e1"
+
+DEPENDS += "gpgme"
+RDEPENDS_${PN} += "gnupg"
+
+inherit pypi setuptools ptest
+
+do_install_ptest(){
+ install ${S}/test_all.py ${D}${PTEST_PATH}
+ cp -r ${S}/tests ${D}${PTEST_PATH}
+}
diff --git a/external/meta-python2/recipes-devtools/python/python-pyhamcrest_1.9.0.bb b/external/meta-python2/recipes-devtools/python/python-pyhamcrest_1.9.0.bb
new file mode 100644
index 00000000..8dbb79a4
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyhamcrest_1.9.0.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Hamcrest framework for matcher objects"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=f6df1318c6071dd1707f5e3b6c11f24f"
+
+PYPI_PACKAGE = "PyHamcrest"
+
+SRC_URI[md5sum] = "8b833a3fa30197455df79424f30c8c3f"
+SRC_URI[sha256sum] = "8ffaa0a53da57e89de14ced7185ac746227a8894dbd5a3c718bf05ddbd1d56cd"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-pyiface_0.0.11.bb b/external/meta-python2/recipes-devtools/python/python-pyiface_0.0.11.bb
new file mode 100644
index 00000000..a5486f22
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyiface_0.0.11.bb
@@ -0,0 +1,11 @@
+SUMMARY = "Pyiface is a package that exposes the network interfaces of the operating system in a easy to use and transparent way"
+SECTION = "devel/python"
+HOMEPAGE = "https://pypi.python.org/pypi/pyiface/"
+LICENSE = "GPLv3+"
+
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4fe869ee987a340198fb0d54c55c47f1"
+
+SRC_URI[md5sum] = "b066aa984656742738127c9c75436ab4"
+SRC_URI[sha256sum] = "e231e5735d329c5b2d4fc8854f069fdaa5436d3ef91ed64ee49e41e3f5e8a3f5"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-pyinotify_0.9.6.bb b/external/meta-python2/recipes-devtools/python/python-pyinotify_0.9.6.bb
new file mode 100644
index 00000000..4be1c4c4
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyinotify_0.9.6.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Python pyinotify: Linux filesystem events monitoring"
+DESCRIPTION = "Python pyinotify: Linux filesystem events monitoring"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://COPYING;md5=ab173cade7965b411528464589a08382"
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-misc \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-smtpd \
+ ${PYTHON_PN}-subprocess \
+"
+
+SRC_URI[md5sum] = "8e580fa1ff3971f94a6f81672b76c406"
+SRC_URI[sha256sum] = "9c998a5d7606ca835065cdabc013ae6c66eb9ea76a00a1e3bc6e0cfe2b4f71f4"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-pyjks_19.0.0.bb b/external/meta-python2/recipes-devtools/python/python-pyjks_19.0.0.bb
new file mode 100644
index 00000000..c2dccd9a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyjks_19.0.0.bb
@@ -0,0 +1,23 @@
+
+SUMMARY = "Pure-Python Java Keystore (JKS) library"
+DESCRIPTION = "PyJKS enables Python projects to load and manipulate\
+ Java KeyStore (JKS) data without a JVM dependency. PyJKS supports JKS,\
+ JCEKS, BKS and UBER (BouncyCastle) keystores."
+HOMEPAGE = "http://github.com/kurtbrose/pyjks"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=9694d6cc724caf7f7386be88a4a81958"
+
+SRC_URI[md5sum] = "b6e8f3b91be355d15e3ba99de2cccf9b"
+SRC_URI[sha256sum] = "9ce5b40289bcdffcd6a8e7118b333ba8ba2ec4c9ebc5e324885cc8a69767011a"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "\
+ ${PYTHON_PN}-javaobj-py3 \
+ ${PYTHON_PN}-pyasn1 \
+ ${PYTHON_PN}-pyasn1-modules \
+ ${PYTHON_PN}-pycryptodomex \
+ ${PYTHON_PN}-twofish\
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyjwt_1.7.1.bb b/external/meta-python2/recipes-devtools/python/python-pyjwt_1.7.1.bb
new file mode 100644
index 00000000..9d27cb78
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyjwt_1.7.1.bb
@@ -0,0 +1,17 @@
+
+SUMMARY = "JSON Web Token implementation in Python"
+DESCRIPTION = "A Python implementation of JSON Web Token draft 32.\
+ Original implementation was written by https://github.com/progrium"
+HOMEPAGE = "http://github.com/jpadilla/pyjwt"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=68626705a7b513ca8d5f44a3e200ed0c"
+
+SRC_URI[md5sum] = "a4712f980c008696e13e09504120b2a0"
+SRC_URI[sha256sum] = "8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"
+
+PYPI_PACKAGE = "PyJWT"
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "${PYTHON_PN}-cryptography"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pylint_1.8.3.bb b/external/meta-python2/recipes-devtools/python/python-pylint_1.8.3.bb
new file mode 100644
index 00000000..223a5b02
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pylint_1.8.3.bb
@@ -0,0 +1,39 @@
+SUMMARY="Pylint is a Python source code analyzer"
+HOMEPAGE= "http://www.pylint.org/"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://COPYING;md5=4325afd396febcb659c36b49533135d4"
+
+SRC_URI[md5sum] = "2eb5f3cb8fe567eaf5420dd415012202"
+SRC_URI[sha256sum] = "c77311859e0c2d7932095f30d2b1bfdc4b6fe111f534450ba727a52eae330ef2"
+
+inherit pypi setuptools python-dir
+
+DEPENDS += "${PYTHON_PN}-pytest-runner-native"
+
+do_install_append(){
+ rm ${D}${bindir}/pylint
+ cat >> ${D}${bindir}/pylint <<EOF
+#!/usr/bin/env ${PYTHON_PN}
+from pylint import run_pylint
+run_pylint()
+EOF
+ chmod 755 ${D}${bindir}/pylint
+ sed -i -e 's:^#!/usr/bin/python:#!/usr/bin/env\ ${PYTHON_PN}:g' ${D}/${PYTHON_SITEPACKAGES_DIR}/pylint/test/data/ascript
+}
+
+PACKAGES =+ "${PN}-tests"
+FILES_${PN}-tests+= " \
+ ${PYTHON_SITEPACKAGES_DIR}/pylint/test/ \
+ ${PYTHON_SITEPACKAGES_DIR}/pylint/testutils.py \
+"
+
+RDEPENDS_${PN} += "${PYTHON_PN}-astroid \
+ ${PYTHON_PN}-backports-functools-lru-cache \
+ ${PYTHON_PN}-isort \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-pkgutil \
+ ${PYTHON_PN}-difflib \
+ ${PYTHON_PN}-netserver \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-pymisp_2.4.119.1.bb b/external/meta-python2/recipes-devtools/python/python-pymisp_2.4.119.1.bb
new file mode 100644
index 00000000..627716b5
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pymisp_2.4.119.1.bb
@@ -0,0 +1,27 @@
+SUMMARY = "Python API for MISP"
+DESCRIPTION = "PyMISP is a Python library to access MISP platforms via their \
+REST API. \
+\
+PyMISP allows you to fetch events, add or update events/attributes, add or \
+update samples or search for attributes."
+HOMEPAGE = "https://github.com/MISP/PyMISP"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a3639cf5780f71b125d3e9d1dc127c20"
+
+SRC_URI[md5sum] = "57184785340e25469e4a80ff9ddce09e"
+SRC_URI[sha256sum] = "594ea0a9e150052232425009eac6dd104a80f494d0e273cc48dd114d7ea8482b"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_append_class-target = " \
+ ${PYTHON_PN}-dateutil \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-jsonschema \
+"
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-cachetools \
+ ${PYTHON_PN}-deprecated \
+ ${PYTHON_PN}-requests \
+ ${PYTHON_PN}-six \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-pymongo_3.10.1.bb b/external/meta-python2/recipes-devtools/python/python-pymongo_3.10.1.bb
new file mode 100644
index 00000000..3a173207
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pymongo_3.10.1.bb
@@ -0,0 +1,31 @@
+SUMMARY = "Python driver for MongoDB <http://www.mongodb.org>"
+DESCRIPTION = "\
+The PyMongo distribution contains tools for interacting with MongoDB \
+database from Python. The bson package is an implementation of the BSON \
+format for Python. The pymongo package is a native Python driver for \
+MongoDB. The gridfs package is a gridfs implementation on top of pymongo."
+HOMEPAGE = "http://github.com/mongodb/mongo-python-driver"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
+
+SRC_URI[md5sum] = "e31b9c0190c9eaf1f792d0277b2a8ebe"
+SRC_URI[sha256sum] = "993257f6ca3cde55332af1f62af3e04ca89ce63c08b56a387cdd46136c72f2fa"
+
+inherit pypi setuptools
+
+PACKAGES =+ "${PYTHON_PN}-bson"
+
+FILES_${PYTHON_PN}-bson = "${PYTHON_SITEPACKAGES_DIR}/bson/*"
+
+RDEPENDS_${PYTHON_PN}-bson += " \
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-threading \
+"
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-bson \
+ ${PYTHON_PN}-pprint \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-pymysql_0.9.3.bb b/external/meta-python2/recipes-devtools/python/python-pymysql_0.9.3.bb
new file mode 100644
index 00000000..df879136
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pymysql_0.9.3.bb
@@ -0,0 +1,19 @@
+
+SUMMARY = "A pure-Python MySQL client library"
+DESCRIPTION = " \
+ This package contains a pure-Python MySQL client library, based on PEP 249 \
+ Most public APIs are compatible with mysqlclient and MySQLdb. \
+ "
+SECTION = "devel/python"
+HOMEPAGE = "https://pymysql.readthedocs.io"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=528175c84163bb800d23ad835c7fa0fc"
+
+SRC_URI[md5sum] = "e5d9183cc0a775ac29f9e0365cca6556"
+SRC_URI[sha256sum] = "d8c059dcd81dedb85a9f034d5e22dcb4442c0b201908bede99e306d65ea7c8e7"
+
+inherit pypi setuptools
+
+PYPI_PACKAGE = "PyMySQL"
+
+RDEPENDS_${PN} += "${PYTHON_PN}-cryptography"
diff --git a/external/meta-python2/recipes-devtools/python/python-pynetlinux_1.1.bb b/external/meta-python2/recipes-devtools/python/python-pynetlinux_1.1.bb
new file mode 100644
index 00000000..313e2c70
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pynetlinux_1.1.bb
@@ -0,0 +1,12 @@
+
+SUMMARY = "Linux network configuration library for Python"
+DESCRIPTION = "This library contains Python bindings to ioctl calls"
+SECTION = "devel/python"
+HOMEPAGE = "http://github.com/rlisagor/pynetlinux"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=74e1861736ee959824fe7542323c12e9"
+
+inherit pypi setuptools
+
+SRC_URI[md5sum] = "3336e5d4a478acca4e35bf3125b4f883"
+SRC_URI[sha256sum] = "4ad08298c9f5ba15a11cddc639ba8778cabdfc402b51066d9e0a325e5a5b391c"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyopenssl_19.1.0.bb b/external/meta-python2/recipes-devtools/python/python-pyopenssl_19.1.0.bb
new file mode 100644
index 00000000..634c2764
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyopenssl_19.1.0.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Simple Python wrapper around the OpenSSL library"
+HOMEPAGE = "https://pyopenssl.org/"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+DEPENDS += "openssl ${PYTHON_PN}-cryptography"
+
+SRC_URI[md5sum] = "d9804fedbd1eb0c7d9243397b1fbf972"
+SRC_URI[sha256sum] = "9a24494b2602aaf402be5c9e30a0b82d4a5c67528fe8fb475e3f3bc00dd69507"
+
+PYPI_PACKAGE = "pyOpenSSL"
+
+inherit pypi setuptools
+
+PACKAGES =+ "${PN}-tests"
+FILES_${PN}-tests = "${libdir}/${PYTHON_DIR}/site-packages/OpenSSL/test"
+
+RDEPENDS_${PN}_class-target = " \
+ ${PYTHON_PN}-cryptography \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-threading \
+"
+RDEPENDS_${PN}-tests = "${PN}"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyparsing_2.4.6.bb b/external/meta-python2/recipes-devtools/python/python-pyparsing_2.4.6.bb
new file mode 100644
index 00000000..dcf224cb
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyparsing_2.4.6.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Python parsing module"
+HOMEPAGE = "http://pyparsing.wikispaces.com/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=657a566233888513e1f07ba13e2f47f1"
+
+SRC_URI[md5sum] = "29733ea8cbee0291aad121c69c6e51a1"
+SRC_URI[sha256sum] = "4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-debugger \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-pprint \
+ ${PYTHON_PN}-stringold \
+ ${PYTHON_PN}-threading \
+"
+
+BBCLASSEXTEND = "native nativesdk"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-pyperclip_1.7.0.bb b/external/meta-python2/recipes-devtools/python/python-pyperclip_1.7.0.bb
new file mode 100644
index 00000000..0df824bb
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyperclip_1.7.0.bb
@@ -0,0 +1,19 @@
+SUMMARY = "A cross-platform clipboard module for Python."
+DESCRIPTION = "Pyperclip is a cross-platform Python module for copy and paste \
+clipboard functions (only handles plain text for now)."
+LICENSE = "BSD"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=a428356ada7737b416ec4b63dc65d581"
+
+SRC_URI[md5sum] = "6bbb8598579cc3ee50554b4c59d0cfae"
+SRC_URI[sha256sum] = "979325468ccf682104d5dcaf753f869868100631301d3e72f47babdea5700d1c"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-ctypes \
+ ${PYTHON_PN}-contextlib \
+ ${PYTHON_PN}-subprocess \
+"
+
+BBCLASSEXTEND = "native nativesdk"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-pyperf_1.7.0.bb b/external/meta-python2/recipes-devtools/python/python-pyperf_1.7.0.bb
new file mode 100644
index 00000000..e722b08d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyperf_1.7.0.bb
@@ -0,0 +1,34 @@
+SUMMARY = "A toolkit to write, run and analyze benchmarks"
+DESCRIPTION = " \
+The Python pyperf module is a toolkit to write, run and analyze benchmarks. \
+Features: \
+ * Simple API to run reliable benchmarks \
+ * Automatically calibrate a benchmark for a time budget. \
+ * Spawn multiple worker processes. \
+ * Compute the mean and standard deviation. \
+ * Detect if a benchmark result seems unstable. \
+ * JSON format to store benchmark results. \
+ * Support multiple units: seconds, bytes and integer. \
+"
+HOMEPAGE = "https://github.com/vstinner/pyperf"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://COPYING;md5=78bc2e6e87c8c61272937b879e6dc2f8"
+
+SRC_URI[md5sum] = "e30b67b62a4e30e4504352d0778c622c"
+SRC_URI[sha256sum] = "0d214aa65e085d3e4108a36152cb12f7cd0f4e7fda93b5134b43a9687c975786"
+
+inherit pypi setuptools
+
+PYPI_PACKAGE = "pyperf"
+
+DEPENDS += "${PYTHON_PN}-six-native"
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-contextlib \
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-fcntl \
+ ${PYTHON_PN}-math \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-statistics \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyrex-native_0.9.9.bb b/external/meta-python2/recipes-devtools/python/python-pyrex-native_0.9.9.bb
new file mode 100644
index 00000000..e8ef1aa1
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyrex-native_0.9.9.bb
@@ -0,0 +1,5 @@
+require python-pyrex_${PV}.bb
+inherit native pythonnative
+DEPENDS = "python-native"
+RDEPENDS_${PN} = ""
+PR = "r3"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyrex/pyrex-fix-optimized-mode.patch b/external/meta-python2/recipes-devtools/python/python-pyrex/pyrex-fix-optimized-mode.patch
new file mode 100644
index 00000000..c58c3280
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyrex/pyrex-fix-optimized-mode.patch
@@ -0,0 +1,15 @@
+Upstream-Status: Pending
+
+Index: Pyrex-0.9.8.4/Pyrex/Distutils/extension.py
+===================================================================
+--- Pyrex-0.9.8.4.orig/Pyrex/Distutils/extension.py
++++ Pyrex-0.9.8.4/Pyrex/Distutils/extension.py
+@@ -15,7 +15,7 @@ except ImportError:
+ warnings = None
+
+ class Extension(_Extension.Extension):
+- _Extension.Extension.__doc__ + \
++ _Extension.Extension.__doc__ or "" + \
+ """pyrex_include_dirs : [string]
+ list of directories to search for Pyrex header files (.pxd) (in
+ Unix form for portability)
diff --git a/external/meta-python2/recipes-devtools/python/python-pyrex_0.9.9.bb b/external/meta-python2/recipes-devtools/python/python-pyrex_0.9.9.bb
new file mode 100644
index 00000000..c4dd2e69
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyrex_0.9.9.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Language for writing Python extension modules"
+DESCRIPTION = "Pyrex is a language specially designed for writing Python extension modules. \
+It's designed to bridge the gap between the nice, high-level, easy-to-use world of Python \
+and the messy, low-level world of C."
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=771d472f53f933033f57eeee7808e5bd"
+SRCNAME = "Pyrex"
+PR = "r4"
+
+SRC_URI = "\
+ http://www.cosc.canterbury.ac.nz/greg.ewing/python/${SRCNAME}/${SRCNAME}-${PV}.tar.gz \
+ file://pyrex-fix-optimized-mode.patch \
+"
+
+SRC_URI[md5sum] = "515dee67d15d4393841e2d60e8341947"
+SRC_URI[sha256sum] = "5f87df06831d0b3412eb4bc9d3fc2ee7bfae1b913d7da8c23ab2bf5699fb6b50"
+S = "${WORKDIR}/${SRCNAME}-${PV}"
+
+inherit distutils
+
+FILES_${PN} += "${datadir}${base_libdir}/${PYTHON_DIR}/site-packages/Pyrex/Compiler/Lexicon.pickle"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyroute2_0.5.7.bb b/external/meta-python2/recipes-devtools/python/python-pyroute2_0.5.7.bb
new file mode 100644
index 00000000..4ad9746b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyroute2_0.5.7.bb
@@ -0,0 +1,26 @@
+SUMMARY = "A pure Python netlink and Linux network configuration library"
+LICENSE = "GPLv2 & Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.GPL.v2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
+ file://LICENSE.Apache.v2;md5=34281e312165f843a2b7d1f114fe65ce"
+
+SRC_URI[md5sum] = "371683b62314211b8bc9807ac8ef1144"
+SRC_URI[sha256sum] = "963fce07da2841456d39e3b932b071f6de28d23dadfae014022d67a752916f98"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-pyroute2:"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-ctypes \
+ ${PYTHON_PN}-distutils \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-multiprocessing \
+ ${PYTHON_PN}-pickle \
+ ${PYTHON_PN}-pkgutil \
+ ${PYTHON_PN}-pprint \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-unixadmin \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyrsistent_0.15.7.bb b/external/meta-python2/recipes-devtools/python/python-pyrsistent_0.15.7.bb
new file mode 100644
index 00000000..970e51b0
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyrsistent_0.15.7.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Persistent/Immutable/Functional data structures for Python"
+HOMEPAGE = "https://github.com/tobgu/pyrsistent"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENCE.mit;md5=ca574f2891cf528b3e7a2ee570337e7c"
+
+SRC_URI[md5sum] = "da9486d00ef5b213f40d5cf3c5bca82d"
+SRC_URI[sha256sum] = "cdc7b5e3ed77bed61270a47d35434a30617b9becdf2478af76ad2c6ade307280"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-six \
+"
+
+RDEPENDS_${PN}_append_class-target = "\
+ ${PYTHON_PN}-numbers \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyrtm_0.4.2.bb b/external/meta-python2/recipes-devtools/python/python-pyrtm_0.4.2.bb
new file mode 100644
index 00000000..69580cbc
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyrtm_0.4.2.bb
@@ -0,0 +1,39 @@
+SUMMARY = "Python interface for Remember The Milk API"
+AUTHOR = "Sridhar Ratnakumar / srid"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=a53cbc7cb75660694e138ba973c148df"
+
+PYPI_PACKAGE_EXT = "tar.bz2"
+
+SRC_URI[md5sum] = "7c87da94656b620dfe532ca63d642eb8"
+SRC_URI[sha256sum] = "b2d701b25ad3f9a1542057f3eb492c5c1d7dbe2b8d1e8f763043dcc14ee1d933"
+
+inherit pypi setuptools
+
+PACKAGES =+ "${PN}-tests ${PN}-samples"
+
+FILES_${PN}-samples += " \
+ ${PYTHON_SITEPACKAGES_DIR}/rtm/samples \
+"
+
+FILES_${PN}-tests += " \
+ ${PYTHON_SITEPACKAGES_DIR}/rtm/tests \
+"
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-netclient \
+"
+
+RDEPENDS_${PN}-samples += " \
+ ${PN} \
+"
+
+RDEPENDS_${PN}-tests += " \
+ ${PN} \
+ ${PYTHON_PN}-unittest \
+"
+
+# meta-python recipe did not follow Debian naming
+PROVIDES += "pyrtm"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyserial_3.4.bb b/external/meta-python2/recipes-devtools/python/python-pyserial_3.4.bb
new file mode 100644
index 00000000..998839dd
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyserial_3.4.bb
@@ -0,0 +1,45 @@
+SUMMARY = "Serial Port Support for Python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=d476d94926db6e0008a5b3860d1f5c0d"
+
+SRC_URI[md5sum] = "ed6183b15519a0ae96675e9c3330c69b"
+SRC_URI[sha256sum] = "6e2d401fdee0eab996cf734e67773a0143b932772ca8b42451440cfed942c627"
+
+inherit pypi setuptools
+
+PACKAGES =+ "${PN}-java ${PN}-osx ${PN}-win32 ${PN}-tools"
+
+FILES_${PN}-java = " \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/*java* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/__pycache__/*java* \
+"
+
+FILES_${PN}-osx = " \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/*osx* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/__pycache__/*osx* \
+"
+
+FILES_${PN}-win32 = " \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/*serialcli* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/__pycache__/*serialcli* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/*win32* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/__pycache__/*win32* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/miniterm* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/__pycache__/miniterm* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/*windows* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/__pycache__/*windows* \
+"
+
+RDEPENDS_${PN} = "\
+ ${PYTHON_PN}-argparse \
+ ${PYTHON_PN}-fcntl \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-stringold \
+ ${PYTHON_PN}-threading \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pysmi_0.3.4.bb b/external/meta-python2/recipes-devtools/python/python-pysmi_0.3.4.bb
new file mode 100644
index 00000000..43aa4b84
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pysmi_0.3.4.bb
@@ -0,0 +1,16 @@
+SUMMARY = "SNMP SMI/MIB Parser"
+DESCRIPTION = "A pure-Python implementation of SNMP/SMI MIB \
+ parsing and conversion library. Can produce PySNMP MIB modules. \
+"
+HOMEPAGE = "https://pypi.python.org/pypi/pysmi"
+SECTION = "devel/python"
+
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=a088b5c72b59d51a5368ad3b18e219bf"
+
+SRC_URI[md5sum] = "10a9dd140ad512eed9f37344df83ce9d"
+SRC_URI[sha256sum] = "bd15a15020aee8376cab5be264c26330824a8b8164ed0195bd402dd59e4e8f7c"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "python-ply"
diff --git a/external/meta-python2/recipes-devtools/python/python-pysnmp_4.4.9.bb b/external/meta-python2/recipes-devtools/python/python-pysnmp_4.4.9.bb
new file mode 100644
index 00000000..2d989911
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pysnmp_4.4.9.bb
@@ -0,0 +1,26 @@
+SUMMARY = "A pure-Python SNMPv1/v2c/v3 library"
+DESCRIPTION = "SNMP v1/v2c/v3 engine and apps written in pure-Python. \
+ Supports Manager/Agent/Proxy roles, scriptable MIBs, asynchronous \
+ operation (asyncio, twisted, asyncore) and multiple transports.\
+"
+HOMEPAGE = "https://pypi.python.org/pypi/pysnmp"
+SECTION = "devel/python"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=b15d29f500f748d1c2a15709769090a8"
+
+SRCNAME = "pysnmp"
+
+SRC_URI = "https://files.pythonhosted.org/packages/source/p/${SRCNAME}/${SRCNAME}-${PV}.tar.gz"
+
+SRC_URI[md5sum] = "6d1b514997326bed18f1ae1510f6b1c9"
+SRC_URI[sha256sum] = "d5d1e59780126e963dd92e25993b783295734e71bef181f602e51f7393260441"
+
+
+S = "${WORKDIR}/${SRCNAME}-${PV}"
+
+inherit setuptools
+
+RDEPENDS_${PN} += "python-pycryptodomex \
+ python-pyasn1 \
+ python-pysmi \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-pysocks_1.7.1.bb b/external/meta-python2/recipes-devtools/python/python-pysocks_1.7.1.bb
new file mode 100644
index 00000000..2ef23149
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pysocks_1.7.1.bb
@@ -0,0 +1,22 @@
+SUMMARY = "A Python SOCKS client module"
+DESCRIPTION = "PySocks lets you send traffic through SOCKS and HTTP proxy \
+servers. It is a modern fork of SocksiPy with bug fixes and extra features."
+HOMEPAGE = "https://github.com/Anorov/PySocks"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=1d457bcffb9661b45f799d4efee72f16"
+
+SRC_URI[md5sum] = "89b1a6865c61bae67a32417517612ee6"
+SRC_URI[sha256sum] = "3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"
+
+PYPI_PACKAGE = "PySocks"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target += "\
+ ${PYTHON_PN}-email \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-shell \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pysqlite_2.8.3.bb b/external/meta-python2/recipes-devtools/python/python-pysqlite_2.8.3.bb
new file mode 100644
index 00000000..ec8cec42
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pysqlite_2.8.3.bb
@@ -0,0 +1,21 @@
+SUMMARY = "DB-API 2.0 interface for SQLite 3.x"
+DESCRIPTION = "pysqlite is an interface to the SQLite 3.x embedded relational \
+database engine. It is almost fully compliant with the Python database API \
+version 2.0 also exposes the unique features of SQLite."
+HOMEPAGE = "http://github.com/ghaering/pysqlite"
+LICENSE = "Zlib"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=28ad4f115e06c88bd737372a453369d8"
+
+SRC_URI[md5sum] = "033f17b8644577715aee55e8832ac9fc"
+SRC_URI[sha256sum] = "17d3335863e8cf8392eea71add33dab3f96d060666fe68ab7382469d307f4490"
+
+inherit pypi setuptools
+
+DEPENDS += "${PYTHON_PN}-pip"
+
+RDEPENDS_${PN}_class-target += "\
+ ${PYTHON_PN}-datetime \
+ sqlite3 \
+"
+
+FILES_${PN}-doc += "${datadir}"
diff --git a/external/meta-python2/recipes-devtools/python/python-pystache_0.5.4.bb b/external/meta-python2/recipes-devtools/python/python-pystache_0.5.4.bb
new file mode 100644
index 00000000..4f9129ae
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pystache_0.5.4.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Python implementation of Mustache"
+HOMEPAGE = "https://github.com/defunkt/pystache"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=eb4417802c56384aac71b34505528a60"
+
+SRC_URI[md5sum] = "485885e67a0f6411d5252e69b20a35ca"
+SRC_URI[sha256sum] = "f7bbc265fb957b4d6c7c042b336563179444ab313fb93a719759111eabd3b85a"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-netserver \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pytest-helpers-namespace_2019.1.8.bb b/external/meta-python2/recipes-devtools/python/python-pytest-helpers-namespace_2019.1.8.bb
new file mode 100644
index 00000000..5d8ee05f
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pytest-helpers-namespace_2019.1.8.bb
@@ -0,0 +1,15 @@
+SUMMARY = "PyTest Helpers Namespace"
+DESCRIPTION = "This plugin does not provide any helpers to pytest, it does, however, provide a helpers namespace in pytest which enables you to register helper functions in your conftest.py to be used within your tests without having to import them."
+HOMEPAGE = "https://github.com/saltstack/pytest-helpers-namespace"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=cc99508c43d9d14fd51c7fac622ffd23"
+
+SRC_URI[md5sum] = "04ec1d8750f9b154e782a47cf8b30736"
+SRC_URI[sha256sum] = "4eff23a19f92410c0166f6dffbfa8901d3e14a80e97d70cd08428b6d597771ce"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ python-pytest \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-pytest-runner_5.2.bb b/external/meta-python2/recipes-devtools/python/python-pytest-runner_5.2.bb
new file mode 100644
index 00000000..55fda2f0
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pytest-runner_5.2.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Invoke py.test as distutils command with dependency resolution"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a33f38bbf47d48c70fe0d40e5f77498e"
+
+SRC_URI[md5sum] = "e5f66b8e8e87f62c59631c35c919d321"
+SRC_URI[sha256sum] = "96c7e73ead7b93e388c5d614770d2bae6526efd997757d3543fe17b557a0942b"
+
+inherit pypi setuptools
+
+DEPENDS += " \
+ ${PYTHON_PN}-setuptools-scm-native"
+
+RDEPENDS_${PN} = "${PYTHON_PN}-py ${PYTHON_PN}-setuptools ${PYTHON_PN}-debugger ${PYTHON_PN}-json \
+ ${PYTHON_PN}-io"
+
+# Dependency only exists for python2
+RDEPENDS_${PN} += "python-argparse python-compiler"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pytest-tempdir_2019.10.12.bb b/external/meta-python2/recipes-devtools/python/python-pytest-tempdir_2019.10.12.bb
new file mode 100644
index 00000000..4e8489de
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pytest-tempdir_2019.10.12.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Adds support for a predictable and repeatable temporary directory."
+DESCRIPTION = "Adds support for a predictable and repeatable temporary \
+directory through the tempdir fixture which gets cleaned up in the end of the \
+test run session(this behaviour can be disabled)."
+HOMEPAGE = "https://github.com/saltstack/pytest-tempdir"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=9872c3a37cc9baf79a464cd168282be5"
+
+SRC_URI[md5sum] = "79b997d418fb85c2529ab50cd4333689"
+SRC_URI[sha256sum] = "e7d91813a9aa991db87dacdef8cfd3f1657632d731d56d06238c5ffb63ab36d8"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ python-pytest \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-pytest/0001-setup.py-remove-setup_requires-for-setuptools-scm.patch b/external/meta-python2/recipes-devtools/python/python-pytest/0001-setup.py-remove-setup_requires-for-setuptools-scm.patch
new file mode 100644
index 00000000..53e7dea3
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pytest/0001-setup.py-remove-setup_requires-for-setuptools-scm.patch
@@ -0,0 +1,31 @@
+From fd66df54245e9e67f4d9e96337658ddc707f5ad0 Mon Sep 17 00:00:00 2001
+From: Tim Orling <ticotimo@gmail.com>
+Date: Sat, 30 Nov 2019 18:39:15 -0800
+Subject: [PATCH] setup.py: remove setup_requires for setuptools-scm
+
+The setup_requires argument forces the download of the egg file for setuptools-scm
+during the do_compile phase. This download is incompatible with the typical fetch
+and mirror structure. The only usage of scm is the generation of the _version.py
+file and in the release tarball it is already correctly created
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Derek Straka <derek@asterius.io>
+Signed-off-by: Tim Orling <ticotimo@gmail.com>
+---
+ setup.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index 491a6f5..c6af9e2 100644
+--- a/setup.py
++++ b/setup.py
+@@ -23,7 +23,7 @@ INSTALL_REQUIRES = [
+ def main():
+ setup(
+ use_scm_version={"write_to": "src/_pytest/_version.py"},
+- setup_requires=["setuptools-scm", "setuptools>=40.0"],
++ setup_requires=["setuptools>=40.0"],
+ package_dir={"": "src"},
+ # fmt: off
+ extras_require={
diff --git a/external/meta-python2/recipes-devtools/python/python-pytest/pytest_version_fix.patch b/external/meta-python2/recipes-devtools/python/python-pytest/pytest_version_fix.patch
new file mode 100644
index 00000000..b373d93e
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pytest/pytest_version_fix.patch
@@ -0,0 +1,51 @@
+Upstream-Status: Inappropriate (OE specific)
+
+python-pytest: remove fetch during do_compile phase
+commit: c974fbf9ebf185552ab65301e07af44f36517abf
+
+introduced an issue by making the version 0.0.0
+this fixes that
+
+Signed-off-by: Armin Kuster <akuster@mvista.com>
+
+Index: pytest-3.2.2/setup.py
+===================================================================
+--- pytest-3.2.2.orig/setup.py
++++ pytest-3.2.2/setup.py
+@@ -1,5 +1,6 @@
+ import os
+ import sys
++import re
+ import setuptools
+ import pkg_resources
+ from setuptools import setup, Command
+@@ -22,6 +23,18 @@ classifiers = [
+ with open('README.rst') as fd:
+ long_description = fd.read()
+
++def read(*names, **kwargs):
++ with open(os.path.join( *names), 'r') as fp:
++ return fp.read()
++
++def find_version(*file_paths):
++ version_file = read(*file_paths)
++ version_match = re.search(r"^version = ['\']([^'\"]*)['\']",
++ version_file, re.M)
++
++ if version_match:
++ return version_match.group(1)
++ raise RuntimeError("Unable to find version string.")
+
+ def get_environment_marker_support_level():
+ """
+@@ -59,9 +72,7 @@ def main():
+ name='pytest',
+ description='pytest: simple powerful testing with Python',
+ long_description=long_description,
+- use_scm_version={
+- 'write_to': '_pytest/_version.py',
+- },
++ version=find_version("_pytest", "_version.py"),
+ url='http://pytest.org',
+ license='MIT license',
+ platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],
diff --git a/external/meta-python2/recipes-devtools/python/python-pytest_4.6.9.bb b/external/meta-python2/recipes-devtools/python/python-pytest_4.6.9.bb
new file mode 100644
index 00000000..c1cf0ac3
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pytest_4.6.9.bb
@@ -0,0 +1,50 @@
+SUMMARY = "Simple powerful teting with python"
+HOMEPAGE = "http://pytest.org"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=81eb9f71d006c6b268cf4388e3c98f7b"
+
+SRC_URI += " file://0001-setup.py-remove-setup_requires-for-setuptools-scm.patch"
+
+SRC_URI[md5sum] = "d0457c5ddd0438e3b68b7939339d915f"
+SRC_URI[sha256sum] = "19e8f75eac01dd3f211edd465b39efbcbdc8fc5f7866d7dd49fedb30d8adf339"
+
+inherit update-alternatives pypi setuptools
+
+RDEPENDS_${PN}_class-target += " \
+ ${PYTHON_PN}-argparse \
+ ${PYTHON_PN}-atomicwrites \
+ ${PYTHON_PN}-attrs \
+ ${PYTHON_PN}-compiler \
+ ${PYTHON_PN}-debugger \
+ ${PYTHON_PN}-doctest \
+ ${PYTHON_PN}-funcsigs \
+ ${PYTHON_PN}-importlib-metadata \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-more-itertools \
+ ${PYTHON_PN}-packaging \
+ ${PYTHON_PN}-pathlib2 \
+ ${PYTHON_PN}-pluggy \
+ ${PYTHON_PN}-py \
+ ${PYTHON_PN}-setuptools \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-wcwidth \
+"
+
+RDEPENDS_${PN}-ptest += "\
+ ${PYTHON_PN}-hypothesis \
+"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-pytest:"
+
+ALTERNATIVE_${PN} += "py.test pytest"
+
+NATIVE_LINK_NAME[pytest] = "${bindir}/pytest"
+ALTERNATIVE_TARGET[pytest] = "${bindir}/pytest"
+
+ALTERNATIVE_LINK_NAME[py.test] = "${bindir}/py.test"
+ALTERNATIVE_TARGET[py.test] = "${bindir}/py.test"
+
+ALTERNATIVE_PRIORITY = "10"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pytoml_0.1.21.bb b/external/meta-python2/recipes-devtools/python/python-pytoml_0.1.21.bb
new file mode 100644
index 00000000..3dcd46c6
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pytoml_0.1.21.bb
@@ -0,0 +1,15 @@
+SUMMARY = "A TOML-0.4.0 parser/writer for Python"
+HOMEPAGE = "https://pypi.python.org/pypi/pytoml/"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=cfff423699bdaef24331933ac4f56078"
+
+SRC_URI[md5sum] = "e59dd36a559dd2a876e4c149c69e947b"
+SRC_URI[sha256sum] = "8eecf7c8d0adcff3b375b09fe403407aa9b645c499e5ab8cac670ac4a35f61e7"
+
+inherit pypi
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pytz_2019.3.bb b/external/meta-python2/recipes-devtools/python/python-pytz_2019.3.bb
new file mode 100755
index 00000000..68473332
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pytz_2019.3.bb
@@ -0,0 +1,20 @@
+SUMMARY = "World timezone definitions, modern and historical"
+HOMEPAGE = "http://pythonhosted.org/pytz"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4878a915709225bceab739bdc2a18e8d"
+
+inherit pypi setuptools
+
+SRC_URI[md5sum] = "c3d84a465fc56a4edd52cca8873ac0df"
+SRC_URI[sha256sum] = "b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"
+
+RDEPENDS_${PN}_class-target += "\
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-doctest \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-pickle \
+ ${PYTHON_PN}-pprint \
+ ${PYTHON_PN}-threading \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyudev_0.21.0.bb b/external/meta-python2/recipes-devtools/python/python-pyudev_0.21.0.bb
new file mode 100644
index 00000000..8db82def
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyudev_0.21.0.bb
@@ -0,0 +1,25 @@
+
+SUMMARY = "A libudev binding"
+LICENSE = "LGPLv2.1+"
+LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343"
+
+SRC_URI[md5sum] = "cf4d9db7d772622144ca1be6b5d9353b"
+SRC_URI[sha256sum] = "094b7a100150114748aaa3b70663485dd360457a709bfaaafe5a977371033f2b"
+
+inherit pypi setuptools
+
+do_configure_prepend() {
+ sed -i "/import pyudev/d" ${S}/setup.py
+ sed -i "s/str(pyudev.__version__)/'${PV}'/g" ${S}/setup.py
+}
+
+RDEPENDS_${PN} = "\
+ ${PYTHON_PN}-contextlib \
+ ${PYTHON_PN}-ctypes \
+ ${PYTHON_PN}-misc \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-threading \
+ libudev \
+"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-pyusb_1.0.2.bb b/external/meta-python2/recipes-devtools/python/python-pyusb_1.0.2.bb
new file mode 100644
index 00000000..683dcefa
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyusb_1.0.2.bb
@@ -0,0 +1,13 @@
+SUMMARY = "PyUSB provides USB access on the Python language"
+HOMEPAGE = "http://pyusb.sourceforge.net/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=51691ed11cc2c7ae93e383f60ed49b0f"
+DEPENDS += "libusb1"
+
+SRC_URI[md5sum] = "862b56452c64948c787ad8ef9498590b"
+SRC_URI[sha256sum] = "4e9b72cc4a4205ca64fbf1f3fff39a335512166c151ad103e55c8223ac147362"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-pyyaml_5.3.bb b/external/meta-python2/recipes-devtools/python/python-pyyaml_5.3.bb
new file mode 100644
index 00000000..9b26c621
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyyaml_5.3.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Python support for YAML"
+HOMEPAGE = "http://www.pyyaml.org"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a76b4c69bfcf82313bbdc0393b04438a"
+DEPENDS = "libyaml ${PYTHON_PN}-cython-native ${PYTHON_PN}"
+
+PYPI_PACKAGE = "PyYAML"
+
+inherit pypi setuptools
+
+SRC_URI[md5sum] = "adbb0d336b509d6472d3b095a0f1cf30"
+SRC_URI[sha256sum] = "e9f45bd5b92c7974e59bcd2dcc8631a6b6cc380a904725fce7bc08872e691615"
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-datetime \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-pyzmq/club-rpath-out.patch b/external/meta-python2/recipes-devtools/python/python-pyzmq/club-rpath-out.patch
new file mode 100644
index 00000000..936f1658
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyzmq/club-rpath-out.patch
@@ -0,0 +1,13 @@
+diff --git a/setup.py b/setup.py
+index d243eaa..98099bc 100755
+--- a/setup.py
++++ b/setup.py
+@@ -192,8 +192,6 @@ def _add_rpath(settings, path):
+ """
+ if sys.platform == 'darwin':
+ settings['extra_link_args'].extend(['-Wl,-rpath','-Wl,%s' % path])
+- else:
+- settings['runtime_library_dirs'].append(path)
+
+ def settings_from_prefix(prefix=None, bundle_libzmq_dylib=False):
+ """load appropriate library/include settings from ZMQ prefix"""
diff --git a/external/meta-python2/recipes-devtools/python/python-pyzmq_17.1.0.bb b/external/meta-python2/recipes-devtools/python/python-pyzmq_17.1.0.bb
new file mode 100644
index 00000000..d635f4e8
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-pyzmq_17.1.0.bb
@@ -0,0 +1,27 @@
+SUMMARY = "Pyzmq provides Zero message queue access for the Python language"
+HOMEPAGE = "http://zeromq.org/bindings:python"
+LICENSE = "BSD & LGPL-3.0"
+LIC_FILES_CHKSUM = "file://COPYING.BSD;md5=11c65680f637c3df7f58bbc8d133e96e \
+ file://COPYING.LESSER;md5=12c592fa0bcfff3fb0977b066e9cb69e"
+DEPENDS = "zeromq"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-pyzmq:"
+
+SRC_URI += "file://club-rpath-out.patch"
+SRC_URI[md5sum] = "aecdfc328193fbd81f6dc23228319943"
+SRC_URI[sha256sum] = "2199f753a230e26aec5238b0518b036780708a4c887d4944519681a920b9dee4"
+
+inherit pypi pkgconfig setuptools
+
+RDEPENDS_${PN} += "${PYTHON_PN}-multiprocessing"
+
+FILES_${PN}-dbg =+ "${PYTHON_SITEPACKAGES_DIR}/zmq/backend/cython/.debug"
+
+do_compile_prepend() {
+ echo [global] > ${S}/setup.cfg
+ echo zmq_prefix = ${STAGING_DIR_HOST} >> ${S}/setup.cfg
+ echo have_sys_un_h = True >> ${S}/setup.cfg
+ echo skip_check_zmq = True >> ${S}/setup.cfg
+ echo libzmq_extension = False >> ${S}/setup.cfg
+ echo no_libzmq_extension = True >> ${S}/setup.cfg
+}
diff --git a/external/meta-python2/recipes-devtools/python/python-rdflib_4.2.2.bb b/external/meta-python2/recipes-devtools/python/python-rdflib_4.2.2.bb
new file mode 100644
index 00000000..7814f0c9
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-rdflib_4.2.2.bb
@@ -0,0 +1,15 @@
+SUMMARY = "RDFLib is a pure Python package for working with RDF"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=68c1a3bb687bd63b8e5552f3ea249840"
+
+SRC_URI[md5sum] = "534fe35b13c5857d53fa1ac5a41eca67"
+SRC_URI[sha256sum] = "da1df14552555c5c7715d8ce71c08f404c988c58a1ecd38552d0da4fc261280d"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-isodate \
+ ${PYTHON_PN}-pyparsing \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-redis_2.10.6.bb b/external/meta-python2/recipes-devtools/python/python-redis_2.10.6.bb
new file mode 100644
index 00000000..4b6ff938
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-redis_2.10.6.bb
@@ -0,0 +1,15 @@
+
+SUMMARY = "Python client for Redis key-value store"
+DESCRIPTION = "The Python interface to the Redis key-value store."
+HOMEPAGE = "http://github.com/andymccurdy/redis-py"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=51d9ad56299ab60ba7be65a621004f27"
+
+SRC_URI[md5sum] = "048348d8cfe0b5d0bba2f4d835005c3b"
+SRC_URI[sha256sum] = "a22ca993cea2962dbb588f9f30d0015ac4afcc45bee27d3978c0dbe9e97c6c0f"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-datetime \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-requests-oauthlib_1.3.0.bb b/external/meta-python2/recipes-devtools/python/python-requests-oauthlib_1.3.0.bb
new file mode 100644
index 00000000..0d4b4b96
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-requests-oauthlib_1.3.0.bb
@@ -0,0 +1,12 @@
+SUMMARY = "OAuthlib authentication support for Requests"
+HOMEPAGE = "https://github.com/requests/requests-oauthlib"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=22d117a849df10d047ed9b792838e863"
+
+SRC_URI[md5sum] = "1ebcd55f1b1b9281940b4bc33010e2ba"
+SRC_URI[sha256sum] = "b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "${PYTHON_PN}-requests"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-requests_2.23.0.bb b/external/meta-python2/recipes-devtools/python/python-requests_2.23.0.bb
new file mode 100644
index 00000000..52df65ce
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-requests_2.23.0.bb
@@ -0,0 +1,34 @@
+SUMMARY = "Python HTTP for Humans."
+DESCRIPTION = "Requests allows you to send HTTP/1.1 requests extremely easily. \
+There’s no need to manually add query strings to your URLs, or to form-encode \
+your POST data. Keep-alive and HTTP connection pooling are 100% automatic, \
+thanks to urllib3."
+HOMEPAGE = "http://python-requests.org"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=19b6be66ed463d93fa88c29f7860bcd7"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-requests:"
+
+SRC_URI[md5sum] = "abfdc28db1065bbd0bc32592ac9d27a6"
+SRC_URI[sha256sum] = "b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-chardet \
+ ${PYTHON_PN}-email \
+ ${PYTHON_PN}-idna \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-ndg-httpsclient \
+ ${PYTHON_PN}-netserver \
+ ${PYTHON_PN}-pyasn1 \
+ ${PYTHON_PN}-pyopenssl \
+ ${PYTHON_PN}-pysocks \
+ ${PYTHON_PN}-urllib3 \
+ ${PYTHON_PN}-zlib \
+"
+
+CVE_PRODUCT = "requests"
+
+BBCLASSEXTEND = "native nativesdk"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-rfc3339-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch b/external/meta-python2/recipes-devtools/python/python-rfc3339-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch
new file mode 100644
index 00000000..ce8ca0bc
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-rfc3339-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch
@@ -0,0 +1,32 @@
+From 2de281fdca88f223ace1eb6428a77b9903c69264 Mon Sep 17 00:00:00 2001
+From: Nicola Lunghi <nicola.lunghi@jci.com>
+Date: Thu, 14 Nov 2019 11:58:28 +0000
+Subject: [PATCH] setup.py: move pytest-runner to test_requirements
+
+This fixes an issue with yocto build.
+pytest-runner is only needed when running tests.
+
+Upstream-Status: Pending
+---
+ setup.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index 9a50767..e3b1c6e 100644
+--- a/setup.py
++++ b/setup.py
+@@ -12,9 +12,9 @@ requirements = [
+ 'six',
+ ]
+
+-setup_requirements = ['pytest-runner', ]
++setup_requirements = []
+
+-test_requirements = ['pytest>=3', ]
++test_requirements = ['pytest>=3', 'pytest-runner']
+
+ setup(
+ author="Nicolas Aimetti",
+--
+2.20.1
+
diff --git a/external/meta-python2/recipes-devtools/python/python-rfc3339-validator_0.1.1.bb b/external/meta-python2/recipes-devtools/python/python-rfc3339-validator_0.1.1.bb
new file mode 100644
index 00000000..b94146c4
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-rfc3339-validator_0.1.1.bb
@@ -0,0 +1,25 @@
+SUMMARY = "A pure python RFC3339 validator"
+HOMEPAGE = "https://github.com/naimetti/rfc3339-validator"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a21b13b5a996f08f7e0b088aa38ce9c6"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-rfc3339-validator:"
+
+SRC_URI[md5sum] = "9d8899041d83f98180bddd8b62ee7e99"
+SRC_URI[sha256sum] = "20a600d01fbb1f793cbb6f4ec4ebb2104f4c9e80d74d5f78350b63ecc6cccd08"
+
+PYPI_PACKAGE = "rfc3339_validator"
+
+inherit pypi setuptools
+
+SRC_URI_append = " \
+ file://0001-setup.py-move-pytest-runner-to-test_requirements.patch \
+"
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-core \
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-six \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-rfc3986-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch b/external/meta-python2/recipes-devtools/python/python-rfc3986-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch
new file mode 100644
index 00000000..8a646874
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-rfc3986-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch
@@ -0,0 +1,32 @@
+From 3531ff73631a0d59234eb4713e7b3a7f5ea57bbb Mon Sep 17 00:00:00 2001
+From: Nicola Lunghi <nicola.lunghi@jci.com>
+Date: Thu, 14 Nov 2019 12:17:51 +0000
+Subject: [PATCH] setup.py: move pytest-runner to test_requirements
+
+This fixes an issue with yocto build.
+pytest-runner is only needed when running tests.
+
+Upstream-Status: Pending
+---
+ setup.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index 53ebea7..ebb0de2 100644
+--- a/setup.py
++++ b/setup.py
+@@ -10,9 +10,9 @@ with open('README.md') as readme_file:
+
+ requirements = []
+
+-setup_requirements = ['pytest-runner', ]
++setup_requirements = []
+
+-test_requirements = ['pytest>=3', ]
++test_requirements = ['pytest>=3', 'pytest-runner']
+
+ setup(
+ author="Nicolas Aimetti",
+--
+2.20.1
+
diff --git a/external/meta-python2/recipes-devtools/python/python-rfc3986-validator_0.1.1.bb b/external/meta-python2/recipes-devtools/python/python-rfc3986-validator_0.1.1.bb
new file mode 100644
index 00000000..db28e4ff
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-rfc3986-validator_0.1.1.bb
@@ -0,0 +1,23 @@
+SUMMARY = "Pure python rfc3986 validator"
+HOMEPAGE = "https://github.com/naimetti/rfc3986-validator"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a21b13b5a996f08f7e0b088aa38ce9c6"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-rfc3986-validator:"
+
+SRC_URI[md5sum] = "47f7657b790aaf6011a1ab3d86c6be95"
+SRC_URI[sha256sum] = "3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"
+
+PYPI_PACKAGE = "rfc3986_validator"
+
+inherit pypi setuptools
+
+SRC_URI_append = " \
+ file://0001-setup.py-move-pytest-runner-to-test_requirements.patch \
+"
+
+RDEPENDS_${PN} += "\
+ python-core \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-rfc3987_1.3.8.bb b/external/meta-python2/recipes-devtools/python/python-rfc3987_1.3.8.bb
new file mode 100644
index 00000000..89cf3008
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-rfc3987_1.3.8.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Parsing and validation of URIs (RFC 3986) and IRIs (RFC 3987)"
+LICENSE = "GPLv3+"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=9;md5=2b723edf67b2f3088bc5e339b1ceda2d"
+
+SRC_URI[md5sum] = "b6c4028acdc788a9ba697e1c1d6b896c"
+SRC_URI[sha256sum] = "d3c4d257a560d544e9826b38bc81db676890c79ab9d7ac92b39c7a253d5ca733"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-robotframework-seriallibrary_0.3.1.bb b/external/meta-python2/recipes-devtools/python/python-robotframework-seriallibrary_0.3.1.bb
new file mode 100644
index 00000000..48ceb899
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-robotframework-seriallibrary_0.3.1.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Robot Framework test library for serial connection"
+HOMEPAGE = "https://github.com/whosaysni/robotframework-seriallibrary"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=7145f7cdd263359b62d342a02f005515"
+
+SRC_URI[md5sum] = "b7c9565d54c30df7cd3f3c0e29adffa3"
+SRC_URI[sha256sum] = "256ad60fc0b7df4be44d82c302f5ed8fad4935cda99e4b45942e3c88179d1e19"
+
+PYPI_PACKAGE = "robotframework-seriallibrary"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-pyserial \
+ ${PYTHON_PN}-robotframework \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-robotframework_3.0.4.bb b/external/meta-python2/recipes-devtools/python/python-robotframework_3.0.4.bb
new file mode 100644
index 00000000..d694279b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-robotframework_3.0.4.bb
@@ -0,0 +1,28 @@
+
+SUMMARY = "A Python generic test automation framework"
+DESCRIPTION = "Generic open source test atomation framework for acceptance\
+testing and acceptance test-driven development (ATDD). It has easy-to-use\
+tabular test data syntax and it utilizes the keyword-driven testing approach.\
+Its testing capabilities can be extended by test libraries implemented either\
+with Python or Java, and users can create new higher-level keywords from\
+existing ones using the same syntax that is used for creating test cases."
+HOMEPAGE = "http://robotframework.org"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+inherit pypi setuptools
+
+SRC_URI[md5sum] = "ee753415645ff4831ff0d366a0467fe7"
+SRC_URI[sha256sum] = "ab94257cbd848dfca7148e092d233a12853cc7e840ce8231af9cbb5e7f51aa47"
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-ctypes \
+ ${PYTHON_PN}-difflib \
+ ${PYTHON_PN}-docutils \
+ ${PYTHON_PN}-html \
+ ${PYTHON_PN}-pprint \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-xml \
+ ${PYTHON_PN}-zlib \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-scandir_1.10.0.bb b/external/meta-python2/recipes-devtools/python/python-scandir_1.10.0.bb
new file mode 100644
index 00000000..9de27241
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-scandir_1.10.0.bb
@@ -0,0 +1,14 @@
+SUMMARY = "A better directory iterator and faster os.walk()"
+HOMEPAGE = "https://github.com/benhoyt/scandir"
+AUTHOR = "Ben Hoyt"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=482ee62da51806409d432a80eed4e3ea"
+
+SRC_URI = "git://github.com/benhoyt/scandir.git"
+SRCREV = "982e6ba60e7165ef965567eacd7138149c9ce292"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools
+
+BBCLASSEXTEND = "native nativesdk" \ No newline at end of file
diff --git a/external/meta-python2/recipes-devtools/python/python-scrypt/0001-py-scrypt-remove-the-hard-coded-include-paths.patch b/external/meta-python2/recipes-devtools/python/python-scrypt/0001-py-scrypt-remove-the-hard-coded-include-paths.patch
new file mode 100644
index 00000000..d535e432
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-scrypt/0001-py-scrypt-remove-the-hard-coded-include-paths.patch
@@ -0,0 +1,26 @@
+From d8db473ce9346cd6254c90e13ac45b3bbde494c4 Mon Sep 17 00:00:00 2001
+From: Derek Straka <derek@asterius.io>
+Date: Sun, 11 Mar 2018 19:55:38 -0400
+Subject: [PATCH] py-scrypt: remove the hard coded include paths
+
+Upstream-Status: Pending
+
+Signed-off-by: Derek Straka <derek@asterius.io>
+---
+ setup.py | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index e36adc4..2ebfbf1 100644
+--- a/setup.py
++++ b/setup.py
+@@ -24,7 +24,6 @@ if sys.platform.startswith('linux'):
+ ('HAVE_SYS_SYSINFO_H', '1'),
+ ('_FILE_OFFSET_BITS', '64')]
+ libraries = ['crypto', 'rt']
+- includes = ['/usr/local/include', '/usr/include']
+ CFLAGS.append('-O2')
+ elif sys.platform.startswith('win32'):
+ define_macros = [('inline', '__inline')]
+--
+2.7.4
diff --git a/external/meta-python2/recipes-devtools/python/python-scrypt_0.8.6.bb b/external/meta-python2/recipes-devtools/python/python-scrypt_0.8.6.bb
new file mode 100644
index 00000000..812ff08d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-scrypt_0.8.6.bb
@@ -0,0 +1,17 @@
+DESCRIPTION = "Bindings for the scrypt key derivation function library"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=168ff75417f75a83e63c8875292d44dc"
+HOMEPAGE="https://bitbucket.org/mhallin/py-scrypt/overview"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-scrypt:"
+
+SRC_URI += "file://0001-py-scrypt-remove-the-hard-coded-include-paths.patch"
+
+SRC_URI[md5sum] = "ae8e3263aa31b040c1f9c7f1e1843a56"
+SRC_URI[sha256sum] = "f8239b2d47fa1d40bc27efd231dc7083695d10c1c2ac51a99380360741e0362d"
+
+inherit pypi setuptools python-dir
+
+RDEPENDS_${PN}_class-target += "\
+"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-sdnotify_0.3.2.bb b/external/meta-python2/recipes-devtools/python/python-sdnotify_0.3.2.bb
new file mode 100644
index 00000000..64979a9a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-sdnotify_0.3.2.bb
@@ -0,0 +1,17 @@
+SUMMARY = "A pure Python implementation of systemd's service notification protocol (sd_notify)"
+DESCRIPTION = "\
+ sdnotify is a pure Python implementation of the systemd sd_notify protocol. \
+ This protocol can be used to inform systemd about service start-up completion, \
+ watchdog events, and other service status changes. \
+ Thus, this package can be used to write system services in Python that play nicely with systemd. \
+ "
+HOMEPAGE = "https://github.com/bb4242/sdnotify"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=cc572ccc4b18a4b7d13be5d01bc8213e"
+
+SRC_URI[md5sum] = "749ddca1c70be1697fecc443fb1fdb16"
+SRC_URI[sha256sum] = "73977fc746b36cc41184dd43c3fe81323e7b8b06c2bb0826c4f59a20c56bb9f1"
+
+inherit setuptools pypi
diff --git a/external/meta-python2/recipes-devtools/python/python-selectors34_1.2.bb b/external/meta-python2/recipes-devtools/python/python-selectors34_1.2.bb
new file mode 100644
index 00000000..69545ebb
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-selectors34_1.2.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Backport of the selectors module from Python 3.4"
+LICENSE = "PSF"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=2fae0222c31d6c10488d4ab93a863af7"
+
+SRC_URI[md5sum] = "bc855a1c8839a811476c019dc07d92dd"
+SRC_URI[sha256sum] = "09f5066337f8a76fb5233f267873f89a27a17c10bf79575954894bb71686451c"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-six \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-semver_2.8.1.bb b/external/meta-python2/recipes-devtools/python/python-semver_2.8.1.bb
new file mode 100644
index 00000000..6fd19205
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-semver_2.8.1.bb
@@ -0,0 +1,12 @@
+DESCRIPTION = "Python module for Semantic Versioning"
+HOMEPAGE = "https://github.com/k-bx/python-semver"
+BUGTRACKER = "https://github.com/k-bx/python-semver/issues"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e910b35b0ef4e1f665b9a75d6afb7709"
+
+SRC_URI[md5sum] = "dc579ba9d0bb2137bad5324d4bdb7e40"
+SRC_URI[sha256sum] = "5b09010a66d9a3837211bb7ae5a20d10ba88f8cb49e92cb139a69ef90d5060d8"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-serpent_1.28.bb b/external/meta-python2/recipes-devtools/python/python-serpent_1.28.bb
new file mode 100644
index 00000000..a225c9bd
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-serpent_1.28.bb
@@ -0,0 +1,13 @@
+SUMMARY = "Serialization based on ast.literal_eval"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=5cd70632b6cdb96df9ddaf6a4ce619e6"
+
+SRC_URI[md5sum] = "15ef8b67c76a6d19bac9c16731a1e62a"
+SRC_URI[sha256sum] = "f306336ca09aa38e526f3b03cab58eb7e45af09981267233167bcf3bfd6436ab"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-numbers \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-setuptools-scm_3.3.3.bb b/external/meta-python2/recipes-devtools/python/python-setuptools-scm_3.3.3.bb
new file mode 100644
index 00000000..47782a20
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-setuptools-scm_3.3.3.bb
@@ -0,0 +1,18 @@
+SUMMARY = "the blessed package to manage your versions by scm tags"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489"
+
+SRC_URI[md5sum] = "50b2199082fe808d032ec1710c9d7415"
+SRC_URI[sha256sum] = "bd25e1fb5e4d603dcf490f1fde40fb4c595b357795674c3e5cb7f6217ab39ea5"
+
+PYPI_PACKAGE = "setuptools_scm"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target = "${PYTHON_PN}-py ${PYTHON_PN}-setuptools ${PYTHON_PN}-debugger ${PYTHON_PN}-json"
+RDEPENDS_${PN}_class-native = "${PYTHON_PN}-setuptools-native"
+
+RDEPENDS_${PN} += "${PYTHON_PN}-argparse"
+
+BBCLASSEXTEND = "native"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-setuptools.inc b/external/meta-python2/recipes-devtools/python/python-setuptools.inc
new file mode 100644
index 00000000..d8bce714
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-setuptools.inc
@@ -0,0 +1,50 @@
+SUMMARY = "Download, build, install, upgrade, and uninstall Python packages"
+HOMEPAGE = "https://pypi.python.org/pypi/setuptools"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;beginline=1;endline=19;md5=9a33897f1bca1160d7aad3835152e158"
+
+PYPI_PACKAGE_EXT = "zip"
+
+inherit pypi
+
+SRC_URI_append_class-native = " file://0001-conditionally-do-not-fetch-code-by-easy_install.patch"
+
+SRC_URI[md5sum] = "5ac69b66a6f7d4785517017f37df28e9"
+SRC_URI[sha256sum] = "c5b372090d7c8709ce79a6a66872a91e518f7d65af97fca78135e1cb10d4b940"
+
+DEPENDS += "${PYTHON_PN}"
+
+RDEPENDS_${PN} = "\
+ ${PYTHON_PN}-compile \
+ ${PYTHON_PN}-compression \
+ ${PYTHON_PN}-ctypes \
+ ${PYTHON_PN}-distutils \
+ ${PYTHON_PN}-email \
+ ${PYTHON_PN}-html \
+ ${PYTHON_PN}-netserver \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-pkgutil \
+ ${PYTHON_PN}-plistlib \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-stringold \
+ ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-unittest \
+ ${PYTHON_PN}-xml \
+"
+do_install_prepend() {
+ install -d ${D}${PYTHON_SITEPACKAGES_DIR}
+}
+
+BBCLASSEXTEND = "native nativesdk"
+
+# The pkg-resources module can be used by itself, without the package downloader
+# and easy_install. Ship it in a separate package so that it can be used by
+# minimal distributions.
+PACKAGES =+ "${PYTHON_PN}-pkg-resources "
+FILES_${PYTHON_PN}-pkg-resources = "${PYTHON_SITEPACKAGES_DIR}/pkg_resources/*"
+# Due to the way OE-Core implemented native recipes, the native class cannot
+# have a dependency on something that is not a recipe name. Work around that by
+# manually setting RPROVIDES.
+RDEPENDS_${PN}_append = " ${PYTHON_PN}-pkg-resources"
+RPROVIDES_append_class-native = " ${PYTHON_PN}-pkg-resources-native"
diff --git a/external/meta-python2/recipes-devtools/python/python-setuptools/0001-conditionally-do-not-fetch-code-by-easy_install.patch b/external/meta-python2/recipes-devtools/python/python-setuptools/0001-conditionally-do-not-fetch-code-by-easy_install.patch
new file mode 100644
index 00000000..169d1b15
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-setuptools/0001-conditionally-do-not-fetch-code-by-easy_install.patch
@@ -0,0 +1,32 @@
+From 5bba4f57f048016aa92ce5909e9e372db619554e Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia@windriver.com>
+Date: Tue, 17 Jul 2018 10:13:38 +0800
+Subject: [PATCH] conditionally do not fetch code by easy_install
+
+If var-NO_FETCH_BUILD is set, do not allow to fetch code from
+internet by easy_install.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
+
+---
+ setuptools/command/easy_install.py | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/setuptools/command/easy_install.py b/setuptools/command/easy_install.py
+index 05508ce..945e118 100755
+--- a/setuptools/command/easy_install.py
++++ b/setuptools/command/easy_install.py
+@@ -640,6 +640,11 @@ class easy_install(Command):
+ os.path.exists(tmpdir) and rmtree(rmtree_safe(tmpdir))
+
+ def easy_install(self, spec, deps=False):
++ if os.environ.get('NO_FETCH_BUILD', None):
++ log.error("ERROR: Do not try to fetch `%s' for building. "
++ "Please add its native recipe to DEPENDS." % spec)
++ return None
++
+ if not self.editable:
+ self.install_site_py()
+
diff --git a/external/meta-python2/recipes-devtools/python/python-setuptools_42.0.2.bb b/external/meta-python2/recipes-devtools/python/python-setuptools_42.0.2.bb
new file mode 100644
index 00000000..cf944049
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-setuptools_42.0.2.bb
@@ -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"
diff --git a/external/meta-python2/recipes-devtools/python/python-sh_1.12.14.bb b/external/meta-python2/recipes-devtools/python/python-sh_1.12.14.bb
new file mode 100644
index 00000000..2eba7b62
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-sh_1.12.14.bb
@@ -0,0 +1,37 @@
+
+SUMMARY = "Python subprocess replacement"
+HOMEPAGE = "https://github.com/amoffat/sh"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5317094292296f03405f59ae5f6544b6"
+
+SRC_URI[md5sum] = "a8351aef25d25f707c17e0a7a6280251"
+SRC_URI[sha256sum] = "b52bf5833ed01c7b5c5fb73a7f71b3d98d48e9b9b8764236237bdc7ecae850fc"
+
+PYPI_PACKAGE = "sh"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-codecs \
+ ${PYTHON_PN}-contextlib \
+ ${PYTHON_PN}-core \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-lang \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-resource \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-terminal \
+ ${PYTHON_PN}-tests \
+ ${PYTHON_PN}-textutils \
+ ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-unixadmin \
+"
+
+# WARNING: We were unable to map the following python package/module
+# dependencies to the bitbake packages which include them:
+# coverage - only used in test and there is a check to see if it is
+# available before importing.
+# queue - part of threading
+# signal - part of core in python3. not sure how it is imported in python2.
+# No complants in compiling.
+
diff --git a/external/meta-python2/recipes-devtools/python/python-sijax_0.3.2.bb b/external/meta-python2/recipes-devtools/python/python-sijax_0.3.2.bb
new file mode 100644
index 00000000..e1896d3d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-sijax_0.3.2.bb
@@ -0,0 +1,12 @@
+DESCRIPTION = "An easy to use AJAX library for Python based on jQuery.ajax"
+HOMEPAGE = "https://github.com/spantaleev/sijax-python"
+LICENSE = "BSD-3-Clause"
+
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=16e213d75641a392478df50cf0841903"
+
+PYPI_PACKAGE = "Sijax"
+
+inherit pypi setuptools
+
+SRC_URI[sha256sum] = "11b062f4a8b2aad95c87e7c09e5daf5a6b0d0f08abf9efe5f91a0075c6be7c0d"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-simplejson_3.17.0.bb b/external/meta-python2/recipes-devtools/python/python-simplejson_3.17.0.bb
new file mode 100644
index 00000000..050c4349
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-simplejson_3.17.0.bb
@@ -0,0 +1,26 @@
+SUMMARY = "Simple, fast, extensible JSON encoder/decoder for Python"
+HOMEPAGE = "http://cheeseshop.python.org/pypi/simplejson"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=c6338d7abd321c0b50a2a547e441c52e"
+
+SRC_URI[md5sum] = "8a5ed75c367b90fedc3d685742e2a1c7"
+SRC_URI[sha256sum] = "2b4b2b738b3b99819a17feaf118265d0753d5536049ea570b3c43b51c4701e81"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-netserver \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-re \
+"
+
+PACKAGES =+ "${PN}-tests"
+RDEPENDS_${PN}-tests = "${PN} ${PYTHON_PN}-unittest"
+FILES_${PN}-tests+= " \
+ ${PYTHON_SITEPACKAGES_DIR}/simplejson/tests \
+ ${PYTHON_SITEPACKAGES_DIR}/simplejson/tool.py* \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-singledispatch_3.4.0.3.bb b/external/meta-python2/recipes-devtools/python/python-singledispatch_3.4.0.3.bb
new file mode 100644
index 00000000..44c9505b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-singledispatch_3.4.0.3.bb
@@ -0,0 +1,12 @@
+SUMMARY = "functools.singledispatch from Python 3.4"
+DESCRIPTION = "PEP 443 proposed to expose a mechanism in the functools standard library module \
+in Python 3.4 that provides a simple form of generic programming known as single-dispatch \
+generic functions. This library is a backport of this functionality to Python 2.6 - 3.3"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://README.rst;md5=ee3cd67264adc7eb07981f3644dc17dc"
+
+SRC_URI[md5sum] = "af2fc6a3d6cc5a02d0bf54d909785fcb"
+SRC_URI[sha256sum] = "5b06af87df13818d14f08a028e42f566640aef80805c3b50c5056b086e3c2b9c"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-six_1.14.0.bb b/external/meta-python2/recipes-devtools/python/python-six_1.14.0.bb
new file mode 100644
index 00000000..779883ab
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-six_1.14.0.bb
@@ -0,0 +1,6 @@
+inherit pypi setuptools
+require recipes-devtools/python/python-six.inc
+
+SRC_URI[md5sum] = "21674588a57e649d1a6d977ec3122140"
+SRC_URI[sha256sum] = "236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-slip-dbus_0.6.5.bb b/external/meta-python2/recipes-devtools/python/python-slip-dbus_0.6.5.bb
new file mode 100644
index 00000000..0c67fa39
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-slip-dbus_0.6.5.bb
@@ -0,0 +1,38 @@
+SUMMARY = "Convenience functions for dbus services in Python 2.x"
+HOMEPAGE = "https://github.com/nphilipp/python-slip"
+DESCRIPTION = "\
+The Simple Library for Python 2.x packages contain miscellaneous code for \
+convenience, extension and workaround purposes. \
+\
+This package provides slip.dbus.service.Object, which is a dbus.service.Object \
+derivative that ends itself after a certain time without being used and/or if \
+there are no clients anymore on the message bus, as well as convenience \
+functions and decorators for integrating a dbus service with PolicyKit."
+
+SECTION = "devel/python"
+LICENSE = "GPLv2+"
+LIC_FILES_CHKSUM = "file://COPYING;md5=5574c6965ae5f583e55880e397fbb018"
+SRCNAME = "python-slip"
+
+SRC_URI = "https://github.com/nphilipp/${SRCNAME}/releases/download/${SRCNAME}-${PV}/${SRCNAME}-${PV}.tar.bz2"
+S = "${WORKDIR}/${SRCNAME}-${PV}"
+
+SRC_URI[md5sum] = "28ae5f93853466c44ec96706ba2a1eb4"
+SRC_URI[sha256sum] = "c726c086f0dd93a0ac7a0176f383a12af91b6657b78a301e3f5b25d9f8d4d10b"
+
+do_compile_prepend() {
+ sed -e 's/@VERSION@/${PV}/g' ${S}/setup.py.in > ${S}/setup.py
+}
+
+# http://errors.yoctoproject.org/Errors/Details/184713/
+# python-native/python: can't open file 'setup.py': [Errno 2] No such file or directory
+CLEANBROKEN = "1"
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-dbus \
+ ${PYTHON_PN}-decorator \
+ ${PYTHON_PN}-pygobject \
+ ${PYTHON_PN}-six \
+ "
+
+inherit setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-smbus_4.1.bb b/external/meta-python2/recipes-devtools/python/python-smbus_4.1.bb
new file mode 100644
index 00000000..d1462655
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-smbus_4.1.bb
@@ -0,0 +1,14 @@
+
+SUMMARY = "Set of i2c tools for linux - Python module"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://smbusmodule.c;beginline=1;endline=18;md5=46e424fb045901ab25e0f92c28c80055"
+
+SRC_URI = "${KERNELORG_MIRROR}/software/utils/i2c-tools/i2c-tools-${PV}.tar.gz "
+SRC_URI[md5sum] = "3536237a6b51fb10caacdc3b8a496237"
+SRC_URI[sha256sum] = "ef8f77afc70e7dbfd1171bfeae87a8a7f10074829370ce8d9ccd585a014e0073"
+
+DEPENDS += "i2c-tools"
+
+S = "${WORKDIR}/i2c-tools-${PV}/py-smbus/"
+
+inherit distutils
diff --git a/external/meta-python2/recipes-devtools/python/python-snakefood_1.4.bb b/external/meta-python2/recipes-devtools/python/python-snakefood_1.4.bb
new file mode 100644
index 00000000..e4a6d767
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-snakefood_1.4.bb
@@ -0,0 +1,51 @@
+SUMMARY = "Dependency graphing for Python"
+DESCRIPTION = " Generate dependency graphs from Python code. This \
+dependency tracker package has a few distinguishing characteristics \
+\
+ * It uses the AST to parse the Python files. This is very reliable, \
+ it always runs.\
+ * No module is loaded. Loading modules to figure out dependencies is \
+ almost always problem, because a lot of codebases run initialization \
+ code in the global namespace, which often requires additional setup. \
+ Snakefood is guaranteed not to have this problem (it just runs, no \
+ matter what).\
+ * It works on a set of files, i.e. you do not have to specify a single \
+ script, you can select a directory (package or else) or a set of files.\
+ It finds all the Python files recursively automatically.\
+ * Automatic/no configuration: your PYTHONPATH is automatically adjusted \
+ to include the required package roots. It figures out the paths that \
+ are required from the files/directories given as input. You should not \
+ have to setup ANYTHING.\
+ * It does not have to automatically 'follow' dependencies between modules,\
+ i.e. by default it only considers the files and directories you specify \
+ on the command-line and their immediate dependencies. It also has an \
+ option to automatically include only the dependencies within the \
+ packages of the files you specify.\
+ * It follows the UNIX philosophy of small programs that do one thing well:\
+ it consists of a few simple programs whose outputs you combine via \
+ pipes. Graphing dependencies always requires the user to filter and \
+ cluster the filenames, so this is appropriate. You can combine it with \
+ your favourite tools, grep, sed, etc.\
+\
+A problem with dependency trackers that run code is that they are unreliable, \
+due to the dynamic nature of Python (the presence of imports within function \
+calls and __import__ hooks makes it almost impossible to always do the right \
+thing). This script aims at being right 99% of the time, and we think that \
+given the trade-offs, 99% is good enough for 99% of the uses.\
+"
+AUTHOR = "Martin Blais <blais@furius.ca>"
+HOMEPAGE = "http://furius.ca/snakefood"
+LICENSE = "GPL-2.0"
+LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f"
+
+SRC_URI[md5sum] = "56c88667a33d8909b0aabf2ab6903bdf"
+SRC_URI[sha256sum] = "295784668032254e7391ca99ba7060edd3ae4eca1a330ac11627b18ab5923b77"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = " python-logging python-compiler python-shell"
+# the above modules do not have a -native counterpart
+RDEPENDS_${PN}_class-native = ""
+
+BBCLASSEXTEND = "native"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-snimpy_0.8.13.bb b/external/meta-python2/recipes-devtools/python/python-snimpy_0.8.13.bb
new file mode 100644
index 00000000..c885a7fb
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-snimpy_0.8.13.bb
@@ -0,0 +1,20 @@
+SUMMARY = "Interactive SNMP tool"
+DESCRIPTION = "Snimpy is a Python-based tool providing a simple interface to build SNMP query"
+HOMEPAGE = "https://pypi.python.org/pypi/snimpy"
+SECTION = "devel/python"
+
+DEPENDS += "libsmi python-cffi-native python-vcversioner-native"
+
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://docs/license.rst;md5=7c53ab2d1240828625c3e093d049d4f4"
+
+SRC_URI[md5sum] = "7c57acac10226df5bf43e10b929942df"
+SRC_URI[sha256sum] = "98b1790977b435332c03ab2603f6621eeeee69a50453ac01ca55dc7696d08535"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "python-cffi \
+ python-pycparser \
+ python-pysnmp \
+ python-setuptools \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-socketio_4.3.1.bb b/external/meta-python2/recipes-devtools/python/python-socketio_4.3.1.bb
new file mode 100644
index 00000000..44cde08e
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-socketio_4.3.1.bb
@@ -0,0 +1,28 @@
+SUMMARY = "Socket.IO server"
+HOMEPAGE = "https://github.com/miguelgrinberg/python-socketio/"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=42d0a9e728978f0eeb759c3be91536b8"
+
+inherit pypi setuptools
+
+PYPI_PACKAGE = "python-socketio"
+
+SRC_URI[md5sum] = "86cd47dddea1785ce7a6c72f55c93fe7"
+SRC_URI[sha256sum] = "506b2cf7a520b40ea0b3f25e1272eff8de134dce6f471c1f6bc0de8c90fe8c57"
+
+PACKAGECONFIG ?= ""
+PACKAGECONFIG[asyncio_client] = ",,,${PYTHON_PN}-aiohttp ${PYTHON_PN}-websockets"
+PACKAGECONFIG[client] = ",,,${PYTHON_PN}-requests ${PYTHON_PN}-websocket-client"
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-engineio \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-math \
+ ${PYTHON_PN}-pickle \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-attrs \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-soupsieve_1.9.4.bb b/external/meta-python2/recipes-devtools/python/python-soupsieve_1.9.4.bb
new file mode 100644
index 00000000..d62fd357
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-soupsieve_1.9.4.bb
@@ -0,0 +1,14 @@
+SUMMARY = "CSS selector library for python-beautifulsoup4"
+HOMEPAGE = "https://github.com/facelessuser/soupsieve"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.md;md5=5a6fd3b0c24fc5a041a3d1bbb22c81b5"
+
+SRC_URI[md5sum] = "43d8ea20c58494446aa65ba5cc6320fe"
+SRC_URI[sha256sum] = "605f89ad5fdbfefe30cdc293303665eff2d188865d4dbe4eb510bba1edfbfce3"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "${PYTHON_PN}-backports-functools-lru-cache"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-sparts_0.7.3.bb b/external/meta-python2/recipes-devtools/python/python-sparts_0.7.3.bb
new file mode 100644
index 00000000..a1253112
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-sparts_0.7.3.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Library for rapid service prototyping with minimal boilerplate"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0c1554636a564da3baf037ac652fc831"
+
+SRC_URI[md5sum] = "6aa8815652c6f5e5e8e5b2ac1813dd87"
+SRC_URI[sha256sum] = "b25707c349079a7c888155e7fdfd8394df2da9aca9c8eee4e205528cb16b7662"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} = "\
+ python-subprocess \
+ python-six \
+ python-argparse \
+ python-re \
+ python-shell \
+ python-threading \
+ python-logging \
+ python-unixadmin \
+ python-distutils \
+ python-daemonize \
+ python-futures \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-speaklater_1.3.bb b/external/meta-python2/recipes-devtools/python/python-speaklater_1.3.bb
new file mode 100644
index 00000000..a6f6855d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-speaklater_1.3.bb
@@ -0,0 +1,10 @@
+DESCRIPTION = "Media asset management for Python, with glue code for various frameworks"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b810770075a29bf44b96607440e7c801"
+
+SRC_URI[md5sum] = "e8d5dbe36e53d5a35cff227e795e8bbf"
+SRC_URI[sha256sum] = "59fea336d0eed38c1f0bf3181ee1222d0ef45f3a9dd34ebe65e6bfffdd6a65a9"
+
+PYPI_PACKAGE = "speaklater"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-sqlalchemy_1.3.12.bb b/external/meta-python2/recipes-devtools/python/python-sqlalchemy_1.3.12.bb
new file mode 100644
index 00000000..15bee0db
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-sqlalchemy_1.3.12.bb
@@ -0,0 +1,22 @@
+DESCRIPTION = "Python SQL toolkit and Object Relational Mapper that gives \
+application developers the full power and flexibility of SQL"
+HOMEPAGE = "http://www.sqlalchemy.org/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=2f5eb030c48975d5294baf0f5d01af1c"
+
+PYPI_PACKAGE = "SQLAlchemy"
+
+inherit pypi setuptools
+
+SRC_URI[md5sum] = "02a46be841903b60c52a83342d3ced8e"
+SRC_URI[sha256sum] = "bfb8f464a5000b567ac1d350b9090cf081180ec1ab4aa87e7bca12dab25320ec"
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-pickle \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-threading \
+"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-sqlparse_0.3.0.bb b/external/meta-python2/recipes-devtools/python/python-sqlparse_0.3.0.bb
new file mode 100644
index 00000000..329ccffe
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-sqlparse_0.3.0.bb
@@ -0,0 +1,17 @@
+
+SUMMARY = "Non-validating SQL parser module"
+DESCRIPTION = "sqlparse is a non-validating SQL parser module. It provides \
+support for parsing, splitting and formatting SQL statements."
+HOMEPAGE = "https://github.com/andialbrecht/sqlparse"
+SECTION = "devel/python"
+
+LICENSE = "BSD"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=2b136f573f5386001ea3b7b9016222fc"
+
+SRC_URI[md5sum] = "2ce34181d6b7b234c9f3c0ecd1ffb93e"
+SRC_URI[sha256sum] = "7c3dca29c022744e95b547e867cee89f4fce4373f3549ccd8797d8eb52cdb873"
+
+export BUILD_SYS
+export HOST_SYS
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-statistics_1.0.3.5.bb b/external/meta-python2/recipes-devtools/python/python-statistics_1.0.3.5.bb
new file mode 100644
index 00000000..ee3b822a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-statistics_1.0.3.5.bb
@@ -0,0 +1,15 @@
+SUMMARY = "A port of Python 3.4 statistics module to Python 2.x"
+DESCRIPTION = " \
+A port of Python 3.4 statistics module to Python 2.*, initially done \
+through the 3to2 tool. This module provides functions for calculating \
+mathematical statistics of numeric (Real-valued) data. \
+"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://statistics/__init__.py;beginline=6;endline=16;md5=b76960ee777a1529f60db47ada2a8e6e"
+
+SRC_URI[md5sum] = "d6d97f3a1a7b3192cff99e0f2b5956c3"
+SRC_URI[sha256sum] = "2dc379b80b07bf2ddd5488cad06b2b9531da4dd31edb04dc9ec0dc226486c138"
+
+inherit pypi setuptools
+
+PYPI_PACKAGE = "statistics"
diff --git a/external/meta-python2/recipes-devtools/python/python-stevedore_1.31.0.bb b/external/meta-python2/recipes-devtools/python/python-stevedore_1.31.0.bb
new file mode 100644
index 00000000..0c9579f1
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-stevedore_1.31.0.bb
@@ -0,0 +1,16 @@
+
+DESCRIPTION = "Manage dynamic plugins for Python applications"
+HOMEPAGE = "https://github.com/dreamhost/stevedore"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+SRC_URI[md5sum] = "42fa2bf0251c96b543765c5ce13f37c9"
+SRC_URI[sha256sum] = "e0739f9739a681c7a1fda76a102b65295e96a144ccdb552f2ae03c5f0abe8a14"
+
+inherit pypi setuptools
+
+DEPENDS += "${PYTHON_PN}-pbr-native"
+
+RDEPENDS_${PN} += "${PYTHON_PN}-pbr ${PYTHON_PN}-six"
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-strict-rfc3339_0.7.bb b/external/meta-python2/recipes-devtools/python/python-strict-rfc3339_0.7.bb
new file mode 100644
index 00000000..896e9c8e
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-strict-rfc3339_0.7.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Strict, simple, lightweight RFC3339 function.s"
+LICENSE = "GPLv3"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8f0e2cd40e05189ec81232da84bd6e1a"
+
+SRC_URI[md5sum] = "4d9b635b4df885bc37bc1189d66c9abc"
+SRC_URI[sha256sum] = "5cad17bedfc3af57b399db0fed32771f18fc54bbd917e85546088607ac5e1277"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-subprocess32_3.2.7.bb b/external/meta-python2/recipes-devtools/python/python-subprocess32_3.2.7.bb
new file mode 100644
index 00000000..f4370692
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-subprocess32_3.2.7.bb
@@ -0,0 +1,15 @@
+SUMMARY = "A backport of the subprocess module from Python 3.2 for use on 2.x"
+DESCRIPTION = "This is a backport of the subprocess standard library module \
+from Python 3.2 - 3.5 for use on Python 2. It includes bugfixes and some new \
+features. On POSIX systems it is guaranteed to be reliable when used in \
+threaded applications. It includes timeout support from Python 3.3 and the \
+run() API from 3.5 but otherwise matches 3.2's API."
+LICENSE = "Python-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d3e62baa8fb96b11a59d3f2cd335d5c0"
+
+SRC_URI[md5sum] = "824c801e479d3e916879aae3e9c15e16"
+SRC_URI[sha256sum] = "1e450a4a4c53bf197ad6402c564b9f7a53539385918ef8f12bdf430a61036590"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-systemd/0001-Provide-implementation-of-strndupa-for-musl.patch b/external/meta-python2/recipes-devtools/python/python-systemd/0001-Provide-implementation-of-strndupa-for-musl.patch
new file mode 100644
index 00000000..d7085a85
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-systemd/0001-Provide-implementation-of-strndupa-for-musl.patch
@@ -0,0 +1,42 @@
+From 8b639f9faf6199e47b9eae0698d01a22917b6abe Mon Sep 17 00:00:00 2001
+From: Tim Orling <timothy.t.orling@linux.intel.com>
+Date: Fri, 29 Dec 2017 09:17:17 -0800
+Subject: [PATCH] Provide implementation of strndupa for musl
+
+Reuse the approach from oe-core:
+/meta/recipes-core/systemd/systemd/0002-src-basic-missing.h-check-for-missing-strndupa.patch
+
+Original patch author: Emil Renner Berthing <systemd@esmil.dk>
+
+Signed-off-by: Tim Orling <timothy.t.orling@linux.intel.com
+---
+Upstream-Status: Pending
+
+ systemd/util.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/systemd/util.c b/systemd/util.c
+index e02c825..277e611 100644
+--- a/systemd/util.c
++++ b/systemd/util.c
+@@ -34,6 +34,17 @@
+
+ #include "util.h"
+
++#if !HAVE_DECL_STRNDUPA
++#define strndupa(s, n) \
++ ({ \
++ const char *__old = (s); \
++ size_t __len = strnlen(__old, (n)); \
++ char *__new = (char *)alloca(__len + 1); \
++ __new[__len] = '\0'; \
++ (char *)memcpy(__new, __old, __len); \
++ })
++#endif
++
+ int safe_atou(const char *s, unsigned *ret_u) {
+ char *x = NULL;
+ unsigned long l;
+--
+2.13.6
+
diff --git a/external/meta-python2/recipes-devtools/python/python-systemd/endian.patch b/external/meta-python2/recipes-devtools/python/python-systemd/endian.patch
new file mode 100644
index 00000000..e09aea73
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-systemd/endian.patch
@@ -0,0 +1,14 @@
+Include endian.h for missing definitions of htobe16
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+--- a/systemd/util.c
++++ b/systemd/util.c
+@@ -28,6 +28,7 @@
+ #include <stdbool.h>
+ #include <assert.h>
+ #include <errno.h>
++#include <endian.h>
+ #include <fcntl.h>
+ #include <unistd.h>
+ #include <net/if.h>
diff --git a/external/meta-python2/recipes-devtools/python/python-systemd_234.bb b/external/meta-python2/recipes-devtools/python/python-systemd_234.bb
new file mode 100644
index 00000000..c9827b1b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-systemd_234.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Python interface for libsystemd"
+HOMEPAGE = "https://github.com/systemd/python-systemd"
+LICENSE = "LGPLv2.1+"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4fbd65380cdd255951079008b364516c"
+
+PYPI_PACKAGE = "systemd-python"
+DEPENDS += "systemd (<=234)"
+RDEPENDS_${PN} += "systemd ${PYTHON_PN}-syslog ${PYTHON_PN}-logging"
+REQUIRED_DISTRO_FEATURES = "systemd"
+
+inherit pypi features_check setuptools
+
+SRC_URI[md5sum] = "5071ea5bcb976186e92a3f5e75df221d"
+SRC_URI[sha256sum] = "fd0e44bf70eadae45aadc292cb0a7eb5b0b6372cd1b391228047d33895db83e7"
+
+# allow for common patches for python- and python3-systemd
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-systemd:"
+
+SRC_URI += "file://endian.patch"
+
+SRC_URI_append_libc-musl = " file://0001-Provide-implementation-of-strndupa-for-musl.patch"
diff --git a/external/meta-python2/recipes-devtools/python/python-toml_0.10.0.bb b/external/meta-python2/recipes-devtools/python/python-toml_0.10.0.bb
new file mode 100644
index 00000000..02006fe9
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-toml_0.10.0.bb
@@ -0,0 +1,15 @@
+
+SUMMARY = "Python Library for Tom's Obvious, Minimal Language"
+HOMEPAGE = "https://github.com/uiri/toml"
+LICENSE = "MIT"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=6d6012eea477117abf51c31262a152f8"
+
+SRC_URI[md5sum] = "63fffbe2d632865ec29cd69bfdf36682"
+SRC_URI[sha256sum] = "229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-datetime \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-tornado-redis_2.4.18.bb b/external/meta-python2/recipes-devtools/python/python-tornado-redis_2.4.18.bb
new file mode 100644
index 00000000..46a20a5e
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-tornado-redis_2.4.18.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Tornado-Redis is an asyncronous Redis client for the Tornado Web Server"
+DESCRIPTION = "Tornado-Redis is a Redis client that uses Tornado's native 'tornado-gen' interface. \
+It can be used alongside redis-py in Tornado applications: \
+tornado-redis to subscribe to Pub/Sub notifications and for blocking commands (such as BLPOP, BRPOP, BRPOPLPUSH); \
+redis-py for other commands."
+HOMEPAGE = "https://github.com/leporo/tornado-redis"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=ca307e8f37b5fa7f8dbbec033f7db7de"
+
+SRC_URI[md5sum] = "1c7ec0f645d15400871141c1149e6934"
+SRC_URI[sha256sum] = "8fd3b324158291ad5fb7f5f8dc2e8763b2895556bd2a44f2dd721b703c669046"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "python-tornado"
+
+RDEPENDS_${PN}-test += "${PN} python-tornado"
diff --git a/external/meta-python2/recipes-devtools/python/python-tornado_6.0.3.bb b/external/meta-python2/recipes-devtools/python/python-tornado_6.0.3.bb
new file mode 100644
index 00000000..abec93c3
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-tornado_6.0.3.bb
@@ -0,0 +1,35 @@
+
+SUMMARY = "Tornado is an open source version of the scalable, non-blocking web server and tools that power FriendFeed."
+DESCRIPTION = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. \
+By using non-blocking network I/O, Tornado can scale to tens of thousands of open connections, making it ideal for long \
+polling, WebSockets, and other applications that require a long-lived connection to each user."
+HOMEPAGE = "http://www.tornadoweb.org/en/stable/"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+SRC_URI[md5sum] = "cab4b11480f6d032e46465586192d343"
+SRC_URI[sha256sum] = "c845db36ba616912074c5b1ee897f8e0124df269468f25e4fe21fe72f6edd7a9"
+
+RDEPENDS_${PN} += "${PYTHON_PN}-compression ${PYTHON_PN}-numbers ${PYTHON_PN}-email \
+ ${PYTHON_PN}-pkgutil ${PYTHON_PN}-html ${PYTHON_PN}-json ${PYTHON_PN}-certifi ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-ctypes"
+
+RDEPENDS_${PN}-test += "${PN} ${PYTHON_PN}-unittest"
+
+PACKAGES =+ "\
+ ${PN}-test \
+"
+
+FILES_${PN}-test = " \
+ ${libdir}/${PYTHON_DIR}/site-packages/*/test \
+ ${libdir}/${PYTHON_DIR}/site-packages/*/testing.py* \
+"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-backports-abc \
+ ${PYTHON_PN}-backports-ssl \
+ ${PYTHON_PN}-singledispatch \
+ ${PYTHON_PN}-subprocess \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-tqdm_4.41.1.bb b/external/meta-python2/recipes-devtools/python/python-tqdm_4.41.1.bb
new file mode 100644
index 00000000..22393bb4
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-tqdm_4.41.1.bb
@@ -0,0 +1,20 @@
+SUMMARY = "Fast, Extensible Progress Meter"
+HOMEPAGE = "http://tqdm.github.io/"
+SECTION = "devel/python"
+
+LICENSE = "MIT & MPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENCE;md5=054ef7105cba050017d1368262a1623c"
+
+inherit pypi setuptools
+
+SRC_URI[md5sum] = "aa3d5fd173c9fea7408cad14c0e73d5d"
+SRC_URI[sha256sum] = "4789ccbb6fc122b5a6a85d512e4e41fc5acad77216533a6f2b8ce51e0f265c23"
+
+RDEPENDS_${PN}_append_class-target = "\
+ ${PYTHON_PN}-lang \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-subprocess \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-traceback2_1.4.0.bb b/external/meta-python2/recipes-devtools/python/python-traceback2_1.4.0.bb
new file mode 100644
index 00000000..696c875c
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-traceback2_1.4.0.bb
@@ -0,0 +1,15 @@
+SUMMARY = "A backport of traceback to older supported Pythons"
+HOMEPAGE = "https://github.com/testing-cabal/traceback2"
+LICENSE = "Python-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=31;endline=31;md5=368ddc8588431c180ae7c33f4fb57519"
+
+DEPENDS = "${PYTHON_PN}-pbr-native"
+
+SRC_URI[md5sum] = "9e9723f4d70bfc6308fa992dd193c400"
+SRC_URI[sha256sum] = "05acc67a09980c2ecfedd3423f7ae0104839eccb55fc645773e1caa0951c3030"
+
+inherit pypi setuptools
+
+CLEANBROKEN = "1"
+
+RDEPENDS_${PN} = "${PYTHON_PN}-linecache2"
diff --git a/external/meta-python2/recipes-devtools/python/python-twisted/0001-fix-MemoryReactor-import-in-test_runner-to-be-from-t.patch b/external/meta-python2/recipes-devtools/python/python-twisted/0001-fix-MemoryReactor-import-in-test_runner-to-be-from-t.patch
new file mode 100644
index 00000000..43602301
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-twisted/0001-fix-MemoryReactor-import-in-test_runner-to-be-from-t.patch
@@ -0,0 +1,37 @@
+From 754f21282ad2775db8ff501d40bbc497faeb17ba Mon Sep 17 00:00:00 2001
+From: Trevor Gamblin <trevor.gamblin@windriver.com>
+Date: Tue, 17 Dec 2019 15:09:22 -0500
+Subject: [PATCH] fix MemoryReactor import in test_runner to be from
+ twisted.internet.testing
+
+Upstream-Status: Backport [https://github.com/twisted/twisted/commit/754f21282ad2775db8ff501d40bbc497faeb17ba]
+
+Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com>
+---
+ src/twisted/application/newsfragments/9746.misc | 1 +
+ src/twisted/application/runner/test/test_runner.py | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+ create mode 100644 src/twisted/application/newsfragments/9746.misc
+
+diff --git a/src/twisted/application/newsfragments/9746.misc b/src/twisted/application/newsfragments/9746.misc
+new file mode 100644
+index 000000000..8b1378917
+--- /dev/null
++++ b/src/twisted/application/newsfragments/9746.misc
+@@ -0,0 +1 @@
++
+diff --git a/src/twisted/application/runner/test/test_runner.py b/src/twisted/application/runner/test/test_runner.py
+index 9abc3449a..cce495b12 100644
+--- a/src/twisted/application/runner/test/test_runner.py
++++ b/src/twisted/application/runner/test/test_runner.py
+@@ -15,7 +15,7 @@ from twisted.logger import (
+ LogLevel, LogPublisher, LogBeginner,
+ FileLogObserver, FilteringLogObserver, LogLevelFilterPredicate,
+ )
+-from twisted.test.proto_helpers import MemoryReactor
++from twisted.internet.testing import MemoryReactor
+
+ from ...runner import _runner
+ from .._exit import ExitStatus
+--
+2.24.1
diff --git a/external/meta-python2/recipes-devtools/python/python-twisted_19.10.0.bb b/external/meta-python2/recipes-devtools/python/python-twisted_19.10.0.bb
new file mode 100644
index 00000000..aee6f5ae
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-twisted_19.10.0.bb
@@ -0,0 +1,290 @@
+SUMMARY = "An asynchronous networking framework written in Python"
+DESCRIPTION = "Twisted is an event-driven networking framework written in Python and licensed under the LGPL. \
+Twisted supports TCP, UDP, SSL/TLS, multicast, Unix sockets, a large number of protocols \
+(including HTTP, NNTP, IMAP, SSH, IRC, FTP, and others), and much more."
+HOMEPAGE = "http://www.twistedmatrix.com"
+SECTION = "devel/python"
+
+#twisted/topfiles/NEWS:655: - Relicensed: Now under the MIT license, rather than LGPL.
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=1743f12d8b8f5aec625c0569a058f0a6"
+
+# allow for common patches for python- and python3-twisted
+FILESEXTRAPATHS_prepend := "${THISDIR}/python-twisted:"
+
+SRC_URI += "file://0001-fix-MemoryReactor-import-in-test_runner-to-be-from-t.patch"
+
+SRC_URI[sha256sum] = "7394ba7f272ae722a74f3d969dcf599bc4ef093bc392038748a490f1724a515d"
+SRC_URI[md5sum] = "f2d70f7a66ecdf54152310164cceadfe"
+
+PYPI_PACKAGE = "Twisted"
+PYPI_PACKAGE_EXT = "tar.bz2"
+
+do_install_append() {
+ # remove some useless files before packaging
+ find ${D} \( -name "*.bat" -o -name "*.c" -o -name "*.h" \) -exec rm -f {} \;
+}
+
+PACKAGES =+ "\
+ ${PN}-zsh \
+ ${PN}-test \
+ ${PN}-protocols \
+ ${PN}-conch \
+ ${PN}-mail \
+ ${PN}-names \
+ ${PN}-news \
+ ${PN}-runner \
+ ${PN}-web \
+ ${PN}-words \
+ ${PN}-flow \
+ ${PN}-pair \
+ ${PN}-core \
+"
+
+PACKAGES =+ "\
+ ${PN}-bin \
+"
+
+DEPENDS += " \
+ ${PYTHON_PN}-incremental-native \
+"
+
+RDEPENDS_${PN} = "\
+ ${PN}-bin \
+ ${PN}-core \
+ ${PN}-conch \
+ ${PN}-mail \
+ ${PN}-names \
+ ${PN}-pair \
+ ${PN}-protocols \
+ ${PN}-runner \
+ ${PN}-web \
+ ${PN}-words \
+ ${PN}-zsh \
+"
+
+RDEPENDS_${PN}-core = " \
+ ${PYTHON_PN}-automat \
+ ${PYTHON_PN}-constantly \
+ ${PYTHON_PN}-core \
+ ${PYTHON_PN}-debugger \
+ ${PYTHON_PN}-hyperlink \
+ ${PYTHON_PN}-incremental \
+ ${PYTHON_PN}-misc \
+ ${PYTHON_PN}-pkg-resources \
+ ${PYTHON_PN}-pkgutil \
+ ${PYTHON_PN}-plistlib \
+ ${PYTHON_PN}-pyhamcrest \
+ ${PYTHON_PN}-pyserial \
+ ${PYTHON_PN}-setuptools \
+ ${PYTHON_PN}-unixadmin \
+ ${PYTHON_PN}-zopeinterface \
+"
+
+RDEPENDS_${PN}-test = "${PN}"
+
+RDEPENDS_${PN}-conch = " \
+ ${PN}-core \
+ ${PN}-protocols \
+ ${PYTHON_PN}-bcrypt \
+ ${PYTHON_PN}-cryptography \
+ ${PYTHON_PN}-pickle \
+ ${PYTHON_PN}-pyasn1 \
+"
+
+RDEPENDS_${PN}-mail = "${PN}-core ${PN}-protocols"
+RDEPENDS_${PN}-names = "${PN}-core"
+RDEPENDS_${PN}-news = "${PN}-core ${PN}-protocols"
+RDEPENDS_${PN}-runner = "${PN}-core ${PN}-protocols"
+RDEPENDS_${PN}-web += "${PN}-core ${PN}-protocols"
+RDEPENDS_${PN}-words += "${PN}-core"
+RDEPENDS_${PN}-flow += "${PN}-core"
+RDEPENDS_${PN}-pair += "${PN}-core"
+RDEPENDS_${PN}-dbg = "${PN}"
+
+ALLOW_EMPTY_${PN} = "1"
+FILES_${PN} = ""
+
+FILES_${PN}-test = " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/test \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/*/test \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/haproxy/test/ \
+"
+
+FILES_${PN}-protocols = " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/*.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/gps/ \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/mice/ \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/haproxy \
+"
+
+FILES_${PN}-zsh = " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/python/zsh \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/python/zshcomp.* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/python/twisted-completion.zsh \
+"
+
+FILES_${PN}-conch = " \
+ ${bindir}/ckeygen \
+ ${bindir}/tkconch \
+ ${bindir}/conch \
+ ${bindir}/conchftp \
+ ${bindir}/cftp \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_conch.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/conch \
+"
+
+FILES_${PN}-core = " \
+${bindir}/manhole \
+${bindir}/mktap \
+${bindir}/twistd \
+${bindir}/tap2deb \
+${bindir}/tap2rpm \
+${bindir}/tapconvert \
+${bindir}/tkmktap \
+${bindir}/trial \
+${bindir}/easy_install* \
+${bindir}/pyhtmlizer \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/*.so \
+${PYTHON_SITEPACKAGES_DIR}/twisted/*.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__init__.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/notestplugin.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/testplugin.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_ftp.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_inet.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_manhole.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_portforward.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_socks.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_telnet.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_trial.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/dropin.cache \
+${PYTHON_SITEPACKAGES_DIR}/twisted/application \
+${PYTHON_SITEPACKAGES_DIR}/twisted/cred \
+${PYTHON_SITEPACKAGES_DIR}/twisted/enterprise \
+${PYTHON_SITEPACKAGES_DIR}/twisted/internet \
+${PYTHON_SITEPACKAGES_DIR}/twisted/manhole \
+${PYTHON_SITEPACKAGES_DIR}/twisted/manhole \
+${PYTHON_SITEPACKAGES_DIR}/twisted/persisted \
+${PYTHON_SITEPACKAGES_DIR}/twisted/protocols\
+${PYTHON_SITEPACKAGES_DIR}/twisted/python\
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/timeoutqueue.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/filepath.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/dxprofile.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/plugin.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/htmlizer.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/__init__.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/dispatch.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/hook.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/threadpool.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/otp.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/usage.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/roots.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/versions.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/urlpath.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/util.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/components.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/logfile.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/runtime.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/reflect.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/context.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/threadable.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/rebuild.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/failure.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/lockfile.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/formmethod.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/finalize.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/win32.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/dist.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/shortcut.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/zipstream.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/release.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/syslog.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/log.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/compat.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/zshcomp.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/procutils.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/text.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/_twisted_zsh_stub \
+${PYTHON_SITEPACKAGES_DIR}/twisted/scripts/ \
+${PYTHON_SITEPACKAGES_DIR}/twisted/spread/ \
+${PYTHON_SITEPACKAGES_DIR}/twisted/tap/ \
+${PYTHON_SITEPACKAGES_DIR}/twisted/trial/ \
+${PYTHON_SITEPACKAGES_DIR}/twisted/__init__.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/_version.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/copyright.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/im.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/*.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/python/*.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/*.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/topfiles \
+${PYTHON_SITEPACKAGES_DIR}/Twisted*egg-info \
+${PYTHON_SITEPACKAGES_DIR}/twisted/logger/ \
+${PYTHON_SITEPACKAGES_DIR}/twisted/_threads/ \
+${PYTHON_SITEPACKAGES_DIR}/twisted/positioning/ \
+"
+
+FILES_${PN}-mail = " \
+${bindir}/mailmail \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_mail.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/mail \
+"
+
+FILES_${PN}-names = " \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_names.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/names \
+"
+
+FILES_${PN}-news = " \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_news.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/news \
+"
+
+FILES_${PN}-runner = " \
+${libdir}/site-packages/twisted/runner/portmap.so \
+${PYTHON_SITEPACKAGES_DIR}/twisted/runner\
+"
+
+FILES_${PN}-web = " \
+${bindir}/websetroot \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_web.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/web\
+"
+
+FILES_${PN}-words = " \
+${bindir}/im \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_words.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/words\
+"
+
+FILES_${PN}-flow = " \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_flow.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/flow \"
+
+FILES_${PN}-pair = " \
+${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_pair.py* \
+${PYTHON_SITEPACKAGES_DIR}/twisted/pair \
+"
+
+FILES_${PN}-dbg += " \
+${PYTHON_SITEPACKAGES_DIR}/twisted/*/.debug \
+${PYTHON_SITEPACKAGES_DIR}/twisted/*/*/.debug \
+"
+
+FILES_${PN}-doc += " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/python/_pydoctortemplates/ \
+"
+
+RDEPENDS_${PN}-src = "${PN}"
+FILES_${PN}-src = " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/*.py \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/*/*.py \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/*/*/*.py \
+"
+
+inherit pypi python-dir setuptools
+
+RDEPENDS_${PN}-core += "${PYTHON_PN}-contextlib"
+
+RDEPENDS_${PN} += " \
+ ${PN}-news \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-twitter_3.8.0.bb b/external/meta-python2/recipes-devtools/python/python-twitter_3.8.0.bb
new file mode 100644
index 00000000..72cbb09e
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-twitter_3.8.0.bb
@@ -0,0 +1,20 @@
+SUMMARY = "Twitter for Python"
+DESCRIPTION = "Python module to support twitter API"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=8f702b489acb6863cec8b261a55931d8"
+
+SRC_URI[md5sum] = "8aeff278b7cefcd384c65929bc921e2c"
+SRC_URI[sha256sum] = "8abd828ba51a85a2b5bb7373715d6d3bb32d18ac624e3a4db02e4ef8ab48316b"
+
+PYPI_PACKAGE = "tweepy"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-pip \
+ ${PYTHON_PN}-pysocks \
+ ${PYTHON_PN}-requests \
+ ${PYTHON_PN}-six \
+ "
+
diff --git a/external/meta-python2/recipes-devtools/python/python-twofish_0.3.0.bb b/external/meta-python2/recipes-devtools/python/python-twofish_0.3.0.bb
new file mode 100644
index 00000000..c1baa7c7
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-twofish_0.3.0.bb
@@ -0,0 +1,13 @@
+SUMMARY = "Bindings for the Twofish implementation by Niels Ferguson"
+DESCRIPTION = "Bindings for the Twofish implementation by Niels Ferguson\
+ libtwofish-dev."
+HOMEPAGE = "http://github.com/keybase/python-twofish"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=33a63abf6d7567b1689d8ce69f00e43b"
+
+SRC_URI[md5sum] = "d7d22f16dc4ffa0e3ae2200654033abe"
+SRC_URI[sha256sum] = "b09d8bb50d33b23ff34cafb1f9209f858f752935c6a5c901efb92a41acb830fa"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-typing_3.7.4.1.bb b/external/meta-python2/recipes-devtools/python/python-typing_3.7.4.1.bb
new file mode 100644
index 00000000..744c7b00
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-typing_3.7.4.1.bb
@@ -0,0 +1,11 @@
+SUMMARY = "Simple Python module defined by PEP 484."
+HOMEPAGE = "https://github.com/python/typing"
+LICENSE = "PSF"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=64fc2b30b67d0a8423c250e0386ed72f"
+
+SRC_URI[md5sum] = "0a1ebd4af65b4769e33459004eb20345"
+SRC_URI[sha256sum] = "91dfe6f3f706ee8cc32d38edbbf304e9b7583fb37108fef38229617f8b3eba23"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-tzlocal_2.0.0.bb b/external/meta-python2/recipes-devtools/python/python-tzlocal_2.0.0.bb
new file mode 100644
index 00000000..0243784d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-tzlocal_2.0.0.bb
@@ -0,0 +1,9 @@
+SUMMARY = "Library to return tzinfo with the local timezone information"
+HOMEPAGE = "https://pypi.org/project/tzlocal/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=57e0bd61643d81d05683cdce65b11d10"
+
+SRC_URI[md5sum] = "b14262cecca16ec9220ca8dff2ca7c5d"
+SRC_URI[sha256sum] = "949b9dd5ba4be17190a80c0268167d7e6c92c62b30026cf9764caf3e308e5590"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-ujson_1.35.bb b/external/meta-python2/recipes-devtools/python/python-ujson_1.35.bb
new file mode 100644
index 00000000..bc982fc5
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-ujson_1.35.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Ultra fast JSON encoder and decoder for Python"
+DESCRIPTION = "UltraJSON is an ultra fast JSON encoder and decoder written in pure C with bindings for Python 2.5+ and 3."
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=88df8e78b9edfd744953862179f2d14e"
+
+SRC_URI[md5sum] = "42f77b0cce686dfa4da2e68480b1dd24"
+SRC_URI[sha256sum] = "f66073e5506e91d204ab0c614a148d5aa938bdbf104751be66f8ad7a222f5f86"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-numbers \
+ "
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-unidiff_0.5.5.bb b/external/meta-python2/recipes-devtools/python/python-unidiff_0.5.5.bb
new file mode 100644
index 00000000..e658cf8c
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-unidiff_0.5.5.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Unified diff parsing/metadata extraction library"
+HOMEPAGE = "http://github.com/matiasb/python-unidiff"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4c434b08ef42fea235bb019b5e5a97b3"
+
+SRC_URI[md5sum] = "47f669d7273541fec45e4cc0fba8d8e9"
+SRC_URI[sha256sum] = "9c9ab5fb96b6988b4cd5def6b275492442c04a570900d33aa6373105780025bc"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-codecs \
+ ${PYTHON_PN}-io \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-urllib3_1.25.7.bb b/external/meta-python2/recipes-devtools/python/python-urllib3_1.25.7.bb
new file mode 100644
index 00000000..6487d89b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-urllib3_1.25.7.bb
@@ -0,0 +1,23 @@
+SUMMARY = "Python HTTP library with thread-safe connection pooling, file post support, sanity friendly, and more"
+HOMEPAGE = "https://github.com/shazow/urllib3"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=65715c2eb961313d71b297dd5a04f85e"
+
+SRC_URI[md5sum] = "85e1e3925f8c1095172bff343f3312ed"
+SRC_URI[sha256sum] = "f3c5fd51747d450d4dcf6f923c81f78f811aab8205fda64b0aba34a4e48b0745"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-certifi \
+ ${PYTHON_PN}-cryptography \
+ ${PYTHON_PN}-email \
+ ${PYTHON_PN}-idna \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-pyopenssl \
+ ${PYTHON_PN}-threading \
+"
+
+CVE_PRODUCT = "urllib3"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-vcversioner_2.16.0.0.bb b/external/meta-python2/recipes-devtools/python/python-vcversioner_2.16.0.0.bb
new file mode 100644
index 00000000..e6cc4acc
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-vcversioner_2.16.0.0.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Python vcversioner, automagically update the project's version"
+HOMEPAGE = "https://github.com/habnabit/vcversioner"
+
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=827a7a91a8d20d3c666b665cd96db8e3"
+
+SRC_URI[md5sum] = "aab6ef5e0cf8614a1b1140ed5b7f107d"
+SRC_URI[sha256sum] = "dae60c17a479781f44a4010701833f1829140b1eeccd258762a74974aa06e19b"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-subprocess \
+ "
+RDEPENDS_${PN}_class-native = ""
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-devtools/python/python-versiontools_1.9.1.bb b/external/meta-python2/recipes-devtools/python/python-versiontools_1.9.1.bb
new file mode 100644
index 00000000..a30dff3b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-versiontools_1.9.1.bb
@@ -0,0 +1,11 @@
+SUMMARY = "Smart replacement for plain tuple used in __version__"
+SECTION = "devel/python"
+HOMEPAGE = "https://launchpad.net/versiontools"
+LICENSE = "LGPLv3"
+LIC_FILES_CHKSUM = "file://setup.py;beginline=3;endline=20;md5=02193721a38fd8a05a4ddeb7df8e294d"
+
+inherit pypi setuptools
+
+SRC_URI[md5sum] = "602b7db8eea30dd29a1d451997adf251"
+SRC_URI[sha256sum] = "a969332887a18a9c98b0df0ea4d4ca75972f24ca94f06fb87d591377e83414f6"
+
diff --git a/external/meta-python2/recipes-devtools/python/python-visitor_0.1.3.bb b/external/meta-python2/recipes-devtools/python/python-visitor_0.1.3.bb
new file mode 100644
index 00000000..12365062
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-visitor_0.1.3.bb
@@ -0,0 +1,8 @@
+SUMMARY = "A tiny pythonic visitor implementation."
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489"
+
+SRC_URI[md5sum] = "94a024ed0ec1b02b4497c15267d319ca"
+SRC_URI[sha256sum] = "2c737903b2b6864ebc6167eef7cf3b997126f1aa94bdf590f90f1436d23e480a"
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-vobject_0.9.6.1.bb b/external/meta-python2/recipes-devtools/python/python-vobject_0.9.6.1.bb
new file mode 100644
index 00000000..d31f2f5a
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-vobject_0.9.6.1.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Python package for parsing and generating vCard and vCalendar files"
+HOMEPAGE = "http://vobject.skyhouseconsulting.com/"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE-2.0.txt;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+SRC_URI[md5sum] = "06357e96a84d55de2a71b36d39f6853e"
+SRC_URI[sha256sum] = "96512aec74b90abb71f6b53898dd7fe47300cc940104c4f79148f0671f790101"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-dateutil \
+ ${PYTHON_PN}-numbers \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-waitress_1.4.2.bb b/external/meta-python2/recipes-devtools/python/python-waitress_1.4.2.bb
new file mode 100644
index 00000000..109f2228
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-waitress_1.4.2.bb
@@ -0,0 +1,19 @@
+SUMMARY = "A WSGI server for Python"
+DESCRIPTION = "Waitress is meant to be a production-quality pure-Python WSGI \
+ server with very acceptable performance."
+HOMEPAGE = "https://github.com/Pylons/waitress"
+SECTION = "devel/python"
+LICENSE = "ZPL-2.1"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=78ccb3640dc841e1baecb3e27a6966b2"
+
+SRC_URI[md5sum] = "fdeed7ec32bbba011e90801208378c89"
+SRC_URI[sha256sum] = "67a60a376f0eb335ed88967c42b73983a58d66a2a72eb9009a42725f7453b142"
+
+inherit setuptools pypi
+
+RDEPENDS_${PN}_append_class-target = "\
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-re \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-wcwidth_0.1.8.bb b/external/meta-python2/recipes-devtools/python/python-wcwidth_0.1.8.bb
new file mode 100644
index 00000000..70e457e4
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-wcwidth_0.1.8.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Library for building powerful interactive command lines in Python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=11fba47286258744a6bc6e43530c32a1"
+
+SRC_URI[md5sum] = "dc6677d099e6f49c0f6fbc310de261e9"
+SRC_URI[sha256sum] = "f28b3e8a6483e5d49e7f8949ac1a78314e740333ae305b4ba5defd3e74fb37a8"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-webcolors_1.8.1.bb b/external/meta-python2/recipes-devtools/python/python-webcolors_1.8.1.bb
new file mode 100644
index 00000000..f59ee402
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-webcolors_1.8.1.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Simple Python module for working with HTML/CSS color definitions."
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=197add016087e6884a012b0f185d44ad"
+
+SRC_URI[md5sum] = "40890db38b2a856e526a568864025fe6"
+SRC_URI[sha256sum] = "030562f624467a9901f0b455fef05486a88cfb5daa1e356bd4aacea043850b59"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN}_class-target = "\
+ ${PYTHON_PN}-stringold \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-webdav_0.1.2.bb b/external/meta-python2/recipes-devtools/python/python-webdav_0.1.2.bb
new file mode 100644
index 00000000..7a6437dc
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-webdav_0.1.2.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "This project aims to provide an object-oriented Python WebDAV client-side library\
+ based on Python`s standard httplib and Greg Stein`s davlib.\
+ The client shall fully support RFCs 4918 (basic specification),\
+ 3744 (access control), and 3253 (versioning)."
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://src/webdav/WebdavClient.py;endline=15;md5=a1520fad859feb7b0d7f05277bc6ce48"
+HOMEPAGE = "http://sourceforge.net/projects/pythonwebdavlib/"
+SRCNAME = "Python_WebDAV_Library"
+DEPENDS = "python"
+
+SRC_URI = "${SOURCEFORGE_MIRROR}/pythonwebdavlib/Python%20WebDAV%20Library%20-%20${PV}/${SRCNAME}-${PV}.zip"
+SRC_URI[md5sum] = "8e49e0ecc5b4327c4f752a544ee10e1a"
+SRC_URI[sha256sum] = "72c029ad1e25de950f59c2f1812d009d2c1691b70e4b5b09f1af9006e8fd5f23"
+
+S = "${WORKDIR}/${SRCNAME}-${PV}"
+
+inherit distutils
+
diff --git a/external/meta-python2/recipes-devtools/python/python-webencodings_0.5.1.bb b/external/meta-python2/recipes-devtools/python/python-webencodings_0.5.1.bb
new file mode 100644
index 00000000..08518533
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-webencodings_0.5.1.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Character encoding aliases for legacy web content"
+LICENSE = "BSD"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e910b35b0ef4e1f665b9a75d6afb7709"
+
+SRC_URI[md5sum] = "32f6e261d52e57bf7e1c4d41546d15b8"
+SRC_URI[sha256sum] = "b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-codecs \
+ ${PYTHON_PN}-json \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-websocket-client_0.57.0.bb b/external/meta-python2/recipes-devtools/python/python-websocket-client_0.57.0.bb
new file mode 100644
index 00000000..0fc21b04
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-websocket-client_0.57.0.bb
@@ -0,0 +1,11 @@
+SUMMARY = "WebSocket client for python. hybi13 is supported."
+HOMEPAGE = "https://github.com/websocket-client/websocket-client.git"
+LICENSE = "LGPL-3.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c4c4a98fbc4836b81c8c64d6ecb01fc1"
+
+inherit pypi setuptools
+
+PYPI_PACKAGE = "websocket_client"
+
+SRC_URI[md5sum] = "8061820da5e1de26a6a1a6996d4eebd5"
+SRC_URI[sha256sum] = "d735b91d6d1692a6a181f2a8c9e0238e5f6373356f561bb9dc4c7af36f452010"
diff --git a/external/meta-python2/recipes-devtools/python/python-werkzeug_0.16.0.bb b/external/meta-python2/recipes-devtools/python/python-werkzeug_0.16.0.bb
new file mode 100644
index 00000000..0fd9bd8c
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-werkzeug_0.16.0.bb
@@ -0,0 +1,51 @@
+SUMMARY = "The Swiss Army knife of Python web development"
+DESCRIPTION = "\
+Werkzeug started as simple collection of various utilities for WSGI \
+applications and has become one of the most advanced WSGI utility modules. \
+It includes a powerful debugger, full featured request and response objects, \
+HTTP utilities to handle entity tags, cache control headers, HTTP dates, \
+cookie handling, file uploads, a powerful URL routing system and a bunch \
+of community contributed addon modules."
+HOMEPAGE = "http://werkzeug.pocoo.org/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=5dc88300786f1c214c1e9827a5229462"
+
+SRC_URI[md5sum] = "5b23b4953efc4f52b1d0b33af6f7cd2d"
+SRC_URI[sha256sum] = "7280924747b5733b246fe23972186c6b348f9ae29724135a6dfc1e53cea433e7"
+
+PYPI_PACKAGE = "Werkzeug"
+
+CLEANBROKEN = "1"
+
+PACKAGES =+ "${PN}-tests"
+FILES_${PN}-tests+= " \
+ ${PYTHON_SITEPACKAGES_DIR}/werkzeug/test* \
+ ${PYTHON_SITEPACKAGES_DIR}/werkzeug/__pycache__/test* \
+ ${PYTHON_SITEPACKAGES_DIR}/werkzeug/contrib/test* \
+ ${PYTHON_SITEPACKAGES_DIR}/werkzeug/contrib/__pycache__/test* \
+"
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-difflib \
+ ${PYTHON_PN}-email \
+ ${PYTHON_PN}-html \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-json \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-netserver \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-pkgutil \
+ ${PYTHON_PN}-pprint \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-unixadmin \
+ ${PYTHON_PN}-zlib \
+"
+
+RDEPENDS_${PN}-tests = " \
+ ${PN} \
+ ${PYTHON_PN}-unittest \
+"
+inherit pypi setuptools
+
diff --git a/external/meta-python2/recipes-devtools/python/python-which_1.1.0.bb b/external/meta-python2/recipes-devtools/python/python-which_1.1.0.bb
new file mode 100644
index 00000000..901fdc76
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-which_1.1.0.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "which.py -- a portable GNU which replacement"
+HOMEPAGE = "http://code.google.com/p/which/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=030b09798681482b9ad12ac47be496ea"
+
+inherit setuptools pypi python-dir
+
+SRCREV = "425bdeeb2d87c36e2313dc4b8d69ff2bb5a02ee9"
+PYPI_SRC_URI = "git://github.com/trentm/which"
+
+S = "${WORKDIR}/git"
+
+do_install_append() {
+ rmdir -p --ignore-fail-on-non-empty ${D}${STAGING_BINDIR_NATIVE}
+ rmdir -p --ignore-fail-on-non-empty ${D}${datadir}
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-whoosh_2.7.4.bb b/external/meta-python2/recipes-devtools/python/python-whoosh_2.7.4.bb
new file mode 100644
index 00000000..70c6674d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-whoosh_2.7.4.bb
@@ -0,0 +1,27 @@
+SUMMARY = "Fast, pure-Python full text indexing, search, and spell checking library."
+DESCRIPTION = "\
+Whoosh is a fast, featureful full-text indexing and searching library \
+implemented in pure Python. Programmers can use it to easily add search \
+functionality to their applications and websites. Every part of how \
+Whoosh works can be extended or replaced to meet your needs exactly."
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=05303186defc6141143629961c7c8a60"
+
+SRC_URI[md5sum] = "893433e9c0525ac043df33e6e04caab2"
+SRC_URI[sha256sum] = "e0857375f63e9041e03fedd5b7541f97cf78917ac1b6b06c1fcc9b45375dda69"
+
+PYPI_PACKAGE = "Whoosh"
+PYPI_PACKAGE_EXT = "zip"
+
+RDEPENDS_${PN} += " \
+ ${PYTHON_PN}-email \
+ ${PYTHON_PN}-multiprocessing \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-numbers \
+ ${PYTHON_PN}-pickle \
+ ${PYTHON_PN}-shell \
+ ${PYTHON_PN}-stringold \
+ ${PYTHON_PN}-subprocess \
+"
+inherit pypi setuptools
+
diff --git a/external/meta-python2/recipes-devtools/python/python-wrapt_1.11.2.bb b/external/meta-python2/recipes-devtools/python/python-wrapt_1.11.2.bb
new file mode 100644
index 00000000..9a9e2f48
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-wrapt_1.11.2.bb
@@ -0,0 +1,34 @@
+SUMMARY = "Module for decorators, wrappers and monkey patching."
+DESCRIPTION = "The aim of the wrapt module is to provide a transparent object \
+proxy for Python, which can be used as the basis for the construction of \
+function wrappers and decorator functions.\
+\
+The wrapt module focuses very much on correctness. It therefore goes way \
+beyond existing mechanisms such as functools.wraps() to ensure that decorators \
+preserve introspectability, signatures, type checking abilities etc. The \
+decorators that can be constructed using this module will work in far more \
+scenarios than typical decorators and provide more predictable and consistent \
+behaviour.\
+\
+To ensure that the overhead is as minimal as possible, a C extension module is \
+used for performance critical components. An automatic fallback to a pure \
+Python implementation is also provided where a target system does not have a \
+compiler to allow the C extension to be compiled."
+HOMEPAGE = "https://github.com/GrahamDumpleton/wrapt"
+SECTION = "devel/python"
+
+LICENSE = "BSD"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=fdfc019b57affbe1d7a32e3d34e83db4"
+
+PYPI_PACKAGE = "wrapt"
+SRC_URI[md5sum] = "cc15c001b129f81eb2f79b15eb99ffe5"
+SRC_URI[sha256sum] = "565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1"
+
+inherit pypi setuptools
+
+S = "${WORKDIR}/${PYPI_PACKAGE}-${PV}"
+
+RDEPENDS_${PN}_append_class-target = "\
+ ${PYTHON_PN}-lang \
+ ${PYTHON_PN}-threading \
+"
diff --git a/external/meta-python2/recipes-devtools/python/python-wtforms_2.2.1.bb b/external/meta-python2/recipes-devtools/python/python-wtforms_2.2.1.bb
new file mode 100644
index 00000000..5511ac38
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-wtforms_2.2.1.bb
@@ -0,0 +1,17 @@
+DESCRIPTION = "A flexible forms validation and rendering library for python web development."
+HOMEPAGE = "https://pypi.python.org/pypi/WTForms"
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=c4660c132770d5d0a5757541f6b79493"
+
+SRC_URI[md5sum] = "41c0008dbe7bd98892c58f7457a46a4a"
+SRC_URI[sha256sum] = "0cdbac3e7f6878086c334aa25dc5a33869a3954e9d1e015130d65a69309b3b61"
+
+PYPI_PACKAGE = "WTForms"
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-netserver \
+ ${PYTHON_PN}-numbers \
+ "
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-xlrd_1.2.0.bb b/external/meta-python2/recipes-devtools/python/python-xlrd_1.2.0.bb
new file mode 100644
index 00000000..c6e7f60b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-xlrd_1.2.0.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Library for developers to extract data from Microsoft Excel (tm) spreadsheet files"
+DESCRIPTION = "Extract data from Excel spreadsheets (.xls and .xlsx,\
+ versions 2.0 onwards) on any platform. Pure Python (2.6, 2.7, 3.2+). \
+Strong support for Excel dates. Unicode-aware."
+HOMEPAGE = "http://www.python-excel.org/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=5f4244d51fcc1e7cc2d43e96891b2f80"
+
+SRC_URI[md5sum] = "e5d5b96924d791b22898b622eb3e918e"
+SRC_URI[sha256sum] = "546eb36cee8db40c3eaa46c351e67ffee6eeb5fa2650b71bc4c758a29a1b29b2"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "${PYTHON_PN}-compression ${PYTHON_PN}-io ${PYTHON_PN}-pprint ${PYTHON_PN}-shell"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-xstatic-font-awesome_4.7.0.0.bb b/external/meta-python2/recipes-devtools/python/python-xstatic-font-awesome_4.7.0.0.bb
new file mode 100644
index 00000000..088bffc1
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-xstatic-font-awesome_4.7.0.0.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "Font Awesome icons packaged for setuptools (easy_install) / pip."
+HOMEPAGE = "https://pypi.python.org/pypi/XStatic-Font-Awesome"
+SECTION = "devel/python"
+LICENSE = "Apache-2"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=313d021898694cd2b0ea6508bdfe51a2"
+
+PYPI_PACKAGE = "XStatic-Font-Awesome"
+
+inherit pypi
+
+SRC_URI[md5sum] = "141a0e9a7e21e82f922573a00ae0c166"
+SRC_URI[sha256sum] = "e01fb480caaa7c7963dcb3328a4700e631bef6070db0e8b685816d220e685f6c"
+
+DEPENDS += " \
+ ${PYTHON_PN}-xstatic \
+ ${PYTHON_PN}-pip \
+ "
+
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-xstatic_1.0.2.bb b/external/meta-python2/recipes-devtools/python/python-xstatic_1.0.2.bb
new file mode 100644
index 00000000..5b58d2c9
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-xstatic_1.0.2.bb
@@ -0,0 +1,16 @@
+
+DESCRIPTION = "XStatic base package with minimal support code"
+HOMEPAGE = "https://pypi.python.org/pypi/XStatic"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://README.txt;md5=1418684272f85f400cebf1b1a255c5cd"
+
+PYPI_PACKAGE = "XStatic"
+
+SRC_URI[md5sum] = "dea172b7b14b0dbcd5ed63075221af4b"
+SRC_URI[sha256sum] = "80b78dfe37bce6dee4343d64c65375a80bcf399b46dd47c0c7d56161568a23a8"
+
+DEPENDS += " \
+ ${PYTHON_PN}-pip \
+ "
+inherit pypi setuptools
diff --git a/external/meta-python2/recipes-devtools/python/python-yappi_1.0.bb b/external/meta-python2/recipes-devtools/python/python-yappi_1.0.bb
new file mode 100644
index 00000000..b217fb29
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-yappi_1.0.bb
@@ -0,0 +1,17 @@
+
+SUMMARY = "Yet Another Python Profiler"
+HOMEPAGE = "http://yappi.googlecode.com/"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=9a193c13f346884e597acdcac7fe9ac8"
+
+SRC_URI[md5sum] = "a545101aa8a435b0780f06f4723f58c8"
+SRC_URI[sha256sum] = "7f814131515d51db62b1a3468bcb84de30499124752806a5a6e11caf0b4344bf"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-pickle \
+ ${PYTHON_PN}-threading \
+ "
diff --git a/external/meta-python2/recipes-devtools/python/python-zipp_0.6.0.bb b/external/meta-python2/recipes-devtools/python/python-zipp_0.6.0.bb
new file mode 100644
index 00000000..df995323
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-zipp_0.6.0.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "Backport of pathlib-compatible object wrapper for zip files"
+HOMEPAGE = "https://github.com/jaraco/zipp"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a33f38bbf47d48c70fe0d40e5f77498e"
+
+SRC_URI[md5sum] = "d4451a749d8a7c3c392a9edd1864a937"
+SRC_URI[sha256sum] = "3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e"
+
+DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
+RDEPENDS_${PN} += "${PYTHON_PN}-more-itertools"
+
+inherit pypi setuptools
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/external/meta-python2/recipes-devtools/python/python-zopeinterface_4.7.1.bb b/external/meta-python2/recipes-devtools/python/python-zopeinterface_4.7.1.bb
new file mode 100644
index 00000000..d2ef64f1
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python-zopeinterface_4.7.1.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Interface definitions for Zope products"
+LICENSE = "ZPL-2.1"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e54fd776274c1b7423ec128974bd9d46"
+
+SRC_URI[md5sum] = "1bc66758275c5eb66d169acba3c8e50e"
+SRC_URI[sha256sum] = "4bb937e998be9d5e345f486693e477ba79e4344674484001a0b646be1d530487"
+
+PYPI_PACKAGE = "zope.interface"
+
+PACKAGES =. "${PN}-test "
+
+RPROVIDES_${PN} += "zope-interfaces"
+
+RDEPENDS_${PN}_class-target += "${PYTHON_PN}-datetime"
+
+FILES_${PN}-dbg += "${PYTHON_SITEPACKAGES_DIR}/*.egg/*/*/.debug"
+FILES_${PN}-dev += "${PYTHON_SITEPACKAGES_DIR}/zope/interface/*.c"
+FILES_${PN}-doc += "${PYTHON_SITEPACKAGES_DIR}/zope/interface/*.txt"
+FILES_${PN}-test += " \
+ ${PYTHON_SITEPACKAGES_DIR}/zope/interface/tests \
+ ${PYTHON_SITEPACKAGES_DIR}/zope/interface/common/tests \
+"
+inherit pypi setuptools
+
+RDEPENDS_${PN}-test += "python-unittest python-doctest"
diff --git a/external/meta-python2/recipes-devtools/python/python.inc b/external/meta-python2/recipes-devtools/python/python.inc
new file mode 100644
index 00000000..a4ba0c54
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python.inc
@@ -0,0 +1,58 @@
+SUMMARY = "The Python Programming Language"
+HOMEPAGE = "http://www.python.org"
+LICENSE = "PSFv2"
+SECTION = "devel/python"
+# bump this on every change in contrib/python/generate-manifest-2.7.py
+INC_PR = "r1"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=203a6dbc802ee896020a47161e759642"
+
+SRC_URI = "http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.xz \
+ "
+
+SRC_URI[sha256sum] = "b62c0e7937551d0cc02b8fd5cb0f544f9405bafc9a54d3808ed4594812edef43"
+
+# python recipe is actually python 2.x
+# also, exclude pre-releases for both python 2.x and 3.x
+UPSTREAM_CHECK_REGEX = "[Pp]ython-(?P<pver>2(\.\d+)+).tar"
+
+CVE_PRODUCT = "python"
+
+# Upstream agreement is that these are not security issues:
+# https://bugs.python.org/issue32367
+CVE_CHECK_WHITELIST += "CVE-2017-17522"
+# https://bugs.python.org/issue32056
+CVE_CHECK_WHITELIST += "CVE-2017-18207"
+
+# Windows-only, "It was determined that this is a longtime behavior
+# of Python that cannot really be altered at this point."
+CVE_CHECK_WHITELIST += "CVE-2015-5652"
+
+# This is not exploitable when glibc has CVE-2016-10739 fixed.
+CVE_CHECK_WHITELIST += "CVE-2019-18348"
+
+PYTHON_MAJMIN = "2.7"
+
+inherit autotools pkgconfig
+
+EXTRA_OECONF = "\
+ --with-threads \
+ --with-pymalloc \
+ --without-cxx-main \
+ --with-signal-module \
+ --enable-shared \
+ --enable-ipv6=${@bb.utils.contains('DISTRO_FEATURES', 'ipv6', 'yes', 'no', d)} \
+ ac_cv_header_bluetooth_bluetooth_h=no ac_cv_header_bluetooth_h=no \
+"
+
+do_configure_prepend() {
+ libdirleaf="$(echo ${libdir} | sed -e 's:${prefix}/::')"
+ sed -i -e "s:SEDMELIBLEAF:${libdirleaf}:g" \
+ ${S}/configure.ac
+}
+
+do_install_append () {
+ sed -i -e 's:${HOSTTOOLS_DIR}/install:install:g' \
+ -e 's:${HOSTTOOLS_DIR}/mkdir:mkdir:g' \
+ ${D}/${libdir}/python${PYTHON_MAJMIN}/_sysconfigdata.py
+}
diff --git a/external/meta-python2/recipes-devtools/python/python/0001-distutils-set-the-prefix-to-be-inside-staging-direct.patch b/external/meta-python2/recipes-devtools/python/python/0001-distutils-set-the-prefix-to-be-inside-staging-direct.patch
new file mode 100644
index 00000000..502f8498
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/0001-distutils-set-the-prefix-to-be-inside-staging-direct.patch
@@ -0,0 +1,51 @@
+From 4cdf2e9df13c6327fcc94d53e4953005543aef3d Mon Sep 17 00:00:00 2001
+From: Alexander Kanavin <alex.kanavin@gmail.com>
+Date: Wed, 6 Apr 2016 17:43:02 +0300
+Subject: [PATCH 01/10] distutils: set the prefix to be inside staging
+ directory
+
+The proper prefix is inside our staging area.
+
+Upstream-Status: Inappropriate [embedded specific]
+Signed-off-by: Michael 'Mickey' Lauer <mickey@vanille-media.de>
+Signed-off-by: Phil Blundell <philb@gnu.org>
+Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com>
+---
+ Lib/distutils/sysconfig.py | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
+index de7da1d..f3aacf7 100644
+--- a/Lib/distutils/sysconfig.py
++++ b/Lib/distutils/sysconfig.py
+@@ -75,7 +75,7 @@ def get_python_inc(plat_specific=0, prefix=None):
+ sys.exec_prefix -- i.e., ignore 'plat_specific'.
+ """
+ if prefix is None:
+- prefix = plat_specific and EXEC_PREFIX or PREFIX
++ prefix = os.environ['STAGING_INCDIR'].rstrip('include')
+
+ if os.name == "posix":
+ if python_build:
+@@ -115,12 +115,16 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
+ If 'prefix' is supplied, use it instead of sys.prefix or
+ sys.exec_prefix -- i.e., ignore 'plat_specific'.
+ """
++ lib_basename = os.environ['STAGING_LIBDIR'].split('/')[-1]
+ if prefix is None:
+- prefix = plat_specific and EXEC_PREFIX or PREFIX
++ if plat_specific:
++ prefix = os.environ['STAGING_LIBDIR'].rstrip(lib_basename)
++ else:
++ prefix = PREFIX
+
+ if os.name == "posix":
+ libpython = os.path.join(prefix,
+- "lib", "python" + get_python_version())
++ lib_basename, "python" + get_python_version())
+ if standard_lib:
+ return libpython
+ else:
+--
+2.8.0.rc3
+
diff --git a/external/meta-python2/recipes-devtools/python/python/0001-python-Resolve-intermediate-staging-issues.patch b/external/meta-python2/recipes-devtools/python/python/0001-python-Resolve-intermediate-staging-issues.patch
new file mode 100644
index 00000000..2ff2ccc4
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/0001-python-Resolve-intermediate-staging-issues.patch
@@ -0,0 +1,59 @@
+From 77bcb3238b2853d511714544e0f84a37be6c79bf Mon Sep 17 00:00:00 2001
+From: Richard Purdie <richard.purdie@linuxfoundation.org>
+Date: Wed, 14 Nov 2012 14:31:24 +0000
+Subject: [PATCH] python: Resolve intermediate staging issues
+
+When cross compiling python, we used to need to install the Makefile, pyconfig.h
+and the python library to their final location before being able to compile the
+rest of python. This change allows us to point python at its own source when
+building, avoiding a variety of sysroot staging issues and simplifying the main
+python recipe.
+
+Upstream-Status: Inappropriate
+RP 2012/11/13
+
+---
+ Lib/distutils/sysconfig.py | 3 +++
+ Lib/sysconfig.py | 5 ++++-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
+index 2f4b8ca..15bceb5 100644
+--- a/Lib/distutils/sysconfig.py
++++ b/Lib/distutils/sysconfig.py
+@@ -31,6 +31,9 @@ else:
+ # sys.executable can be empty if argv[0] has been changed and Python is
+ # unable to retrieve the real program name
+ project_base = os.getcwd()
++_PYTHONBUILDDIR = os.environ.get("PYTHONBUILDDIR", None)
++if _PYTHONBUILDDIR:
++ project_base = _PYTHONBUILDDIR
+ if os.name == "nt" and "pcbuild" in project_base[-8:].lower():
+ project_base = os.path.abspath(os.path.join(project_base, os.path.pardir))
+ # PC/VS7.1
+diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
+index 9c8350d..bddbe2e 100644
+--- a/Lib/sysconfig.py
++++ b/Lib/sysconfig.py
+@@ -93,6 +93,7 @@ _PREFIX = os.path.normpath(sys.prefix)
+ _EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
+ _CONFIG_VARS = None
+ _USER_BASE = None
++_PYTHONBUILDDIR = os.environ.get("PYTHONBUILDDIR", None)
+
+ def _safe_realpath(path):
+ try:
+@@ -100,7 +101,9 @@ def _safe_realpath(path):
+ except OSError:
+ return path
+
+-if sys.executable:
++if _PYTHONBUILDDIR:
++ _PROJECT_BASE = _PYTHONBUILDDIR
++elif sys.executable:
+ _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable))
+ else:
+ # sys.executable can be empty if argv[0] has been changed and Python is
+--
+2.17.1
+
diff --git a/external/meta-python2/recipes-devtools/python/python/0001-python2-use-cc_basename-to-replace-CC-for-checking-c.patch b/external/meta-python2/recipes-devtools/python/python/0001-python2-use-cc_basename-to-replace-CC-for-checking-c.patch
new file mode 100644
index 00000000..6e4f8209
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/0001-python2-use-cc_basename-to-replace-CC-for-checking-c.patch
@@ -0,0 +1,114 @@
+From 3f49be81e31c164654aeb10b65ebade982ca2ed8 Mon Sep 17 00:00:00 2001
+From: Changqing Li <changqing.li@windriver.com>
+Date: Mon, 22 Oct 2018 15:24:48 +0800
+Subject: [PATCH] python2: use cc_basename to replace CC for checking compiler
+
+When working path contains "clang"/"gcc"/"icc", it might be part of $CC
+because of the "--sysroot" parameter. That could cause judgement error
+about clang/gcc/icc compilers. e.g.
+When "icc" is containded in working path, below errors are reported when
+compiling python:
+x86_64-wrs-linux-gcc: error: strict: No such file or directory
+x86_64-wrs-linux-gcc: error: unrecognized command line option '-fp-model'
+
+Here use cc_basename to replace CC for checking compiler to avoid such
+kind of issue.
+
+Upstream-Status: Pending
+
+Signed-off-by: Li Zhou <li.zhou@windriver.com>
+
+Patch orignally from Li Zhou, I just rework it to new version
+
+Signed-off-by: Changqing Li <changqing.li@windriver.com>
+---
+ configure.ac | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index db1c940..dfcd89a 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -684,7 +684,7 @@ AC_MSG_RESULT($with_cxx_main)
+ preset_cxx="$CXX"
+ if test -z "$CXX"
+ then
+- case "$CC" in
++ case "$cc_basename" in
+ gcc) AC_PATH_TOOL(CXX, [g++], [g++], [notfound]) ;;
+ cc) AC_PATH_TOOL(CXX, [c++], [c++], [notfound]) ;;
+ esac
+@@ -757,14 +757,14 @@ rmdir CaseSensitiveTestDir
+
+ case $MACHDEP in
+ bsdos*)
+- case $CC in
++ case $cc_basename in
+ gcc) CC="$CC -D_HAVE_BSDI";;
+ esac;;
+ esac
+
+ case $ac_sys_system in
+ hp*|HP*)
+- case $CC in
++ case $cc_basename in
+ cc|*/cc) CC="$CC -Ae";;
+ esac;;
+ SunOS*)
+@@ -1084,7 +1084,7 @@ then
+ fi
+
+ # Clang also needs -fwrapv
+- case $CC in
++ case $cc_basename in
+ *clang*) WRAP="-fwrapv"
+ ;;
+ esac
+@@ -1304,7 +1304,7 @@ yes)
+ esac
+
+ # ICC needs -fp-model strict or floats behave badly
+-case "$CC" in
++case "$cc_basename" in
+ *icc*)
+ BASECFLAGS="$BASECFLAGS -fp-model strict"
+ ;;
+@@ -1443,7 +1443,7 @@ else
+ fi],
+ [AC_MSG_RESULT(no)])
+ if test "$Py_LTO" = 'true' ; then
+- case $CC in
++ case $cc_basename in
+ *clang*)
+ # Any changes made here should be reflected in the GCC+Darwin case below
+ LTOFLAGS="-flto"
+@@ -1508,7 +1508,7 @@ then
+ fi
+ fi
+ LLVM_PROF_ERR=no
+-case $CC in
++case $cc_basename in
+ *clang*)
+ # Any changes made here should be reflected in the GCC+Darwin case below
+ PGO_PROF_GEN_FLAG="-fprofile-instr-generate"
+@@ -2322,7 +2322,7 @@ then
+ then CCSHARED="-fPIC"
+ else CCSHARED="-Kpic -belf"
+ fi;;
+- IRIX*/6*) case $CC in
++ IRIX*/6*) case $cc_basename in
+ *gcc*) CCSHARED="-shared";;
+ *) CCSHARED="";;
+ esac;;
+@@ -2366,7 +2366,7 @@ then
+ then
+ LINKFORSHARED="-Wl,--export-dynamic"
+ fi;;
+- SunOS/5*) case $CC in
++ SunOS/5*) case $cc_basename in
+ *gcc*)
+ if $CC -Xlinker --help 2>&1 | grep export-dynamic >/dev/null
+ then
+--
+2.7.4
+
diff --git a/external/meta-python2/recipes-devtools/python/python/01-use-proper-tools-for-cross-build.patch b/external/meta-python2/recipes-devtools/python/python/01-use-proper-tools-for-cross-build.patch
new file mode 100644
index 00000000..b02c0945
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/01-use-proper-tools-for-cross-build.patch
@@ -0,0 +1,49 @@
+We need to ensure our host tools get run during build, not the freshly
+built cross-tools (this will not work), so we introduce HOSTPYTHON and HOSTPGEN.
+
+Upstream-Status: Inappropriate [embedded specific]
+
+Signed-off-by: Michael 'Mickey' Lauer <mickey@vanille-media.de>
+Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
+
+Rebased for python-2.7.9
+Signed-off-by: Alejandro Hernandez <alejandro.hernandez@linux.intel.com>
+
+Rebased for python-2.7.14
+Signed-off-by: Derek Straka <derek@asterius.io>
+
+Index: Python-2.7.13/Makefile.pre.in
+===================================================================
+--- Python-2.7.13.orig/Makefile.pre.in
++++ Python-2.7.13/Makefile.pre.in
+@@ -512,7 +513,7 @@ $(BUILDPYTHON): Modules/python.o $(LIBRA
+ $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
+
+ platform: $(BUILDPYTHON) pybuilddir.txt
+- $(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform
++ $(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform
+
+ # Create build directory and generate the sysconfig build-time data there.
+ # pybuilddir.txt contains the name of the build dir and is used for
+Index: Python-2.7.13/setup.py
+===================================================================
+--- Python-2.7.13.orig/setup.py
++++ Python-2.7.13/setup.py
+@@ -350,6 +350,7 @@ class PyBuildExt(build_ext):
+ self.failed.append(ext.name)
+ self.announce('*** WARNING: renaming "%s" since importing it'
+ ' failed: %s' % (ext.name, why), level=3)
++ return
+ assert not self.inplace
+ basename, tail = os.path.splitext(ext_filename)
+ newname = basename + "_failed" + tail
+@@ -574,6 +575,9 @@ class PyBuildExt(build_ext):
+
+ # XXX Omitted modules: gl, pure, dl, SGI-specific modules
+
++ lib_dirs = [ os.getenv("STAGING_LIBDIR"), os.getenv("STAGING_BASELIBDIR") ]
++ inc_dirs = [ os.getenv("STAGING_INCDIR") ]
++
+ #
+ # The following modules are all pretty straightforward, and compile
+ # on pretty much any POSIXish platform.
diff --git a/external/meta-python2/recipes-devtools/python/python/03-fix-tkinter-detection.patch b/external/meta-python2/recipes-devtools/python/python/03-fix-tkinter-detection.patch
new file mode 100644
index 00000000..650ceb59
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/03-fix-tkinter-detection.patch
@@ -0,0 +1,46 @@
+Upstream-Status: Inappropriate [embedded specific]
+
+We need to supply STAGING_INCDIR here, otherwise the Tk headers
+will not be found.
+
+Signed-off-by: Michael 'Mickey' Lauer <mickey@vanille.de>
+Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
+
+Rebased for python-2.7.9
+
+diff --git a/setup.py b/setup.py
+index 8fe1fb8..67eda74 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1892,7 +1892,7 @@ class PyBuildExt(build_ext):
+ dotversion = dotversion[:-1] + '.' + dotversion[-1]
+ tcl_include_sub = []
+ tk_include_sub = []
+- for dir in inc_dirs:
++ for dir in [os.getenv("STAGING_INCDIR")]:
+ tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
+ tk_include_sub += [dir + os.sep + "tk" + dotversion]
+ tk_include_sub += tcl_include_sub
+@@ -1911,22 +1911,6 @@ class PyBuildExt(build_ext):
+ if dir not in include_dirs:
+ include_dirs.append(dir)
+
+- # Check for various platform-specific directories
+- if host_platform == 'sunos5':
+- include_dirs.append('/usr/openwin/include')
+- added_lib_dirs.append('/usr/openwin/lib')
+- elif os.path.exists('/usr/X11R6/include'):
+- include_dirs.append('/usr/X11R6/include')
+- added_lib_dirs.append('/usr/X11R6/lib64')
+- added_lib_dirs.append('/usr/X11R6/lib')
+- elif os.path.exists('/usr/X11R5/include'):
+- include_dirs.append('/usr/X11R5/include')
+- added_lib_dirs.append('/usr/X11R5/lib')
+- else:
+- # Assume default location for X11
+- include_dirs.append('/usr/X11/include')
+- added_lib_dirs.append('/usr/X11/lib')
+-
+ # If Cygwin, then verify that X is installed before proceeding
+ if host_platform == 'cygwin':
+ x11_inc = find_file('X11/Xlib.h', [], include_dirs)
diff --git a/external/meta-python2/recipes-devtools/python/python/05-enable-ctypes-cross-build.patch b/external/meta-python2/recipes-devtools/python/python/05-enable-ctypes-cross-build.patch
new file mode 100644
index 00000000..5cc87424
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/05-enable-ctypes-cross-build.patch
@@ -0,0 +1,27 @@
+Rebased for python 2.7.9
+
+Upstream-Status: Inappropriate [embedded specific]
+
+# CTypes need to know the actual host we are building on.
+# Signed-Off: Michael Dietrich <mdt@emdete.de>
+
+Index: Python-2.7.9/setup.py
+===================================================================
+--- Python-2.7.9.orig/setup.py
++++ Python-2.7.9/setup.py
+@@ -2028,12 +2028,12 @@ class PyBuildExt(build_ext):
+
+ # Pass empty CFLAGS because we'll just append the resulting
+ # CFLAGS to Python's; -g or -O2 is to be avoided.
+- cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
+- % (ffi_builddir, ffi_srcdir, " ".join(config_args))
++ cmd = "(cd %s && autoconf -W cross) && (cd %s && env CFLAGS='' '%s/configure' %s)" \
++ % (ffi_srcdir, ffi_builddir, ffi_srcdir, " ".join(config_args))
+
+ res = os.system(cmd)
+ if res or not os.path.exists(ffi_configfile):
+- print "Failed to configure _ctypes module"
++ print "Failed to configure _ctypes module (res=%d) or missing conffile=%s" % ( res, ffi_configfile )
+ return False
+
+ fficonfig = {}
diff --git a/external/meta-python2/recipes-devtools/python/python/06-avoid_usr_lib_termcap_path_in_linking.patch b/external/meta-python2/recipes-devtools/python/python/06-avoid_usr_lib_termcap_path_in_linking.patch
new file mode 100644
index 00000000..435b3190
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/06-avoid_usr_lib_termcap_path_in_linking.patch
@@ -0,0 +1,35 @@
+Upstream-Status: Pending
+
+The poison directories patch has detected library path issue while
+compiling the python in cross environment, as seen bellow.
+
+warning: library search path "/usr/lib/termcap" is unsafe for cross-compilation
+
+This Patch fixes this issue in the python build environment.
+11 Oct 2010
+Nitin A Kamble <nitin.a.kamble@intel.com>
+
+2011/09/29
+Rebased for python 2.7.2
+Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
+
+Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
+
+diff --git a/setup.py b/setup.py
+index 67eda74..59c537e 100644
+--- a/setup.py
++++ b/setup.py
+@@ -761,12 +761,10 @@ class PyBuildExt(build_ext):
+ pass # Issue 7384: Already linked against curses or tinfo.
+ elif curses_library:
+ readline_libs.append(curses_library)
+- elif self.compiler.find_library_file(lib_dirs +
+- ['/usr/lib/termcap'],
++ elif self.compiler.find_library_file(lib_dirs,
+ 'termcap'):
+ readline_libs.append('termcap')
+ exts.append( Extension('readline', ['readline.c'],
+- library_dirs=['/usr/lib/termcap'],
+ extra_link_args=readline_extra_link_args,
+ libraries=readline_libs) )
+ else:
diff --git a/external/meta-python2/recipes-devtools/python/python/add-CROSSPYTHONPATH-for-PYTHON_FOR_BUILD.patch b/external/meta-python2/recipes-devtools/python/python/add-CROSSPYTHONPATH-for-PYTHON_FOR_BUILD.patch
new file mode 100644
index 00000000..32973406
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/add-CROSSPYTHONPATH-for-PYTHON_FOR_BUILD.patch
@@ -0,0 +1,28 @@
+configure.ac: add CROSSPYTHONPATH into PYTHONPATH for PYTHON_FOR_BUILD
+
+When building x86->x86 the system will try to execute .so and related items
+from the default PYTHONPATH. This will fail if the target CPU contains
+instructions that the host CPU does not have, add CROSSPYTHONPATH
+into PYTHONPATH so we can prepend the list to find correct libs.
+
+Upstream-Status: Inappropriate [OE-Core integration specific]
+
+Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
+Signed-off-by: Jackie Huang <jackie.huang@windriver.com>
+---
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+Index: Python-2.7.14/configure.ac
+===================================================================
+--- Python-2.7.14.orig/configure.ac
++++ Python-2.7.14/configure.ac
+@@ -36,7 +36,7 @@ if test "$cross_compiling" = yes; then
+ AC_MSG_ERROR([python$PACKAGE_VERSION interpreter not found])
+ fi
+ AC_MSG_RESULT($interp)
+- PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`:)$(srcdir)/Lib:$(srcdir)/Lib/$(PLATDIR) '$interp
++ PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(CROSSPYTHONPATH):$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`:)$(srcdir)/Lib:$(srcdir)/Lib/plat-$(MACHDEP) '$interp
+ fi
+ elif test "$cross_compiling" = maybe; then
+ AC_MSG_ERROR([Cross compiling required --host=HOST-TUPLE and --build=ARCH])
diff --git a/external/meta-python2/recipes-devtools/python/python/add-md5module-support.patch b/external/meta-python2/recipes-devtools/python/python/add-md5module-support.patch
new file mode 100644
index 00000000..33fea775
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/add-md5module-support.patch
@@ -0,0 +1,18 @@
+
+Upstream-Status: Inappropriate [configuration]
+
+Signed-off-by: Saul Wold <sgw@linux.intel.com>
+
+Index: Python-2.7.2/Modules/Setup.dist
+===================================================================
+--- Python-2.7.2.orig/Modules/Setup.dist 2011-06-11 08:46:26.000000000 -0700
++++ Python-2.7.2/Modules/Setup.dist 2011-12-27 15:51:41.244623219 -0800
+@@ -248,7 +248,7 @@
+ # Message-Digest Algorithm, described in RFC 1321. The necessary files
+ # md5.c and md5.h are included here.
+
+-#_md5 md5module.c md5.c
++_md5 md5module.c md5.c
+
+
+ # The _sha module implements the SHA checksum algorithms.
diff --git a/external/meta-python2/recipes-devtools/python/python/avoid_warning_about_tkinter.patch b/external/meta-python2/recipes-devtools/python/python/avoid_warning_about_tkinter.patch
new file mode 100644
index 00000000..287095f6
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/avoid_warning_about_tkinter.patch
@@ -0,0 +1,29 @@
+_tkinter module needs tk module along with tcl. tk is not yet integrated
+in yocto so we skip the check for this module.
+Avoid a warning by not adding this module to missing variable.
+
+Upstream-Status: Inappropriate [distribution]
+
+Also simply disable the tk module since its not in DEPENDS.
+Signed-off-by: Andrei Gherzan <andrei@gherzan.ro>
+
+Index: Python-2.7.13/setup.py
+===================================================================
+--- Python-2.7.13.orig/setup.py
++++ Python-2.7.13/setup.py
+@@ -1783,10 +1783,12 @@ class PyBuildExt(build_ext):
+ self.extensions.extend(exts)
+
+ # Call the method for detecting whether _tkinter can be compiled
+- self.detect_tkinter(inc_dirs, lib_dirs)
++ # self.detect_tkinter(inc_dirs, lib_dirs)
+
+- if '_tkinter' not in [e.name for e in self.extensions]:
+- missing.append('_tkinter')
++ # tkinter module will not be avalaible as yocto
++ # doesn't have tk integrated (yet)
++ #if '_tkinter' not in [e.name for e in self.extensions]:
++ # missing.append('_tkinter')
+
+ ## # Uncomment these lines if you want to play with xxmodule.c
+ ## ext = Extension('xx', ['xxmodule.c'])
diff --git a/external/meta-python2/recipes-devtools/python/python/avoid_warning_for_sunos_specific_module.patch b/external/meta-python2/recipes-devtools/python/python/avoid_warning_for_sunos_specific_module.patch
new file mode 100644
index 00000000..8ba58230
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/avoid_warning_for_sunos_specific_module.patch
@@ -0,0 +1,23 @@
+sunaudiodev module is sunos specific so we avoid a warning by not
+adding this module to missing variable.
+
+Upstream-Status: Inappropriate [distribution]
+
+Signed-off-by: Andrei Gherzan <andrei@gherzan.ro>
+
+Index: Python-2.7.13/setup.py
+===================================================================
+--- Python-2.7.13.orig/setup.py
++++ Python-2.7.13/setup.py
+@@ -1671,8 +1671,9 @@ class PyBuildExt(build_ext):
+ if host_platform == 'sunos5':
+ # SunOS specific modules
+ exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
+- else:
+- missing.append('sunaudiodev')
++ # If platform is not sunos warning is useless
++ #else:
++ # missing.append('sunaudiodev')
+
+ if host_platform == 'darwin':
+ # _scproxy
diff --git a/external/meta-python2/recipes-devtools/python/python/cgi_py.patch b/external/meta-python2/recipes-devtools/python/python/cgi_py.patch
new file mode 100644
index 00000000..de504f9d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/cgi_py.patch
@@ -0,0 +1,23 @@
+Lib/cgi.py: Update the script as mentioned in the comment
+
+Upstream-Status: Inappropriate [distribution]
+
+Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
+
+--- Python-2.6.6/Lib/cgi.py.orig 2010-08-01 22:14:27.000000000 -0500
++++ Python-2.6.6/Lib/cgi.py 2011-09-21 15:28:40.478208631 -0500
+@@ -1,13 +1,4 @@
+-#! /usr/local/bin/python
+-
+-# NOTE: the above "/usr/local/bin/python" is NOT a mistake. It is
+-# intentionally NOT "/usr/bin/env python". On many systems
+-# (e.g. Solaris), /usr/local/bin is not in $PATH as passed to CGI
+-# scripts, and /usr/local/bin is the default directory where Python is
+-# installed, so /usr/bin/env would be unable to find python. Granted,
+-# binary installations by Linux vendors often install Python in
+-# /usr/bin. So let those vendors patch cgi.py to match their choice
+-# of installation.
++#! /usr/bin/env python
+
+ """Support module for CGI (Common Gateway Interface) scripts.
+
diff --git a/external/meta-python2/recipes-devtools/python/python/check-if-target-is-64b-not-host.patch b/external/meta-python2/recipes-devtools/python/python/check-if-target-is-64b-not-host.patch
new file mode 100644
index 00000000..e6d6c65b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/check-if-target-is-64b-not-host.patch
@@ -0,0 +1,57 @@
+Author: Andrei Gherzan <andrei@gherzan.ro>
+Date: Sun Mar 25 02:02:27 2012 +0200
+
+This patch was added for 64bit host machines. In the compile process python
+is checking if platform is a 64bit platform using sys.maxint which is the host's
+value. The patch fixes this issue so that python would check if TARGET machine
+is 64bit not the HOST machine. In this way will have "dl" and "imageop" modules
+built if HOST machine is 64bit but the target machine is 32bit.
+
+Signed-off-by: Andrei Gherzan <andrei@gherzan.ro>
+
+Upstream-Status: Pending
+
+Index: Python-2.7.11/setup.py
+===================================================================
+--- Python-2.7.11.orig/setup.py
++++ Python-2.7.11/setup.py
+@@ -35,6 +35,21 @@ COMPILED_WITH_PYDEBUG = ('--with-pydebug
+ # This global variable is used to hold the list of modules to be disabled.
+ disabled_module_list = []
+
++def target_is_64bit_platform ():
++ """
++ In case of cross-compile, some modules are not build as setup checks if HOST
++ is 64bit and not TARGET.
++ As python was built for TARGET we can check this in pyconfig.h in this way:
++ Sizeof LONG on a 32 bit platform is 4 bytes
++ Sizeof LONG on a 64 bit platform is 8 bytes
++ """
++ pyconf = open("pyconfig.h").read()
++ aux = re.search(r"#s*define\s+SIZEOF_LONG\s+8\s*", pyconf)
++ if aux is not None:
++ return True
++ else:
++ return False
++
+ def add_dir_to_list(dirlist, dir):
+ """Add the directory 'dir' to the list 'dirlist' (at the front) if
+ 1) 'dir' is not already in 'dirlist'
+@@ -716,7 +731,7 @@ class PyBuildExt(build_ext):
+ exts.append( Extension('audioop', ['audioop.c']) )
+
+ # Disabled on 64-bit platforms
+- if sys.maxsize != 9223372036854775807L:
++ if not target_is_64bit_platform():
+ # Operations on images
+ exts.append( Extension('imageop', ['imageop.c']) )
+ else:
+@@ -1545,7 +1560,7 @@ class PyBuildExt(build_ext):
+ missing.append('_codecs_%s' % loc)
+
+ # Dynamic loading module
+- if sys.maxint == 0x7fffffff:
++ if not target_is_64bit_platform():
+ # This requires sizeof(int) == sizeof(long) == sizeof(char*)
+ dl_inc = find_file('dlfcn.h', [], inc_dirs)
+ if (dl_inc is not None) and (host_platform not in ['atheos']):
diff --git a/external/meta-python2/recipes-devtools/python/python/create_manifest2.py b/external/meta-python2/recipes-devtools/python/python/create_manifest2.py
new file mode 100644
index 00000000..34659515
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/create_manifest2.py
@@ -0,0 +1,298 @@
+# This script is used as a bitbake task to create a new python manifest
+# $ bitbake python -c create_manifest
+#
+# Our goal is to keep python-core as small as posible and add other python
+# packages only when the user needs them, hence why we split upstream python
+# into several packages.
+#
+# In a very simplistic way what this does is:
+# Launch python and see specifically what is required for it to run at a minimum
+#
+# Go through the python-manifest file and launch a separate task for every single
+# one of the files on each package, this task will check what was required for that
+# specific module to run, these modules will be called dependencies.
+# The output of such task will be a list of the modules or dependencies that were
+# found for that file.
+#
+# Such output will be parsed by this script, we will look for each dependency on the
+# manifest and if we find that another package already includes it, then we will add
+# that package as an RDEPENDS to the package we are currently checking; in case we dont
+# find the current dependency on any other package we will add it to the current package
+# as part of FILES.
+#
+#
+# This way we will create a new manifest from the data structure that was built during
+# this process, on this new manifest each package will contain specifically only
+# what it needs to run.
+#
+# There are some caveats which we try to deal with, such as repeated files on different
+# packages, packages that include folders, wildcards, and special packages.
+# Its also important to note that this method only works for python files, and shared
+# libraries. Static libraries, header files and binaries need to be dealt with manually.
+#
+# Author: Alejandro Enedino Hernandez Samaniego "aehs29" <aehs29 at gmail dot com>
+
+
+import sys
+import subprocess
+import json
+import os
+import collections
+
+# Hack to get native python search path (for folders), not fond of it but it works for now
+pivot='recipe-sysroot-native'
+for p in sys.path:
+ if pivot in p:
+ nativelibfolder=p[:p.find(pivot)+len(pivot)]
+
+# Empty dict to hold the whole manifest
+new_manifest = collections.OrderedDict()
+
+# Check for repeated files, folders and wildcards
+allfiles=[]
+repeated=[]
+wildcards=[]
+
+hasfolders=[]
+allfolders=[]
+
+def isFolder(value):
+ if os.path.isdir(value.replace('${libdir}',nativelibfolder+'/usr/lib')) or os.path.isdir(value.replace('${libdir}',nativelibfolder+'/usr/lib64')) or os.path.isdir(value.replace('${libdir}',nativelibfolder+'/usr/lib32')):
+ return True
+ else:
+ return False
+
+def prepend_comments(comments, json_manifest):
+ with open(json_manifest, 'r+') as manifest:
+ json_contents = manifest.read()
+ manifest.seek(0, 0)
+ manifest.write(comments + json_contents)
+
+# Read existing JSON manifest
+with open('python2-manifest.json') as manifest:
+ # The JSON format doesn't allow comments so we hack the call to keep the comments using a marker
+ manifest_str = manifest.read()
+ json_start = manifest_str.find('# EOC') + 6 # EOC + \n
+ manifest.seek(0)
+ comments = manifest.read(json_start)
+ manifest_str = manifest.read()
+ old_manifest = json.loads(manifest_str, object_pairs_hook=collections.OrderedDict)
+
+# First pass to get core-package functionality, because we base everything on the fact that core is actually working
+# Not exactly the same so it should not be a function
+print ("Getting dependencies for core package:")
+
+# Special call to check for core package
+output = subprocess.check_output([sys.executable, 'get_module_deps2.py', 'python-core-package'])
+for item in output.split():
+ # We append it so it doesnt hurt what we currently have:
+ if item not in old_manifest['core']['files']:
+ # We use the same data structure since its the one which will be used to check
+ # dependencies for other packages
+ old_manifest['core']['files'].append(item)
+
+for value in old_manifest['core']['files']:
+ # Ignore folders, since we don't import those, difficult to handle multilib
+ if isFolder(value):
+ # Pass it directly
+ if value not in old_manifest['core']['files']:
+ old_manifest['core']['files'].append(value)
+ # Ignore binaries, since we don't import those, assume it was added correctly (manually)
+ if '${bindir}' in value:
+ # Pass it directly
+ if value not in old_manifest['core']['files']:
+ old_manifest['core']['files'].append(value)
+ continue
+ # Ignore empty values
+ if value == '':
+ continue
+ if '${includedir}' in value:
+ if value not in old_manifest['core']['files']:
+ old_manifest['core']['files'].append(value)
+ continue
+ # Get module name , shouldnt be affected by libdir/bindir
+ value = os.path.splitext(os.path.basename(os.path.normpath(value)))[0]
+
+
+ # Launch separate task for each module for deterministic behavior
+ # Each module will only import what is necessary for it to work in specific
+ print ('Getting dependencies for module: %s' % value)
+ output = subprocess.check_output([sys.executable, 'get_module_deps2.py', '%s' % value])
+ for item in output.split():
+ # We append it so it doesnt hurt what we currently have:
+ if item not in old_manifest['core']['files']:
+ old_manifest['core']['files'].append(item)
+
+# We check which packages include folders
+for key in old_manifest:
+ for value in old_manifest[key]['files']:
+ # Ignore folders, since we don't import those, difficult to handle multilib
+ if isFolder(value):
+ print ('%s is a folder' % value)
+ if key not in hasfolders:
+ hasfolders.append(key)
+ if value not in allfolders:
+ allfolders.append(value)
+
+for key in old_manifest:
+ # Use an empty dict as data structure to hold data for each package and fill it up
+ new_manifest[key] = collections.OrderedDict()
+ new_manifest[key]['summary'] = old_manifest[key]['summary']
+ new_manifest[key]['rdepends']=[]
+ new_manifest[key]['files'] = []
+
+ # All packages should depend on core
+ if key != 'core':
+ new_manifest[key]['rdepends'].append('core')
+
+ # Handle special cases, we assume that when they were manually added
+ # to the manifest we knew what we were doing.
+ print ('Handling package %s' % key)
+ special_packages=['misc', 'modules', 'tests', 'dev']
+ if key in special_packages or 'staticdev' in key:
+ print('Passing %s package directly' % key)
+ new_manifest[key]=old_manifest[key]
+ continue
+
+ for value in old_manifest[key]['files']:
+ # We already handled core on the first pass
+ if key == 'core':
+ new_manifest[key]['files'].append(value)
+ continue
+ # Ignore folders, since we don't import those, difficult to handle multilib
+ if isFolder(value):
+ # Pass folders directly
+ new_manifest[key]['files'].append(value)
+ # Ignore binaries, since we don't import those
+ if '${bindir}' in value:
+ # Pass it directly to the new manifest data structure
+ if value not in new_manifest[key]['files']:
+ new_manifest[key]['files'].append(value)
+ continue
+ # Ignore empty values
+ if value == '':
+ continue
+ if '${includedir}' in value:
+ if value not in new_manifest[key]['files']:
+ new_manifest[key]['files'].append(value)
+ continue
+ # Get module name , shouldnt be affected by libdir/bindir
+ value = os.path.splitext(os.path.basename(os.path.normpath(value)))[0]
+
+ # Launch separate task for each module for deterministic behavior
+ # Each module will only import what is necessary for it to work in specific
+ print ('Getting dependencies for module: %s' % value)
+ output = subprocess.check_output([sys.executable, 'get_module_deps2.py', '%s' % value])
+
+ # We can print dependencies for debugging purposes
+ #print (output)
+ # Output will have all dependencies
+ for item in output.split():
+
+ # Warning: This first part is ugly
+ # One of the dependencies that was found, could be inside of one of the folders included by another package
+ # We need to check if this happens so we can add the package containing the folder as an RDEPENDS
+ # e.g. Folder encodings contained in codecs
+ # This would be solved if no packages included any folders
+
+ # This can be done in two ways:
+ # 1 - We assume that if we take out the filename from the path we would get
+ # the folder string, then we would check if folder string is in the list of folders
+ # This would not work if a package contains a folder which contains another folder
+ # e.g. path/folder1/folder2/filename folder_string= path/folder1/folder2
+ # folder_string would not match any value contained in the list of folders
+ #
+ # 2 - We do it the other way around, checking if the folder is contained in the path
+ # e.g. path/folder1/folder2/filename folder_string= path/folder1/folder2
+ # is folder_string inside path/folder1/folder2/filename?,
+ # Yes, it works, but we waste a couple of milliseconds.
+
+ inFolders=False
+ for folder in allfolders:
+ # The module could have a directory named after it, e.g. xml, if we take out the filename from the path
+ # we'll end up with ${libdir}, and we want ${libdir}/xml
+ if isFolder(item):
+ check_path = item
+ else:
+ check_path = os.path.dirname(item)
+ if folder in check_path :
+ inFolders = True # Did we find a folder?
+ folderFound = False # Second flag to break inner for
+ # Loop only through packages which contain folders
+ for keyfolder in hasfolders:
+ if (folderFound == False):
+ #print("Checking folder %s on package %s" % (item,keyfolder))
+ for file_folder in old_manifest[keyfolder]['files']:
+ if file_folder==folder:
+ print ('%s found in %s' % (folder, keyfolder))
+ folderFound = True
+ if keyfolder not in new_manifest[key]['rdepends'] and keyfolder != key:
+ new_manifest[key]['rdepends'].append(keyfolder)
+ else:
+ break
+
+ # A folder was found so we're done with this item, we can go on
+ if inFolders:
+ continue
+
+ # We might already have it on the dictionary since it could depend on a (previously checked) module
+ if item not in new_manifest[key]['files']:
+ # Handle core as a special package, we already did it so we pass it to NEW data structure directly
+ if key=='core':
+ print('Adding %s to %s FILES' % (item, key))
+ if item.endswith('*'):
+ wildcards.append(item)
+ new_manifest[key]['files'].append(item)
+
+ # Check for repeated files
+ if item not in allfiles:
+ allfiles.append(item)
+ else:
+ repeated.append(item)
+
+ else:
+
+ # Check if this dependency is already contained on another package, so we add it
+ # as an RDEPENDS, or if its not, it means it should be contained on the current
+ # package, so we should add it to FILES
+ for newkey in old_manifest:
+ # Debug
+ #print("Checking %s " % item + " in %s" % newkey)
+ if item in old_manifest[newkey]['files']:
+ # Since were nesting, we need to check its not the same key
+ if(newkey!=key):
+ if newkey not in new_manifest[key]['rdepends']:
+ # Add it to the new manifest data struct
+ # Debug
+ print('Adding %s to %s RDEPENDS, because it contains %s' % (newkey, key, item))
+ new_manifest[key]['rdepends'].append(newkey)
+ break
+ else:
+ # Debug
+ print('Adding %s to %s FILES' % (item, key))
+ # Since it wasnt found on another package, its not an RDEP, so add it to FILES for this package
+ new_manifest[key]['files'].append(item)
+ if item.endswith('*'):
+ wildcards.append(item)
+ if item not in allfiles:
+ allfiles.append(item)
+ else:
+ repeated.append(item)
+
+print ('The following files are repeated (contained in more than one package), please check which package should get it:')
+print (repeated)
+print('The following files contain wildcards, please check they are necessary')
+print(wildcards)
+print('The following files contain folders, please check they are necessary')
+print(hasfolders)
+
+# Sort it just so it looks nice
+for key in new_manifest:
+ new_manifest[key]['files'].sort()
+ new_manifest[key]['rdepends'].sort()
+
+# Create the manifest from the data structure that was built
+with open('python2-manifest.json.new','w') as outfile:
+ json.dump(new_manifest,outfile, indent=4)
+
+prepend_comments(comments,'python2-manifest.json.new')
diff --git a/external/meta-python2/recipes-devtools/python/python/fix_for_using_different_libdir.patch b/external/meta-python2/recipes-devtools/python/python/fix_for_using_different_libdir.patch
new file mode 100644
index 00000000..d41b6cfc
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/fix_for_using_different_libdir.patch
@@ -0,0 +1,77 @@
+Upstream-Status: Inappropriate [Embedded specific]
+
+This patch fixes issuing with different libdir like lib64.
+This patch makes the native python binary modules findable
+in the install process of the host python.
+
+Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
+Date: 2012/03/14
+
+Updated for python 2.7.3
+Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
+Date: 2012/05/01
+
+Rebased for python-2.7.9
+Signed-off-by: Alejandro Hernandez <alejandro.hernandez@linux.intel.com>
+
+
+Index: Python-2.7.9/Lib/sysconfig.py
+===================================================================
+--- Python-2.7.9.orig/Lib/sysconfig.py
++++ Python-2.7.9/Lib/sysconfig.py
+@@ -9,7 +9,7 @@ _INSTALL_SCHEMES = {
+ 'posix_prefix': {
+ 'stdlib': '{base}/'+sys.lib+'/python{py_version_short}',
+ 'platstdlib': '{platbase}/'+sys.lib+'/python{py_version_short}',
+- 'purelib': '{base}/lib/python{py_version_short}/site-packages',
++ 'purelib': '{base}/'+sys.lib+'/python{py_version_short}/site-packages',
+ 'platlib': '{platbase}/'+sys.lib+'/python{py_version_short}/site-packages',
+ 'include': '{base}/include/python{py_version_short}',
+ 'platinclude': '{platbase}/include/python{py_version_short}',
+@@ -67,7 +67,7 @@ _INSTALL_SCHEMES = {
+ 'posix_user': {
+ 'stdlib': '{userbase}/'+sys.lib+'/python{py_version_short}',
+ 'platstdlib': '{userbase}/'+sys.lib+'/python{py_version_short}',
+- 'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
++ 'purelib': '{userbase}/'+sys.lib+'/python{py_version_short}/site-packages',
+ 'platlib': '{userbase}/'+sys.lib+'/python{py_version_short}/site-packages',
+ 'include': '{userbase}/include/python{py_version_short}',
+ 'scripts': '{userbase}/bin',
+Index: Python-2.7.9/Makefile.pre.in
+===================================================================
+--- Python-2.7.9.orig/Makefile.pre.in
++++ Python-2.7.9/Makefile.pre.in
+@@ -1037,27 +1037,27 @@ libinstall: build_all $(srcdir)/Lib/$(PL
+ $(INSTALL_DATA) $(srcdir)/Modules/xxmodule.c \
+ $(DESTDIR)$(LIBDEST)/distutils/tests ; \
+ fi
+- PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++ PYTHONPATH=$(DESTDIR)$(LIBDEST):${CROSSPYTHONPATH} $(RUNSHARED) \
+ $(PYTHON_FOR_BUILD) -Wi -tt $(DESTDIR)$(LIBDEST)/compileall.py \
+ -d $(LIBDEST) -f \
+ -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
+ $(DESTDIR)$(LIBDEST)
+- PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++ PYTHONPATH=$(DESTDIR)$(LIBDEST):${CROSSPYTHONPATH} $(RUNSHARED) \
+ $(PYTHON_FOR_BUILD) -Wi -tt -O $(DESTDIR)$(LIBDEST)/compileall.py \
+ -d $(LIBDEST) -f \
+ -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
+ $(DESTDIR)$(LIBDEST)
+- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++ -PYTHONPATH=$(DESTDIR)$(LIBDEST):${CROSSPYTHONPATH} $(RUNSHARED) \
+ $(PYTHON_FOR_BUILD) -Wi -t $(DESTDIR)$(LIBDEST)/compileall.py \
+ -d $(LIBDEST)/site-packages -f \
+ -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
+- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++ -PYTHONPATH=$(DESTDIR)$(LIBDEST):${CROSSPYTHONPATH} $(RUNSHARED) \
+ $(PYTHON_FOR_BUILD) -Wi -t -O $(DESTDIR)$(LIBDEST)/compileall.py \
+ -d $(LIBDEST)/site-packages -f \
+ -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
+- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++ -PYTHONPATH=$(DESTDIR)$(LIBDEST):${CROSSPYTHONPATH} $(RUNSHARED) \
+ $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt
+- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++ -PYTHONPATH=$(DESTDIR)$(LIBDEST):${CROSSPYTHONPATH} $(RUNSHARED) \
+ $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
+
+ # Create the PLATDIR source directory, if one wasn't distributed..
diff --git a/external/meta-python2/recipes-devtools/python/python/float-endian.patch b/external/meta-python2/recipes-devtools/python/python/float-endian.patch
new file mode 100644
index 00000000..8a5c90ae
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/float-endian.patch
@@ -0,0 +1,216 @@
+Python uses AC_RUN_IFELSE to determine the byte order for floats and doubles,
+and falls back onto "I don't know" if it can't run code. This results in
+crippled floating point numbers in Python, and the regression tests fail.
+
+Instead of running code, take a macro from autoconf-archive which compiles C
+with a special double in which has an ASCII representation, and then greps the
+binary to identify the format.
+
+Upstream-Status: Backport
+Signed-off-by: Ross Burton <ross.burton@intel.com>
+
+From 253f47b28120c42cfe53a4e2f5ed0ab0ed469deb Mon Sep 17 00:00:00 2001
+From: Ross Burton <ross@burtonini.com>
+Date: Wed, 19 Sep 2018 07:25:48 +0100
+Subject: [PATCH] closes bpo-34585: Don't do runtime test to get float byte
+ order. (GH-9085)
+
+Currently configure.ac uses AC_RUN_IFELSE to determine the byte order of doubles, but this silently fails under cross compilation and Python doesn't do floats properly.
+
+Instead, steal a macro from autoconf-archive which compiles code using magic doubles (which encode to ASCII) and grep for the representation in the binary.
+
+RFC because this doesn't yet handle the weird ancient ARMv4 OABI 'mixed-endian' encoding properly. This encoding is ancient and I don't believe the union of "Python 3.8 users" and "OABI users" has anything in. Should the support for this just be dropped too? Alternatively, someone will need to find an OABI toolchain to verify the encoding of the magic double.
+
+Signed-off-by: Ross Burton <ross.burton@intel.com>
+---
+ .../Build/2018-09-18-16-28-31.bpo-34585.CGMu0h.rst | 3 +
+ configure.ac | 76 ++++----------------
+ m4/ax_c_float_words_bigendian.m4 | 83 ++++++++++++++++++++++
+ 3 files changed, 99 insertions(+), 63 deletions(-)
+ create mode 100644 Misc/NEWS.d/next/Build/2018-09-18-16-28-31.bpo-34585.CGMu0h.rst
+ create mode 100644 m4/ax_c_float_words_bigendian.m4
+
+diff --git a/configure.ac b/configure.ac
+index 913d5469d0..7672735396 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -3835,74 +3835,24 @@ fi],
+ # * Check for various properties of floating point *
+ # **************************************************
+
+-AC_MSG_CHECKING(whether C doubles are little-endian IEEE 754 binary64)
+-AC_CACHE_VAL(ac_cv_little_endian_double, [
+-AC_RUN_IFELSE([AC_LANG_SOURCE([[
+-#include <string.h>
+-int main() {
+- double x = 9006104071832581.0;
+- if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
+- return 0;
+- else
+- return 1;
+-}
+-]])],
+-[ac_cv_little_endian_double=yes],
+-[ac_cv_little_endian_double=no],
+-[ac_cv_little_endian_double=no])])
+-AC_MSG_RESULT($ac_cv_little_endian_double)
+-if test "$ac_cv_little_endian_double" = yes
+-then
+- AC_DEFINE(DOUBLE_IS_LITTLE_ENDIAN_IEEE754, 1,
+- [Define if C doubles are 64-bit IEEE 754 binary format, stored
+- with the least significant byte first])
+-fi
+-
+-AC_MSG_CHECKING(whether C doubles are big-endian IEEE 754 binary64)
+-AC_CACHE_VAL(ac_cv_big_endian_double, [
+-AC_RUN_IFELSE([AC_LANG_SOURCE([[
+-#include <string.h>
+-int main() {
+- double x = 9006104071832581.0;
+- if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
+- return 0;
+- else
+- return 1;
+-}
+-]])],
+-[ac_cv_big_endian_double=yes],
+-[ac_cv_big_endian_double=no],
+-[ac_cv_big_endian_double=no])])
+-AC_MSG_RESULT($ac_cv_big_endian_double)
+-if test "$ac_cv_big_endian_double" = yes
++AX_C_FLOAT_WORDS_BIGENDIAN
++if test "$ax_cv_c_float_words_bigendian" = "yes"
+ then
+ AC_DEFINE(DOUBLE_IS_BIG_ENDIAN_IEEE754, 1,
+ [Define if C doubles are 64-bit IEEE 754 binary format, stored
+ with the most significant byte first])
+-fi
+-
+-# Some ARM platforms use a mixed-endian representation for doubles.
+-# While Python doesn't currently have full support for these platforms
+-# (see e.g., issue 1762561), we can at least make sure that float <-> string
+-# conversions work.
+-AC_MSG_CHECKING(whether C doubles are ARM mixed-endian IEEE 754 binary64)
+-AC_CACHE_VAL(ac_cv_mixed_endian_double, [
+-AC_RUN_IFELSE([AC_LANG_SOURCE([[
+-#include <string.h>
+-int main() {
+- double x = 9006104071832581.0;
+- if (memcmp(&x, "\x01\xff\x3f\x43\x05\x04\x03\x02", 8) == 0)
+- return 0;
+- else
+- return 1;
+-}
+-]])],
+-[ac_cv_mixed_endian_double=yes],
+-[ac_cv_mixed_endian_double=no],
+-[ac_cv_mixed_endian_double=no])])
+-AC_MSG_RESULT($ac_cv_mixed_endian_double)
+-if test "$ac_cv_mixed_endian_double" = yes
++elif test "$ax_cv_c_float_words_bigendian" = "no"
+ then
++ AC_DEFINE(DOUBLE_IS_LITTLE_ENDIAN_IEEE754, 1,
++ [Define if C doubles are 64-bit IEEE 754 binary format, stored
++ with the least significant byte first])
++else
++ # Some ARM platforms use a mixed-endian representation for doubles.
++ # While Python doesn't currently have full support for these platforms
++ # (see e.g., issue 1762561), we can at least make sure that float <-> string
++ # conversions work.
++ # FLOAT_WORDS_BIGENDIAN doesnt actually detect this case, but if it's not big
++ # or little, then it must be this?
+ AC_DEFINE(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754, 1,
+ [Define if C doubles are 64-bit IEEE 754 binary format, stored
+ in ARM mixed-endian order (byte order 45670123)])
+diff --git a/m4/ax_c_float_words_bigendian.m4 b/m4/ax_c_float_words_bigendian.m4
+new file mode 100644
+index 0000000000..216b90d803
+--- /dev/null
++++ b/m4/ax_c_float_words_bigendian.m4
+@@ -0,0 +1,83 @@
++# ===============================================================================
++# https://www.gnu.org/software/autoconf-archive/ax_c_float_words_bigendian.html
++# ===============================================================================
++#
++# SYNOPSIS
++#
++# AX_C_FLOAT_WORDS_BIGENDIAN([ACTION-IF-TRUE], [ACTION-IF-FALSE], [ACTION-IF-UNKNOWN])
++#
++# DESCRIPTION
++#
++# Checks the ordering of words within a multi-word float. This check is
++# necessary because on some systems (e.g. certain ARM systems), the float
++# word ordering can be different from the byte ordering. In a multi-word
++# float context, "big-endian" implies that the word containing the sign
++# bit is found in the memory location with the lowest address. This
++# implementation was inspired by the AC_C_BIGENDIAN macro in autoconf.
++#
++# The endianness is detected by first compiling C code that contains a
++# special double float value, then grepping the resulting object file for
++# certain strings of ASCII values. The double is specially crafted to have
++# a binary representation that corresponds with a simple string. In this
++# implementation, the string "noonsees" was selected because the
++# individual word values ("noon" and "sees") are palindromes, thus making
++# this test byte-order agnostic. If grep finds the string "noonsees" in
++# the object file, the target platform stores float words in big-endian
++# order. If grep finds "seesnoon", float words are in little-endian order.
++# If neither value is found, the user is instructed to specify the
++# ordering.
++#
++# LICENSE
++#
++# Copyright (c) 2008 Daniel Amelang <dan@amelang.net>
++#
++# Copying and distribution of this file, with or without modification, are
++# permitted in any medium without royalty provided the copyright notice
++# and this notice are preserved. This file is offered as-is, without any
++# warranty.
++
++#serial 11
++
++AC_DEFUN([AX_C_FLOAT_WORDS_BIGENDIAN],
++ [AC_CACHE_CHECK(whether float word ordering is bigendian,
++ ax_cv_c_float_words_bigendian, [
++
++ax_cv_c_float_words_bigendian=unknown
++AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
++
++double d = 90904234967036810337470478905505011476211692735615632014797120844053488865816695273723469097858056257517020191247487429516932130503560650002327564517570778480236724525140520121371739201496540132640109977779420565776568942592.0;
++
++]])], [
++
++if grep noonsees conftest.$ac_objext >/dev/null ; then
++ ax_cv_c_float_words_bigendian=yes
++fi
++if grep seesnoon conftest.$ac_objext >/dev/null ; then
++ if test "$ax_cv_c_float_words_bigendian" = unknown; then
++ ax_cv_c_float_words_bigendian=no
++ else
++ ax_cv_c_float_words_bigendian=unknown
++ fi
++fi
++
++])])
++
++case $ax_cv_c_float_words_bigendian in
++ yes)
++ m4_default([$1],
++ [AC_DEFINE([FLOAT_WORDS_BIGENDIAN], 1,
++ [Define to 1 if your system stores words within floats
++ with the most significant word first])]) ;;
++ no)
++ $2 ;;
++ *)
++ m4_default([$3],
++ [AC_MSG_ERROR([
++
++Unknown float word ordering. You need to manually preset
++ax_cv_c_float_words_bigendian=no (or yes) according to your system.
++
++ ])]) ;;
++esac
++
++])# AX_C_FLOAT_WORDS_BIGENDIAN
+--
+2.11.0
+
diff --git a/external/meta-python2/recipes-devtools/python/python/get_module_deps2.py b/external/meta-python2/recipes-devtools/python/python/get_module_deps2.py
new file mode 100644
index 00000000..73e7c6f6
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/get_module_deps2.py
@@ -0,0 +1,112 @@
+# This script is launched on separate task for each python module
+# It checks for dependencies for that specific module and prints
+# them out, the output of this execution will have all dependencies
+# for a specific module, which will be parsed an dealt on create_manifest.py
+#
+# Author: Alejandro Enedino Hernandez Samaniego "aehs29" <aehs29@gmail.com>
+
+
+# We can get a log per module, for all the dependencies that were found, but its messy.
+debug=False
+
+import sys
+
+# We can get a list of the modules which are currently required to run python
+# so we run python-core and get its modules, we then import what we need
+# and check what modules are currently running, if we substract them from the
+# modules we had initially, we get the dependencies for the module we imported.
+
+# We use importlib to achieve this, so we also need to know what modules importlib needs
+import importlib
+
+core_deps=set(sys.modules)
+
+def fix_path(dep_path):
+ import os
+ # We DONT want the path on our HOST system
+ pivot='recipe-sysroot-native'
+ dep_path=dep_path[dep_path.find(pivot)+len(pivot):]
+
+ if '/usr/bin' in dep_path:
+ dep_path = dep_path.replace('/usr/bin''${bindir}')
+
+ # Handle multilib, is there a better way?
+ if '/usr/lib32' in dep_path:
+ dep_path = dep_path.replace('/usr/lib32','${libdir}')
+ if '/usr/lib64' in dep_path:
+ dep_path = dep_path.replace('/usr/lib64','${libdir}')
+ if '/usr/lib' in dep_path:
+ dep_path = dep_path.replace('/usr/lib','${libdir}')
+ if '/usr/include' in dep_path:
+ dep_path = dep_path.replace('/usr/include','${includedir}')
+ if '__init__.' in dep_path:
+ dep_path = os.path.split(dep_path)[0]
+
+ # If a *.pyc file was imported, we replace it with *.py (since we deal with PYCs on create_manifest)
+ if '.pyc' in dep_path:
+ dep_path = dep_path.replace('.pyc','.py')
+
+ return dep_path
+
+# Module to import was passed as an argument
+current_module = str(sys.argv[1]).rstrip()
+if(debug==True):
+ log = open('log_%s' % current_module,'w')
+ log.write('Module %s generated the following dependencies:\n' % current_module)
+try:
+ importlib.import_module('%s' % current_module)
+except ImportError as e:
+ if (debug==True):
+ log.write('Module was not found')
+ pass
+
+
+# Get current module dependencies, dif will contain a list of specific deps for this module
+module_deps=set(sys.modules)
+
+# We handle the core package (1st pass on create_manifest.py) as a special case
+if current_module == 'python-core-package':
+ dif = core_deps
+else:
+ dif = module_deps-core_deps
+
+
+# Check where each dependency came from
+for item in dif:
+ dep_path=''
+ try:
+ if (debug==True):
+ log.write('Calling: sys.modules[' + '%s' % item + '].__file__\n')
+ dep_path = sys.modules['%s' % item].__file__
+ except AttributeError as e:
+ # Deals with thread (builtin module) not having __file__ attribute
+ if debug==True:
+ log.write(item + ' ')
+ log.write(str(e))
+ log.write('\n')
+ pass
+ except NameError as e:
+ # Deals with NameError: name 'dep_path' is not defined
+ # because module is not found (wasn't compiled?), e.g. bddsm
+ if (debug==True):
+ log.write(item+' ')
+ log.write(str(e))
+ pass
+
+ # Site-customize is a special case since we (OpenEmbedded) put it there manually
+ if 'sitecustomize' in dep_path:
+ dep_path = '${libdir}/python2.7/sitecustomize.py'
+ # Prints out result, which is what will be used by create_manifest
+ print (dep_path)
+ continue
+
+ dep_path = fix_path(dep_path)
+
+ if (debug==True):
+ log.write(dep_path+'\n')
+
+ # Prints out result, which is what will be used by create_manifest
+ print (dep_path)
+
+if debug==True:
+ log.close()
diff --git a/external/meta-python2/recipes-devtools/python/python/host_include_contamination.patch b/external/meta-python2/recipes-devtools/python/python/host_include_contamination.patch
new file mode 100644
index 00000000..e0aafb21
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/host_include_contamination.patch
@@ -0,0 +1,28 @@
+when building python for qemux86-64 on ubuntu 11.10/64bit
+it gropes into host includes and then mixes them with cross
+includes and as a result some modules fail to compile and link
+one of the modules is python-elementtree which is then not
+found during image creation
+
+Proble is that setup.py tries to add native includes that newer
+ubuntu has introduced for multiarch support. But that should
+only happen for native builds and not cross building python
+so we add a check here.
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+Upstream-Status: Pending
+
+
+diff --git a/setup.py b/setup.py
+index ba2d242..bf859be 100644
+--- a/setup.py
++++ b/setup.py
+@@ -393,6 +393,8 @@ class PyBuildExt(build_ext):
+
+ if not find_executable('dpkg-architecture'):
+ return
++ if os.environ.get('CROSS_COMPILE') is not None:
++ return
+ opt = ''
+ if cross_compiling:
+ opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
diff --git a/external/meta-python2/recipes-devtools/python/python/multilib.patch b/external/meta-python2/recipes-devtools/python/python/multilib.patch
new file mode 100644
index 00000000..d24bc15f
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/multilib.patch
@@ -0,0 +1,298 @@
+Rebased for python-2.7.9
+Signed-off-by: Alejandro Hernandez <alejandro.hernandez@linux.intel.com>
+Upstream-Status: Pending
+Index: Python-2.7.14/configure.ac
+===================================================================
+--- Python-2.7.14.orig/configure.ac
++++ Python-2.7.14/configure.ac
+@@ -758,6 +758,10 @@ SunOS*)
+ ;;
+ esac
+
++AC_SUBST(LIB)
++AC_MSG_CHECKING(LIB)
++LIB="SEDMELIBLEAF"
++AC_MSG_RESULT($LIB)
+
+ AC_SUBST(LIBRARY)
+ AC_MSG_CHECKING(LIBRARY)
+Index: Python-2.7.14/Include/pythonrun.h
+===================================================================
+--- Python-2.7.14.orig/Include/pythonrun.h
++++ Python-2.7.14/Include/pythonrun.h
+@@ -108,6 +108,7 @@ PyAPI_FUNC(char *) Py_GetPath(void);
+ /* In their own files */
+ PyAPI_FUNC(const char *) Py_GetVersion(void);
+ PyAPI_FUNC(const char *) Py_GetPlatform(void);
++PyAPI_FUNC(const char *) Py_GetLib(void);
+ PyAPI_FUNC(const char *) Py_GetCopyright(void);
+ PyAPI_FUNC(const char *) Py_GetCompiler(void);
+ PyAPI_FUNC(const char *) Py_GetBuildInfo(void);
+Index: Python-2.7.14/Lib/distutils/command/install.py
+===================================================================
+--- Python-2.7.14.orig/Lib/distutils/command/install.py
++++ Python-2.7.14/Lib/distutils/command/install.py
+@@ -22,6 +22,8 @@ from site import USER_BASE
+ from site import USER_SITE
+
+
++libname = sys.lib
++
+ if sys.version < "2.2":
+ WINDOWS_SCHEME = {
+ 'purelib': '$base',
+@@ -41,8 +43,8 @@ else:
+
+ INSTALL_SCHEMES = {
+ 'unix_prefix': {
+- 'purelib': '$base/lib/python$py_version_short/site-packages',
+- 'platlib': '$platbase/lib/python$py_version_short/site-packages',
++ 'purelib': '$platbase/'+libname+'/python$py_version_short/site-packages',
++ 'platlib': '$platbase/'+libname+'/python$py_version_short/site-packages',
+ 'headers': '$base/include/python$py_version_short/$dist_name',
+ 'scripts': '$base/bin',
+ 'data' : '$base',
+Index: Python-2.7.14/Lib/distutils/sysconfig.py
+===================================================================
+--- Python-2.7.14.orig/Lib/distutils/sysconfig.py
++++ Python-2.7.14/Lib/distutils/sysconfig.py
+@@ -119,8 +119,11 @@ def get_python_lib(plat_specific=0, stan
+ prefix = plat_specific and EXEC_PREFIX or PREFIX
+
+ if os.name == "posix":
+- libpython = os.path.join(prefix,
+- "lib", "python" + get_python_version())
++ if plat_specific or standard_lib:
++ lib = sys.lib
++ else:
++ lib = "lib"
++ libpython = os.path.join(prefix, lib, "python" + get_python_version())
+ if standard_lib:
+ return libpython
+ else:
+Index: Python-2.7.14/Lib/pydoc.py
+===================================================================
+--- Python-2.7.14.orig/Lib/pydoc.py
++++ Python-2.7.14/Lib/pydoc.py
+@@ -375,7 +375,7 @@ class Doc:
+ docmodule = docclass = docroutine = docother = docproperty = docdata = fail
+
+ def getdocloc(self, object,
+- basedir=os.path.join(sys.exec_prefix, "lib",
++ basedir=os.path.join(sys.exec_prefix, "sys.lib",
+ "python"+sys.version[0:3])):
+ """Return the location of module docs or None"""
+
+Index: Python-2.7.14/Lib/site.py
+===================================================================
+--- Python-2.7.14.orig/Lib/site.py
++++ Python-2.7.14/Lib/site.py
+@@ -288,13 +288,18 @@ def getsitepackages():
+ if sys.platform in ('os2emx', 'riscos'):
+ sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
+ elif os.sep == '/':
+- sitepackages.append(os.path.join(prefix, "lib",
++ sitepackages.append(os.path.join(prefix, sys.lib,
+ "python" + sys.version[:3],
+ "site-packages"))
+- sitepackages.append(os.path.join(prefix, "lib", "site-python"))
++ sitepackages.append(os.path.join(prefix, sys.lib, "site-python"))
++ if sys.lib != "lib":
++ sitepackages.append(os.path.join(prefix, "lib",
++ "python" + sys.version[:3],
++ "site-packages"))
++ sitepackages.append(os.path.join(prefix, "lib", "site-python"))
+ else:
+ sitepackages.append(prefix)
+- sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
++ sitepackages.append(os.path.join(prefix, sys.lib, "site-packages"))
+ return sitepackages
+
+ def addsitepackages(known_paths):
+Index: Python-2.7.14/Lib/sysconfig.py
+===================================================================
+--- Python-2.7.14.orig/Lib/sysconfig.py
++++ Python-2.7.14/Lib/sysconfig.py
+@@ -7,10 +7,10 @@ from os.path import pardir, realpath
+
+ _INSTALL_SCHEMES = {
+ 'posix_prefix': {
+- 'stdlib': '{base}/lib/python{py_version_short}',
+- 'platstdlib': '{platbase}/lib/python{py_version_short}',
++ 'stdlib': '{base}/'+sys.lib+'/python{py_version_short}',
++ 'platstdlib': '{platbase}/'+sys.lib+'/python{py_version_short}',
+ 'purelib': '{base}/lib/python{py_version_short}/site-packages',
+- 'platlib': '{platbase}/lib/python{py_version_short}/site-packages',
++ 'platlib': '{platbase}/'+sys.lib+'/python{py_version_short}/site-packages',
+ 'include': '{base}/include/python{py_version_short}',
+ 'platinclude': '{platbase}/include/python{py_version_short}',
+ 'scripts': '{base}/bin',
+@@ -65,10 +65,10 @@ _INSTALL_SCHEMES = {
+ 'data' : '{userbase}',
+ },
+ 'posix_user': {
+- 'stdlib': '{userbase}/lib/python{py_version_short}',
+- 'platstdlib': '{userbase}/lib/python{py_version_short}',
++ 'stdlib': '{userbase}/'+sys.lib+'/python{py_version_short}',
++ 'platstdlib': '{userbase}/'+sys.lib+'/python{py_version_short}',
+ 'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
+- 'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
++ 'platlib': '{userbase}/'+sys.lib+'/python{py_version_short}/site-packages',
+ 'include': '{userbase}/include/python{py_version_short}',
+ 'scripts': '{userbase}/bin',
+ 'data' : '{userbase}',
+Index: Python-2.7.14/Lib/test/test_dl.py
+===================================================================
+--- Python-2.7.14.orig/Lib/test/test_dl.py
++++ Python-2.7.14/Lib/test/test_dl.py
+@@ -4,10 +4,11 @@
+ import unittest
+ from test.test_support import verbose, import_module
+ dl = import_module('dl', deprecated=True)
++import sys
+
+ sharedlibs = [
+- ('/usr/lib/libc.so', 'getpid'),
+- ('/lib/libc.so.6', 'getpid'),
++ ('/usr/'+sys.lib+'/libc.so', 'getpid'),
++ ('/'+sys.lib+'/libc.so.6', 'getpid'),
+ ('/usr/bin/cygwin1.dll', 'getpid'),
+ ('/usr/lib/libc.dylib', 'getpid'),
+ ]
+Index: Python-2.7.14/Lib/test/test_site.py
+===================================================================
+--- Python-2.7.14.orig/Lib/test/test_site.py
++++ Python-2.7.14/Lib/test/test_site.py
+@@ -252,12 +252,16 @@ class HelperFunctionsTests(unittest.Test
+ self.assertEqual(dirs[0], wanted)
+ elif os.sep == '/':
+ # OS X, Linux, FreeBSD, etc
+- self.assertEqual(len(dirs), 2)
+ wanted = os.path.join('xoxo', 'lib', 'python' + sys.version[:3],
+ 'site-packages')
+- self.assertEqual(dirs[0], wanted)
++ self.assertTrue(wanted in dirs)
+ wanted = os.path.join('xoxo', 'lib', 'site-python')
+- self.assertEqual(dirs[1], wanted)
++ self.assertTrue(wanted in dirs)
++ wanted = os.path.join('xoxo', sys.lib, 'python' + sys.version[:3],
++ 'site-packages')
++ self.assertTrue(wanted in dirs)
++ wanted = os.path.join('xoxo', sys.lib, 'site-python')
++ self.assertTrue(wanted in dirs)
+ else:
+ # other platforms
+ self.assertEqual(len(dirs), 2)
+Index: Python-2.7.14/Lib/trace.py
+===================================================================
+--- Python-2.7.14.orig/Lib/trace.py
++++ Python-2.7.14/Lib/trace.py
+@@ -754,10 +754,10 @@ def main(argv=None):
+ # should I also call expanduser? (after all, could use $HOME)
+
+ s = s.replace("$prefix",
+- os.path.join(sys.prefix, "lib",
++ os.path.join(sys.prefix, sys.lib,
+ "python" + sys.version[:3]))
+ s = s.replace("$exec_prefix",
+- os.path.join(sys.exec_prefix, "lib",
++ os.path.join(sys.exec_prefix, sys.lib,
+ "python" + sys.version[:3]))
+ s = os.path.normpath(s)
+ ignore_dirs.append(s)
+Index: Python-2.7.14/Makefile.pre.in
+===================================================================
+--- Python-2.7.14.orig/Makefile.pre.in
++++ Python-2.7.14/Makefile.pre.in
+@@ -91,6 +91,7 @@ PY_CFLAGS= $(CFLAGS) $(CPPFLAGS) $(CFLAG
+
+ # Machine-dependent subdirectories
+ MACHDEP= @MACHDEP@
++LIB= @LIB@
+
+ # Multiarch directory (may be empty)
+ MULTIARCH= @MULTIARCH@
+@@ -110,7 +111,7 @@ LIBDIR= @libdir@
+ MANDIR= @mandir@
+ INCLUDEDIR= @includedir@
+ CONFINCLUDEDIR= $(exec_prefix)/include
+-SCRIPTDIR= $(prefix)/lib
++SCRIPTDIR= $(prefix)/@LIB@
+
+ # Detailed destination directories
+ BINLIBDEST= $(LIBDIR)/python$(VERSION)
+@@ -645,6 +646,7 @@ Modules/getpath.o: $(srcdir)/Modules/get
+ -DEXEC_PREFIX='"$(exec_prefix)"' \
+ -DVERSION='"$(VERSION)"' \
+ -DVPATH='"$(VPATH)"' \
++ -DLIB='"$(LIB)"' \
+ -o $@ $(srcdir)/Modules/getpath.c
+
+ Modules/python.o: $(srcdir)/Modules/python.c
+@@ -693,7 +695,7 @@ regen-ast:
+ Python/compile.o Python/symtable.o Python/ast.o: $(srcdir)/Include/graminit.h $(srcdir)/Include/Python-ast.h
+
+ Python/getplatform.o: $(srcdir)/Python/getplatform.c
+- $(CC) -c $(PY_CFLAGS) -DPLATFORM='"$(MACHDEP)"' -o $@ $(srcdir)/Python/getplatform.c
++ $(CC) -c $(PY_CFLAGS) -DPLATFORM='"$(MACHDEP)"' -DLIB='"$(LIB)"' -o $@ $(srcdir)/Python/getplatform.c
+
+ Python/importdl.o: $(srcdir)/Python/importdl.c
+ $(CC) -c $(PY_CFLAGS) -I$(DLINCLDIR) -o $@ $(srcdir)/Python/importdl.c
+Index: Python-2.7.14/Modules/getpath.c
+===================================================================
+--- Python-2.7.14.orig/Modules/getpath.c
++++ Python-2.7.14/Modules/getpath.c
+@@ -100,6 +100,13 @@
+ #error "PREFIX, EXEC_PREFIX, VERSION, and VPATH must be constant defined"
+ #endif
+
++#define LIB_PYTHON LIB "/python" VERSION
++
++#ifndef PYTHONPATH
++#define PYTHONPATH PREFIX "/" LIB_PYTHON ":" \
++ EXEC_PREFIX "/" LIB_PYTHON "/lib-dynload"
++#endif
++
+ #ifndef LANDMARK
+ #define LANDMARK "os.py"
+ #endif
+@@ -108,7 +115,7 @@ static char prefix[MAXPATHLEN+1];
+ static char exec_prefix[MAXPATHLEN+1];
+ static char progpath[MAXPATHLEN+1];
+ static char *module_search_path = NULL;
+-static char lib_python[] = "lib/python" VERSION;
++static char lib_python[] = LIB_PYTHON;
+
+ static void
+ reduce(char *dir)
+Index: Python-2.7.14/Python/getplatform.c
+===================================================================
+--- Python-2.7.14.orig/Python/getplatform.c
++++ Python-2.7.14/Python/getplatform.c
+@@ -10,3 +10,13 @@ Py_GetPlatform(void)
+ {
+ return PLATFORM;
+ }
++
++#ifndef LIB
++#define LIB "lib"
++#endif
++
++const char *
++Py_GetLib(void)
++{
++ return LIB;
++}
+Index: Python-2.7.14/Python/sysmodule.c
+===================================================================
+--- Python-2.7.14.orig/Python/sysmodule.c
++++ Python-2.7.14/Python/sysmodule.c
+@@ -1437,6 +1437,8 @@ _PySys_Init(void)
+ PyString_FromString(Py_GetCopyright()));
+ SET_SYS_FROM_STRING("platform",
+ PyString_FromString(Py_GetPlatform()));
++ SET_SYS_FROM_STRING("lib",
++ PyString_FromString(Py_GetLib()));
+ SET_SYS_FROM_STRING("executable",
+ PyString_FromString(Py_GetProgramFullPath()));
+ SET_SYS_FROM_STRING("prefix",
diff --git a/external/meta-python2/recipes-devtools/python/python/parallel-makeinst-create-bindir.patch b/external/meta-python2/recipes-devtools/python/python/parallel-makeinst-create-bindir.patch
new file mode 100644
index 00000000..abab41e9
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/parallel-makeinst-create-bindir.patch
@@ -0,0 +1,19 @@
+When using make -j with the 'install' target, it's possible for altbininstall
+(which normally creates BINDIR) and libainstall (which doesn't, though it
+installs python-config there) to race, resulting in a failure due to
+attempting to install python-config into a nonexistent BINDIR. Ensure it also
+exists in the libainstall target.
+
+Upstream-Status: Pending
+
+--- Python-2.7.3.orig/Makefile.pre.in
++++ Python-2.7.3/Makefile.pre.in
+@@ -1187,7 +1187,7 @@
+ LIBPC= $(LIBDIR)/pkgconfig
+
+ libainstall: @DEF_MAKE_RULE@ python-config
+- @for i in $(LIBDIR) $(LIBP) $(LIBPL) $(LIBPC); \
++ @for i in $(LIBDIR) $(LIBP) $(LIBPL) $(LIBPC) $(BINDIR); \
+ do \
+ if test ! -d $(DESTDIR)$$i; then \
+ echo "Creating directory $$i"; \
diff --git a/external/meta-python2/recipes-devtools/python/python/pass-missing-libraries-to-Extension-for-mul.patch b/external/meta-python2/recipes-devtools/python/python/pass-missing-libraries-to-Extension-for-mul.patch
new file mode 100644
index 00000000..44fcaacf
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/pass-missing-libraries-to-Extension-for-mul.patch
@@ -0,0 +1,82 @@
+From 71447f04979b267f8866573b67a4340b2719d799 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia@windriver.com>
+Date: Fri, 4 Aug 2017 14:10:43 +0800
+Subject: [PATCH] setup.py: pass missing libraries to Extension for multiprocessing module
+
+In the following commit:
+...
+commit e711cafab13efc9c1fe6c5cd75826401445eb585
+Author: Benjamin Peterson <benjamin@python.org>
+Date: Wed Jun 11 16:44:04 2008 +0000
+
+ Merged revisions 64104,64117 via svnmerge from
+ svn+ssh://pythondev@svn.python.org/python/trunk
+...
+(see diff in setup.py)
+It assigned libraries for multiprocessing module according
+the host_platform, but not pass it to Extension.
+
+In glibc, the following commit caused two definition of
+sem_getvalue are different.
+https://sourceware.org/git/?p=glibc.git;a=commit;h=042e1521c794a945edc43b5bfa7e69ad70420524
+(see diff in nptl/sem_getvalue.c for detail)
+`__new_sem_getvalue' is the latest sem_getvalue@@GLIBC_2.1
+and `__old_sem_getvalue' is to compat the old version
+sem_getvalue@GLIBC_2.0.
+
+To build python for embedded Linux systems:
+http://www.yoctoproject.org/docs/2.3.1/yocto-project-qs/yocto-project-qs.html
+If not explicitly link to library pthread (-lpthread), it will
+load glibc's sem_getvalue randomly at runtime.
+
+Such as build python on linux x86_64 host and run the python
+on linux x86_32 target. If not link library pthread, it caused
+multiprocessing bounded semaphore could not work correctly.
+...
+>>> import multiprocessing
+>>> pool_sema = multiprocessing.BoundedSemaphore(value=1)
+>>> pool_sema.acquire()
+True
+>>> pool_sema.release()
+Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ValueError: semaphore or lock released too many times
+...
+
+And the semaphore issue also caused multiprocessing.Queue().put() hung.
+
+Upstream-Status: Submitted [https://github.com/python/cpython/pull/2999]
+
+Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
+---
+ setup.py | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index 54054c2..9646bfc 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1586,8 +1586,10 @@ class PyBuildExt(build_ext):
+ elif host_platform.startswith('netbsd'):
+ macros = dict()
+ libraries = []
+-
+- else: # Linux and other unices
++ elif host_platform.startswith(('linux')):
++ macros = dict()
++ libraries = ['pthread']
++ else: # Other unices
+ macros = dict()
+ libraries = ['rt']
+
+@@ -1610,6 +1612,7 @@ class PyBuildExt(build_ext):
+ if sysconfig.get_config_var('WITH_THREAD'):
+ exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
+ define_macros=macros.items(),
++ libraries=libraries,
+ include_dirs=["Modules/_multiprocessing"]))
+ else:
+ missing.append('_multiprocessing')
+--
+2.7.4
+
diff --git a/external/meta-python2/recipes-devtools/python/python/python-2.7.3-remove-bsdb-rpath.patch b/external/meta-python2/recipes-devtools/python/python/python-2.7.3-remove-bsdb-rpath.patch
new file mode 100644
index 00000000..216be0a4
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/python-2.7.3-remove-bsdb-rpath.patch
@@ -0,0 +1,28 @@
+Upstream-Status: Inappropriate [embedded specific]
+
+Remove the RPATH to avoid QA issue warning.
+
+RP: Added secondary unnecessary rpath to the list 2012/8/7
+Signed-off-by: Jackie Huang <jackie.huang@windriver.com>
+
+
+Index: Python-2.7.3/setup.py
+===================================================================
+--- Python-2.7.3.orig/setup.py 2012-08-07 10:41:58.560132529 +0000
++++ Python-2.7.3/setup.py 2012-08-07 11:09:47.852094515 +0000
+@@ -1042,7 +1042,6 @@
+ exts.append(Extension('_bsddb', ['_bsddb.c'],
+ depends = ['bsddb.h'],
+ library_dirs=dblib_dir,
+- runtime_library_dirs=dblib_dir,
+ include_dirs=db_incs,
+ libraries=dblibs))
+ else:
+@@ -1252,7 +1251,6 @@
+ print "building dbm using bdb"
+ dbmext = Extension('dbm', ['dbmmodule.c'],
+ library_dirs=dblib_dir,
+- runtime_library_dirs=dblib_dir,
+ include_dirs=db_incs,
+ define_macros=[
+ ('HAVE_BERKDB_H', None),
diff --git a/external/meta-python2/recipes-devtools/python/python/python2-manifest.json b/external/meta-python2/recipes-devtools/python/python/python2-manifest.json
new file mode 100644
index 00000000..fd98774d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/python2-manifest.json
@@ -0,0 +1,1139 @@
+# DO NOT (entirely) modify this file manually, please read.
+#
+# IMPORTANT NOTE:
+# Please keep in mind that the create_manifest task relies on the fact the the
+# target and native Python packages are the same, and it also needs to be executed
+# with a fully working native package (with all the PACKAGECONFIGs enabled and all
+# and all the modules should be working, check log.do_compile), otherwise the script
+# will fail to find dependencies correctly, this note is valid either if you are
+# upgrading to a new Python version or adding a new package.
+#
+#
+# If you are adding a new package please follow the next steps:
+# How to add a new package:
+# - If a user wants to add a new package all that has to be done is:
+# Modify the python2-manifest.json file, and add the required file(s) to the FILES list,
+# fill up the SUMMARY section as well, the script should handle all the rest.
+#
+# Real example:
+# We want to add a web browser package, including the file webbrowser.py
+# which at the moment is on python-misc.
+# "webbrowser": {
+# "files": ["${libdir}/python2.7/lib-dynload/webbrowser.py"],
+# "rdepends": [],
+# "summary": "Python Web Browser support"}
+#
+# * Note that the rdepends field was left empty
+#
+# We 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"}
+#
+#
+# If you are upgrading Python to a new version please follow the next steps:
+# After each Python upgrade, the create_manifest task should be executed, because we
+# don't control what changes on upstream Python, so, some module dependency
+# might have changed without us realizing it, a certain module can either have
+# more or less dependencies, or could be depending on a new file that was just
+# created on the new release and for obvious reasons we wouldn't have it on our
+# old manifest, all of these issues would cause runtime errors on our system.
+#
+# - Upgrade both the native and target Python packages to a new version
+# - Run the create_manifest task for the target Python package as its shown below:
+#
+# $ bitbake python -c create_manifest
+#
+# This will automatically replace your manifest file located under the Python directory
+# with an new one, which contains the new dependencies (if any).
+#
+# Several things could have gone wrong here, I will try to explain a few:
+#
+# a) A new file was introduced on this release, e.g. sha3*.so:
+# The task will check what its needed to import every module, more than one module would
+# would probably depend on sha3*.so, although only one module should contain it.
+#
+# After running the task, the new manifest will have the sha3*.so file on more than one
+# module, you need to manually decide which one of them should get it and delete it from
+# the others, for example sha3*.so should likely be on ${PN}-crypt.
+# Once you have deleted from the others you need to run the create_manifest task again,
+# this will populate the other module's rdepends fields, with ${PN}-crypt and you should be
+# good to go.
+#
+# b) The native package wasn't built correctly and its missing a certain module:
+# As mentioned before, you need to make sure the native package was built with all the modules
+# because it is used as base to build the manifest file, you need to manually check log.do_compile
+# since it won't error out the compile function if its only missing a couple of modules.
+#
+# e.g. missing the _uuid module, log.do_compile would show the following:
+# Python build finished successfully!
+# The necessary bits to build these optional modules were not found:
+# _uuid
+#
+# What will happen here is that the new manifest would not be aware that the _uuid module exists, so
+# not only we won't know of any dependencies to it, but also, the _uuid* files will be packaged on
+# the misc package (which is where any file that doesn't belong anywhere else ends up).
+#
+# This will eventually cause runtime errors on our system if we don't include the misc package on
+# on our image, because the _uuid files will be missing.
+# If we build the _uuid module correctly and run the create_manifest task the _uuid files will be
+# detected correctly along with its dependencies, and we will get a working manifest.
+#
+# This is the reason why it is important to make sure we have a fully working native build,
+# so we can avoid these errors.
+#
+#
+#
+# DO NOT MODIFY THE NEXT LINE!, IT IS USED AS A MARKER FOR THE ACTUAL JSON MANIFEST
+# EOC
+{
+ "tests": {
+ "summary": "Python test suite",
+ "rdepends": [
+ "core",
+ "modules"
+ ],
+ "files": [
+ "${libdir}/python2.7/*/test",
+ "${libdir}/python2.7/*/tests",
+ "${libdir}/python2.7/idlelib/idle_test/",
+ "${libdir}/python2.7/test"
+ ],
+ "cached": []
+ },
+ "2to3": {
+ "summary": "Python automated Python 2 to 3 code translator",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${bindir}/2to3*",
+ "${libdir}/python2.7/lib2to3"
+ ]
+ },
+ "argparse": {
+ "summary": "Python command line argument parser",
+ "rdepends": [
+ "codecs",
+ "core",
+ "lang",
+ "textutils"
+ ],
+ "files": [
+ "${libdir}/python2.7/argparse.py"
+ ]
+ },
+ "audio": {
+ "summary": "Python Audio Handling",
+ "rdepends": [
+ "core",
+ "crypt",
+ "fcntl",
+ "io",
+ "math"
+ ],
+ "files": [
+ "${libdir}/python2.7/audiodev.py",
+ "${libdir}/python2.7/chunk.py",
+ "${libdir}/python2.7/lib-dynload/audioop.so",
+ "${libdir}/python2.7/lib-dynload/ossaudiodev.so",
+ "${libdir}/python2.7/sndhdr.py",
+ "${libdir}/python2.7/sunau.py",
+ "${libdir}/python2.7/sunaudio.py",
+ "${libdir}/python2.7/toaiff.py",
+ "${libdir}/python2.7/wave.py"
+ ]
+ },
+ "bsddb": {
+ "summary": "Python bindings for the Berkeley Database",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/bsddb",
+ "${libdir}/python2.7/lib-dynload/_bsddb.so"
+ ]
+ },
+ "codecs": {
+ "summary": "Python codec",
+ "rdepends": [
+ "core",
+ "io",
+ "lang"
+ ],
+ "files": [
+ "${libdir}/python2.7/gettext.py",
+ "${libdir}/python2.7/lib-dynload/_codecs_cn.so",
+ "${libdir}/python2.7/lib-dynload/_codecs_hk.so",
+ "${libdir}/python2.7/lib-dynload/_codecs_iso2022.so",
+ "${libdir}/python2.7/lib-dynload/_codecs_jp.so",
+ "${libdir}/python2.7/lib-dynload/_codecs_kr.so",
+ "${libdir}/python2.7/lib-dynload/_codecs_tw.so",
+ "${libdir}/python2.7/lib-dynload/_multibytecodec.so",
+ "${libdir}/python2.7/lib-dynload/unicodedata.so",
+ "${libdir}/python2.7/locale.py",
+ "${libdir}/python2.7/stringprep.py",
+ "${libdir}/python2.7/xdrlib.py"
+ ]
+ },
+ "compile": {
+ "summary": "Python bytecode compilation support",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/compileall.py",
+ "${libdir}/python2.7/py_compile.py"
+ ]
+ },
+ "compiler": {
+ "summary": "Python compiler support",
+ "rdepends": [
+ "core",
+ "io",
+ "lang"
+ ],
+ "files": [
+ "${libdir}/python2.7/compiler"
+ ]
+ },
+ "compression": {
+ "summary": "Python high-level compression support",
+ "rdepends": [
+ "core",
+ "io",
+ "shell",
+ "unixadmin",
+ "zlib"
+ ],
+ "files": [
+ "${libdir}/python2.7/gzip.py",
+ "${libdir}/python2.7/lib-dynload/bz2.so",
+ "${libdir}/python2.7/tarfile.py",
+ "${libdir}/python2.7/zipfile.py"
+ ]
+ },
+ "contextlib": {
+ "summary": "Python utilities for with-statementcontexts.",
+ "rdepends": [
+ "core",
+ "lang"
+ ],
+ "files": [
+ "${libdir}/python2.7/contextlib.py"
+ ]
+ },
+ "core": {
+ "summary": "Python interpreter and core modules",
+ "rdepends": [],
+ "files": [
+ "${bindir}/python*",
+ "${includedir}/python2.7/pyconfig*.h",
+ "${libdir}/python2.7/ConfigParser.py",
+ "${libdir}/python2.7/UserDict.py",
+ "${libdir}/python2.7/UserList.py",
+ "${libdir}/python2.7/UserString.py",
+ "${libdir}/python2.7/__future__.py",
+ "${libdir}/python2.7/_abcoll.py",
+ "${libdir}/python2.7/_sysconfigdata.py",
+ "${libdir}/python2.7/_weakrefset.py",
+ "${libdir}/python2.7/abc.py",
+ "${libdir}/python2.7/ast.py",
+ "${libdir}/python2.7/atexit.py",
+ "${libdir}/python2.7/codecs.py",
+ "${libdir}/python2.7/collections.py",
+ "${libdir}/python2.7/copy.py",
+ "${libdir}/python2.7/copy_reg.py",
+ "${libdir}/python2.7/encodings",
+ "${libdir}/python2.7/encodings/aliases.py",
+ "${libdir}/python2.7/encodings/utf_8.py",
+ "${libdir}/python2.7/genericpath.py",
+ "${libdir}/python2.7/getopt.py",
+ "${libdir}/python2.7/heapq.py",
+ "${libdir}/python2.7/importlib",
+ "${libdir}/python2.7/keyword.py",
+ "${libdir}/python2.7/lib-dynload/_collections.so",
+ "${libdir}/python2.7/lib-dynload/_heapq.so",
+ "${libdir}/python2.7/lib-dynload/_locale.so",
+ "${libdir}/python2.7/lib-dynload/_struct.so",
+ "${libdir}/python2.7/lib-dynload/binascii.so",
+ "${libdir}/python2.7/lib-dynload/itertools.so",
+ "${libdir}/python2.7/lib-dynload/operator.so",
+ "${libdir}/python2.7/lib-dynload/readline.so",
+ "${libdir}/python2.7/lib-dynload/strop.so",
+ "${libdir}/python2.7/lib-dynload/time.so",
+ "${libdir}/python2.7/lib-dynload/xreadlines.so",
+ "${libdir}/python2.7/linecache.py",
+ "${libdir}/python2.7/new.py",
+ "${libdir}/python2.7/ntpath.py",
+ "${libdir}/python2.7/os.py",
+ "${libdir}/python2.7/platform.py",
+ "${libdir}/python2.7/posixpath.py",
+ "${libdir}/python2.7/re.py",
+ "${libdir}/python2.7/rlcompleter.py",
+ "${libdir}/python2.7/site.py",
+ "${libdir}/python2.7/sitecustomize.py",
+ "${libdir}/python2.7/sre_compile.py",
+ "${libdir}/python2.7/sre_constants.py",
+ "${libdir}/python2.7/sre_parse.py",
+ "${libdir}/python2.7/stat.py",
+ "${libdir}/python2.7/string.py",
+ "${libdir}/python2.7/struct.py",
+ "${libdir}/python2.7/sysconfig.py",
+ "${libdir}/python2.7/traceback.py",
+ "${libdir}/python2.7/types.py",
+ "${libdir}/python2.7/warnings.py",
+ "${libdir}/python2.7/weakref.py"
+ ]
+ },
+ "crypt": {
+ "summary": "Python basic cryptographic and hashing support",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/hashlib.py",
+ "${libdir}/python2.7/lib-dynload/_hashlib.so",
+ "${libdir}/python2.7/lib-dynload/crypt.so",
+ "${libdir}/python2.7/md5.py",
+ "${libdir}/python2.7/sha.py"
+ ]
+ },
+ "ctypes": {
+ "summary": "Python C types support",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/ctypes",
+ "${libdir}/python2.7/lib-dynload/_ctypes.so",
+ "${libdir}/python2.7/lib-dynload/_ctypes_test.so"
+ ]
+ },
+ "curses": {
+ "summary": "Python curses support",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/curses",
+ "${libdir}/python2.7/lib-dynload/_curses.so",
+ "${libdir}/python2.7/lib-dynload/_curses_panel.so"
+ ]
+ },
+ "datetime": {
+ "summary": "Python calendar and time support",
+ "rdepends": [
+ "codecs",
+ "core",
+ "lang"
+ ],
+ "files": [
+ "${libdir}/python2.7/_strptime.py",
+ "${libdir}/python2.7/calendar.py",
+ "${libdir}/python2.7/lib-dynload/datetime.so"
+ ]
+ },
+ "db": {
+ "summary": "Python file-based database support",
+ "rdepends": [
+ "bsddb",
+ "core",
+ "gdbm"
+ ],
+ "files": [
+ "${libdir}/python2.7/anydbm.py",
+ "${libdir}/python2.7/dbhash.py",
+ "${libdir}/python2.7/dumbdbm.py",
+ "${libdir}/python2.7/lib-dynload/dbm.so",
+ "${libdir}/python2.7/whichdb.py"
+ ]
+ },
+ "debugger": {
+ "summary": "Python debugger",
+ "rdepends": [
+ "core",
+ "io",
+ "lang",
+ "pprint",
+ "shell"
+ ],
+ "files": [
+ "${libdir}/python2.7/bdb.py",
+ "${libdir}/python2.7/pdb.py"
+ ]
+ },
+ "dev": {
+ "files": [
+ "${base_libdir}/*.a",
+ "${base_libdir}/*.o",
+ "${datadir}/aclocal",
+ "${datadir}/pkgconfig",
+ "${includedir}",
+ "${libdir}/*.a",
+ "${libdir}/*.la",
+ "${libdir}/*.o",
+ "${libdir}/lib*${SOLIBSDEV}",
+ "${libdir}/pkgconfig",
+ "${libdir}/python2.7/config/Makefile"
+ ],
+ "rdepends": [
+ "core"
+ ],
+ "summary": "Python development package"
+ },
+ "difflib": {
+ "summary": "Python helpers for computing deltas between objects",
+ "rdepends": [
+ "core",
+ "lang"
+ ],
+ "files": [
+ "${libdir}/python2.7/difflib.py"
+ ]
+ },
+ "distutils-staticdev": {
+ "files": [
+ "${libdir}/python2.7/config/lib*.a"
+ ],
+ "rdepends": [
+ "distutils"
+ ],
+ "summary": "Python distribution utilities (static libraries)"
+ },
+ "distutils": {
+ "summary": "Python Distribution Utilities",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/config",
+ "${libdir}/python2.7/distutils"
+ ]
+ },
+ "doctest": {
+ "summary": "Python framework for running examples in docstrings",
+ "rdepends": [
+ "core",
+ "crypt",
+ "debugger",
+ "difflib",
+ "fcntl",
+ "io",
+ "lang",
+ "math",
+ "pprint",
+ "shell",
+ "unittest"
+ ],
+ "files": [
+ "${libdir}/python2.7/doctest.py"
+ ]
+ },
+ "email": {
+ "summary": "Python email support",
+ "rdepends": [
+ "contextlib",
+ "core",
+ "crypt",
+ "fcntl",
+ "io",
+ "lang",
+ "math",
+ "netclient",
+ "pickle",
+ "subprocess",
+ "textutils",
+ "threading"
+ ],
+ "files": [
+ "${libdir}/python2.7/email",
+ "${libdir}/python2.7/imaplib.py"
+ ]
+ },
+ "fcntl": {
+ "summary": "Python's fcntl interface",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/lib-dynload/fcntl.so"
+ ]
+ },
+ "gdbm": {
+ "summary": "Python GNU database support",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/lib-dynload/gdbm.so"
+ ]
+ },
+ "hotshot": {
+ "summary": "Python hotshot performance profiler",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/hotshot",
+ "${libdir}/python2.7/lib-dynload/_hotshot.so"
+ ]
+ },
+ "html": {
+ "summary": "Python HTML processing support",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/HTMLParser.py",
+ "${libdir}/python2.7/formatter.py",
+ "${libdir}/python2.7/htmlentitydefs.py",
+ "${libdir}/python2.7/htmllib.py",
+ "${libdir}/python2.7/markupbase.py",
+ "${libdir}/python2.7/sgmllib.py"
+ ]
+ },
+ "idle": {
+ "summary": "Python Integrated Development Environment",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${bindir}/idle",
+ "${libdir}/python2.7/idlelib"
+ ]
+ },
+ "image": {
+ "summary": "Python graphical image handling",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/colorsys.py",
+ "${libdir}/python2.7/imghdr.py"
+ ]
+ },
+ "io": {
+ "summary": "Python low-level I/O",
+ "rdepends": [
+ "contextlib",
+ "core",
+ "crypt",
+ "fcntl",
+ "lang",
+ "math",
+ "netclient",
+ "textutils"
+ ],
+ "files": [
+ "${libdir}/python2.7/StringIO.py",
+ "${libdir}/python2.7/_pyio.py",
+ "${libdir}/python2.7/io.py",
+ "${libdir}/python2.7/lib-dynload/_io.so",
+ "${libdir}/python2.7/lib-dynload/_socket.so",
+ "${libdir}/python2.7/lib-dynload/_ssl.so",
+ "${libdir}/python2.7/lib-dynload/cStringIO.so",
+ "${libdir}/python2.7/lib-dynload/select.so",
+ "${libdir}/python2.7/lib-dynload/termios.so",
+ "${libdir}/python2.7/pipes.py",
+ "${libdir}/python2.7/socket.py",
+ "${libdir}/python2.7/ssl.py",
+ "${libdir}/python2.7/tempfile.py"
+ ]
+ },
+ "json": {
+ "summary": "Python JSON support",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/json",
+ "${libdir}/python2.7/lib-dynload/_json.so"
+ ]
+ },
+ "lang": {
+ "summary": "Python low-level language support",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/bisect.py",
+ "${libdir}/python2.7/code.py",
+ "${libdir}/python2.7/codeop.py",
+ "${libdir}/python2.7/dis.py",
+ "${libdir}/python2.7/functools.py",
+ "${libdir}/python2.7/inspect.py",
+ "${libdir}/python2.7/lib-dynload/_bisect.so",
+ "${libdir}/python2.7/lib-dynload/_functools.so",
+ "${libdir}/python2.7/lib-dynload/array.so",
+ "${libdir}/python2.7/lib-dynload/parser.so",
+ "${libdir}/python2.7/opcode.py",
+ "${libdir}/python2.7/repr.py",
+ "${libdir}/python2.7/symbol.py",
+ "${libdir}/python2.7/token.py",
+ "${libdir}/python2.7/tokenize.py"
+ ]
+ },
+ "logging": {
+ "summary": "Python logging support",
+ "rdepends": [
+ "core",
+ "io",
+ "threading"
+ ],
+ "files": [
+ "${libdir}/python2.7/logging"
+ ]
+ },
+ "mailbox": {
+ "summary": "Python mailbox format support",
+ "rdepends": [
+ "codecs",
+ "contextlib",
+ "core",
+ "crypt",
+ "datetime",
+ "email",
+ "fcntl",
+ "io",
+ "lang",
+ "math",
+ "mime",
+ "netclient",
+ "textutils"
+ ],
+ "files": [
+ "${libdir}/python2.7/mailbox.py"
+ ]
+ },
+ "math": {
+ "summary": "Python math support",
+ "rdepends": [
+ "core",
+ "crypt"
+ ],
+ "files": [
+ "${libdir}/python2.7/lib-dynload/_random.so",
+ "${libdir}/python2.7/lib-dynload/cmath.so",
+ "${libdir}/python2.7/lib-dynload/math.so",
+ "${libdir}/python2.7/random.py",
+ "${libdir}/python2.7/sets.py"
+ ]
+ },
+ "mime": {
+ "summary": "Python MIME handling APIs",
+ "rdepends": [
+ "contextlib",
+ "core",
+ "crypt",
+ "fcntl",
+ "io",
+ "lang",
+ "math",
+ "netclient",
+ "textutils"
+ ],
+ "files": [
+ "${libdir}/python2.7/MimeWriter.py",
+ "${libdir}/python2.7/mimetools.py",
+ "${libdir}/python2.7/mimetypes.py",
+ "${libdir}/python2.7/quopri.py",
+ "${libdir}/python2.7/rfc822.py",
+ "${libdir}/python2.7/uu.py"
+ ]
+ },
+ "mmap": {
+ "summary": "Python memory-mapped file support",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/lib-dynload/mmap.so"
+ ]
+ },
+ "modules": {
+ "files": [],
+ "rdepends": [
+ "2to3",
+ "argparse",
+ "audio",
+ "bsddb",
+ "codecs",
+ "compile",
+ "compiler",
+ "compression",
+ "contextlib",
+ "core",
+ "crypt",
+ "ctypes",
+ "curses",
+ "datetime",
+ "db",
+ "debugger",
+ "difflib",
+ "distutils",
+ "doctest",
+ "email",
+ "fcntl",
+ "gdbm",
+ "hotshot",
+ "html",
+ "idle",
+ "image",
+ "io",
+ "json",
+ "lang",
+ "logging",
+ "mailbox",
+ "math",
+ "mime",
+ "mmap",
+ "multiprocessing",
+ "netclient",
+ "netserver",
+ "numbers",
+ "pickle",
+ "pkgutil",
+ "plistlib",
+ "pprint",
+ "profile",
+ "pydoc",
+ "re",
+ "resource",
+ "robotparser",
+ "runpy",
+ "shell",
+ "smtpd",
+ "sqlite3",
+ "sqlite3",
+ "stringold",
+ "subprocess",
+ "syslog",
+ "terminal",
+ "textutils",
+ "threading",
+ "tkinter",
+ "unittest",
+ "unixadmin",
+ "xml",
+ "xmlrpc",
+ "zlib"
+ ],
+ "summary": "All Python modules"
+ },
+ "multiprocessing": {
+ "summary": "Python multiprocessing support",
+ "rdepends": [
+ "core",
+ "fcntl",
+ "io",
+ "pickle",
+ "subprocess",
+ "threading"
+ ],
+ "files": [
+ "${libdir}/python2.7/lib-dynload/_multiprocessing.so",
+ "${libdir}/python2.7/multiprocessing"
+ ]
+ },
+ "netclient": {
+ "summary": "Python Internet Protocol clients",
+ "rdepends": [
+ "codecs",
+ "contextlib",
+ "core",
+ "crypt",
+ "ctypes",
+ "datetime",
+ "email",
+ "fcntl",
+ "io",
+ "lang",
+ "math",
+ "mime",
+ "pickle",
+ "subprocess",
+ "textutils",
+ "threading"
+ ],
+ "files": [
+ "${libdir}/python2.7/Cookie.py",
+ "${libdir}/python2.7/_LWPCookieJar.py",
+ "${libdir}/python2.7/_MozillaCookieJar.py",
+ "${libdir}/python2.7/base64.py",
+ "${libdir}/python2.7/cookielib.py",
+ "${libdir}/python2.7/ftplib.py",
+ "${libdir}/python2.7/hmac.py",
+ "${libdir}/python2.7/httplib.py",
+ "${libdir}/python2.7/nntplib.py",
+ "${libdir}/python2.7/poplib.py",
+ "${libdir}/python2.7/smtplib.py",
+ "${libdir}/python2.7/telnetlib.py",
+ "${libdir}/python2.7/urllib.py",
+ "${libdir}/python2.7/urllib2.py",
+ "${libdir}/python2.7/urlparse.py",
+ "${libdir}/python2.7/uuid.py"
+ ]
+ },
+ "netserver": {
+ "summary": "Python Internet Protocol servers",
+ "rdepends": [
+ "compression",
+ "contextlib",
+ "core",
+ "crypt",
+ "fcntl",
+ "io",
+ "lang",
+ "math",
+ "mime",
+ "netclient",
+ "shell",
+ "textutils",
+ "threading",
+ "unixadmin",
+ "zlib"
+ ],
+ "files": [
+ "${libdir}/python2.7/BaseHTTPServer.py",
+ "${libdir}/python2.7/CGIHTTPServer.py",
+ "${libdir}/python2.7/SimpleHTTPServer.py",
+ "${libdir}/python2.7/SocketServer.py",
+ "${libdir}/python2.7/cgi.py"
+ ]
+ },
+ "numbers": {
+ "summary": "Python number APIs",
+ "rdepends": [
+ "codecs",
+ "core",
+ "lang",
+ "math",
+ "threading"
+ ],
+ "files": [
+ "${libdir}/python2.7/decimal.py",
+ "${libdir}/python2.7/fractions.py",
+ "${libdir}/python2.7/numbers.py"
+ ]
+ },
+ "pickle": {
+ "summary": "Python serialisation/persistence support",
+ "rdepends": [
+ "core",
+ "io"
+ ],
+ "files": [
+ "${libdir}/python2.7/lib-dynload/cPickle.so",
+ "${libdir}/python2.7/pickle.py",
+ "${libdir}/python2.7/pickletools.py",
+ "${libdir}/python2.7/shelve.py"
+ ]
+ },
+ "pkgutil": {
+ "summary": "Python package extension utility support",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/pkgutil.py"
+ ]
+ },
+ "plistlib": {
+ "summary": "Generate and parse Mac OS X .plist files",
+ "rdepends": [
+ "core",
+ "datetime",
+ "io"
+ ],
+ "files": [
+ "${libdir}/python2.7/plistlib.py"
+ ]
+ },
+ "pprint": {
+ "summary": "Python pretty-print support",
+ "rdepends": [
+ "core",
+ "io"
+ ],
+ "files": [
+ "${libdir}/python2.7/pprint.py"
+ ]
+ },
+ "profile": {
+ "summary": "Python basic performance profiling support",
+ "rdepends": [
+ "codecs",
+ "core",
+ "lang",
+ "resource",
+ "textutils"
+ ],
+ "files": [
+ "${libdir}/python2.7/cProfile.py",
+ "${libdir}/python2.7/lib-dynload/_lsprof.so",
+ "${libdir}/python2.7/profile.py",
+ "${libdir}/python2.7/pstats.py"
+ ]
+ },
+ "pydoc": {
+ "summary": "Python interactive help support",
+ "rdepends": [
+ "codecs",
+ "core",
+ "lang",
+ "pkgutil"
+ ],
+ "files": [
+ "${bindir}/pydoc",
+ "${libdir}/python2.7/pydoc.py",
+ "${libdir}/python2.7/pydoc_data"
+ ]
+ },
+ "re": {
+ "summary": "Python Regular Expression APIs",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/sre.py"
+ ]
+ },
+ "resource": {
+ "summary": "Python resource control interface",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/lib-dynload/resource.so"
+ ]
+ },
+ "robotparser": {
+ "summary": "Python robots.txt parser",
+ "rdepends": [
+ "contextlib",
+ "core",
+ "io",
+ "lang",
+ "netclient",
+ "textutils"
+ ],
+ "files": [
+ "${libdir}/python2.7/robotparser.py"
+ ]
+ },
+ "runpy": {
+ "summary": "Python helper for locating/executing scripts in module namespace",
+ "rdepends": [
+ "core",
+ "pkgutil"
+ ],
+ "files": [
+ "${libdir}/python2.7/runpy.py"
+ ]
+ },
+ "shell": {
+ "summary": "Python shell-like functionality",
+ "rdepends": [
+ "compression",
+ "core",
+ "io",
+ "unixadmin",
+ "zlib"
+ ],
+ "files": [
+ "${libdir}/python2.7/cmd.py",
+ "${libdir}/python2.7/commands.py",
+ "${libdir}/python2.7/dircache.py",
+ "${libdir}/python2.7/fnmatch.py",
+ "${libdir}/python2.7/glob.py",
+ "${libdir}/python2.7/popen2.py",
+ "${libdir}/python2.7/shlex.py",
+ "${libdir}/python2.7/shutil.py"
+ ]
+ },
+ "smtpd": {
+ "summary": "Python Simple Mail Transport Daemon",
+ "rdepends": [
+ "core",
+ "fcntl",
+ "io",
+ "lang"
+ ],
+ "files": [
+ "${bindir}/smtpd.py",
+ "${libdir}/python2.7/asynchat.py",
+ "${libdir}/python2.7/asyncore.py",
+ "${libdir}/python2.7/smtpd.py"
+ ]
+ },
+ "sqlite3": {
+ "summary": "Python Sqlite3 database support",
+ "rdepends": [
+ "core",
+ "datetime"
+ ],
+ "files": [
+ "${libdir}/python2.7/lib-dynload/_sqlite3.so",
+ "${libdir}/python2.7/sqlite3"
+ ]
+ },
+ "stringold": {
+ "summary": "Python string APIs [deprecated]",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/stringold.py"
+ ]
+ },
+ "subprocess": {
+ "summary": "Python subprocess support",
+ "rdepends": [
+ "core",
+ "fcntl",
+ "io",
+ "pickle",
+ "threading"
+ ],
+ "files": [
+ "${libdir}/python2.7/subprocess.py"
+ ]
+ },
+ "syslog": {
+ "summary": "Python syslog interface",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/lib-dynload/syslog.so"
+ ]
+ },
+ "terminal": {
+ "summary": "Python terminal controlling support",
+ "rdepends": [
+ "core",
+ "io"
+ ],
+ "files": [
+ "${libdir}/python2.7/pty.py",
+ "${libdir}/python2.7/tty.py"
+ ]
+ },
+ "textutils": {
+ "summary": "Python option parsin",
+ "rdepends": [
+ "codecs",
+ "core",
+ "io",
+ "lang"
+ ],
+ "files": [
+ "${libdir}/python2.7/csv.py",
+ "${libdir}/python2.7/lib-dynload/_csv.so",
+ "${libdir}/python2.7/optparse.py",
+ "${libdir}/python2.7/textwrap.py"
+ ]
+ },
+ "threading": {
+ "summary": "Python threading & synchronization support",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/Queue.py",
+ "${libdir}/python2.7/_threading_local.py",
+ "${libdir}/python2.7/dummy_thread.py",
+ "${libdir}/python2.7/dummy_threading.py",
+ "${libdir}/python2.7/mutex.py",
+ "${libdir}/python2.7/threading.py"
+ ]
+ },
+ "tkinter": {
+ "summary": "Python Tcl/Tk bindings",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_tkinter.so",
+ "${libdir}/python2.7/lib-tk"
+ ]
+ },
+ "unittest": {
+ "summary": "Python unit testing framework",
+ "rdepends": [
+ "core",
+ "difflib",
+ "io",
+ "lang",
+ "pprint",
+ "shell"
+ ],
+ "files": [
+ "${libdir}/python2.7/unittest"
+ ]
+ },
+ "unixadmin": {
+ "summary": "Python Unix administration support",
+ "rdepends": [
+ "core",
+ "io"
+ ],
+ "files": [
+ "${libdir}/python2.7/getpass.py",
+ "${libdir}/python2.7/lib-dynload/grp.so",
+ "${libdir}/python2.7/lib-dynload/nis.so"
+ ]
+ },
+ "xml": {
+ "summary": "Python basic XML support",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/lib-dynload/_elementtree.so",
+ "${libdir}/python2.7/lib-dynload/pyexpat.so",
+ "${libdir}/python2.7/xml"
+ ]
+ },
+ "xmlrpc": {
+ "summary": "Python XML-RPC support",
+ "rdepends": [
+ "codecs",
+ "compression",
+ "contextlib",
+ "core",
+ "crypt",
+ "datetime",
+ "fcntl",
+ "io",
+ "lang",
+ "math",
+ "mime",
+ "netclient",
+ "netserver",
+ "pkgutil",
+ "pydoc",
+ "textutils",
+ "threading",
+ "xml",
+ "zlib"
+ ],
+ "files": [
+ "${libdir}/python2.7/DocXMLRPCServer.py",
+ "${libdir}/python2.7/SimpleXMLRPCServer.py",
+ "${libdir}/python2.7/xmlrpclib.py"
+ ]
+ },
+ "zlib": {
+ "summary": "Python zlib compression support",
+ "rdepends": [
+ "core"
+ ],
+ "files": [
+ "${libdir}/python2.7/lib-dynload/zlib.so"
+ ]
+ }
+}
diff --git a/external/meta-python2/recipes-devtools/python/python/run-ptest b/external/meta-python2/recipes-devtools/python/python/run-ptest
new file mode 100644
index 00000000..c7002a45
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+python -mtest -W | sed -u -e '/\.\.\. ok/ s/^/PASS: /g' -e '/\.\.\. [ERROR|FAIL]/ s/^/FAIL: /g' -e '/\.\.\. skipped/ s/^/SKIP: /g' -e 's/ \.\.\. ok//g' -e 's/ \.\.\. ERROR//g' -e 's/ \.\.\. FAIL//g' -e 's/ \.\.\. skipped//g'
diff --git a/external/meta-python2/recipes-devtools/python/python/search_db_h_in_inc_dirs_and_avoid_warning.patch b/external/meta-python2/recipes-devtools/python/python/search_db_h_in_inc_dirs_and_avoid_warning.patch
new file mode 100644
index 00000000..dacb552e
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/search_db_h_in_inc_dirs_and_avoid_warning.patch
@@ -0,0 +1,35 @@
+python should search for db.h in inc_dirs and not in a hardcoded path.
+If db.h is found but HASHVERSION is not 2 we avoid a warning by not
+adding this module to missing variable.
+
+Upstream-Status: Inappropriate [distribution]
+
+Signed-off-by: Andrei Gherzan <andrei@gherzan.ro>
+
+
+diff --git a/setup.py b/setup.py
+index b887808..ae51607 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1237,6 +1237,8 @@ class PyBuildExt(build_ext):
+ # the more recent berkeleydb's db.h file first in the include path
+ # when attempting to compile and it will fail.
+ f = "/usr/include/db.h"
++ if len(inc_dirs) != 0:
++ f = os.path.join(inc_dirs[0], "db.h")
+
+ if host_platform == 'darwin':
+ if is_macosx_sdk_path(f):
+@@ -1257,8 +1259,10 @@ class PyBuildExt(build_ext):
+ libraries=libraries))
+ else:
+ exts.append(Extension('bsddb185', ['bsddbmodule.c']))
+- else:
+- missing.append('bsddb185')
++ # If a newer version is detected don't report an useless
++ # warning
++ #else:
++ # missing.append('bsddb185')
+ else:
+ missing.append('bsddb185')
+
diff --git a/external/meta-python2/recipes-devtools/python/python/setup_py_skip_cross_import_check.patch b/external/meta-python2/recipes-devtools/python/python/setup_py_skip_cross_import_check.patch
new file mode 100644
index 00000000..6ccdb948
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/setup_py_skip_cross_import_check.patch
@@ -0,0 +1,27 @@
+This patch skips over the 'import check' setup.py does when building
+extensions. This generally won't work when cross-compiling.
+
+Upstream-Status: Inappropriate [embedded-specific]
+
+Signed-off-by: Tom Zanussi <tom.zanussi@intel.com>
+
+Index: Python-2.7.2/setup.py
+===================================================================
+--- Python-2.7.2.orig/setup.py 2011-11-04 16:46:34.553796410 -0500
++++ Python-2.7.2/setup.py 2011-11-04 16:59:49.692802313 -0500
+@@ -287,6 +287,15 @@
+ (ext.name, sys.exc_info()[1]))
+ self.failed.append(ext.name)
+ return
++
++ # If we're cross-compiling, we want to skip the import check
++ # i.e. we shouldn't be dynamically loading target shared libs
++ if os.environ.get('CROSS_COMPILE') is not None:
++ self.announce(
++ 'WARNING: skipping import check for cross-compiled "%s"' %
++ ext.name)
++ return
++
+ # Workaround for Mac OS X: The Carbon-based modules cannot be
+ # reliably imported into a command-line Python
+ if 'Carbon' in ext.extra_link_args:
diff --git a/external/meta-python2/recipes-devtools/python/python/setuptweaks.patch b/external/meta-python2/recipes-devtools/python/python/setuptweaks.patch
new file mode 100644
index 00000000..3a91b191
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/setuptweaks.patch
@@ -0,0 +1,57 @@
+This patch removes various ways native system options can pass into the python
+compilation and somehow break C modules.
+
+Upstream-Status: Inappropriate [OE Specific]
+
+RP 2012/04/23
+
+Index: Python-2.7.2/setup.py
+===================================================================
+--- Python-2.7.2.orig/setup.py 2012-04-23 20:03:47.295582553 +0000
++++ Python-2.7.2/setup.py 2012-04-23 20:03:15.000000000 +0000
+@@ -231,7 +231,13 @@
+ # compilers
+ if compiler is not None:
+ (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
+- args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
++ # Need to filter out -isysroot from the flags. Ideally should
++ # figure out target flags here.
++ flags = []
++ for f in cflags.split():
++ if not f.startswith("-isystem"):
++ flags.append(f)
++ args['compiler_so'] = compiler + ' ' + ccshared + ' ' + ' '.join(flags)
+ self.compiler.set_executables(**args)
+
+ build_ext.build_extensions(self)
+@@ -393,7 +399,6 @@
+ # into configure and stored in the Makefile (issue found on OS X 10.3).
+ for env_var, arg_name, dir_list in (
+ ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
+- ('LDFLAGS', '-L', self.compiler.library_dirs),
+ ('CPPFLAGS', '-I', self.compiler.include_dirs)):
+ env_val = sysconfig.get_config_var(env_var)
+ if env_val:
+@@ -419,16 +424,16 @@
+ for directory in reversed(options.dirs):
+ add_dir_to_list(dir_list, directory)
+
+- if os.path.normpath(sys.prefix) != '/usr' \
+- and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
++# if os.path.normpath(sys.prefix) != '/usr' \
++# and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
+ # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
+ # (PYTHONFRAMEWORK is set) to avoid # linking problems when
+ # building a framework with different architectures than
+ # the one that is currently installed (issue #7473)
+- add_dir_to_list(self.compiler.library_dirs,
+- sysconfig.get_config_var("LIBDIR"))
+- add_dir_to_list(self.compiler.include_dirs,
+- sysconfig.get_config_var("INCLUDEDIR"))
++# add_dir_to_list(self.compiler.library_dirs,
++# sysconfig.get_config_var("LIBDIR"))
++# add_dir_to_list(self.compiler.include_dirs,
++# sysconfig.get_config_var("INCLUDEDIR"))
+
+ try:
+ have_unicode = unicode
diff --git a/external/meta-python2/recipes-devtools/python/python/sitecustomize.py b/external/meta-python2/recipes-devtools/python/python/sitecustomize.py
new file mode 100644
index 00000000..4c8b5e2b
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/sitecustomize.py
@@ -0,0 +1,37 @@
+# OpenEmbedded sitecustomize.py (C) 2002-2008 Michael 'Mickey' Lauer <mlauer@vanille-media.de>
+# GPLv2 or later
+# Version: 20081123
+# Features:
+# * set proper default encoding
+# * enable readline completion in the interactive interpreter
+# * load command line history on startup
+# * save command line history on exit
+
+import os
+
+def __exithandler():
+ try:
+ readline.write_history_file( "%s/.python-history" % os.getenv( "HOME", "/tmp" ) )
+ except IOError:
+ pass
+
+def __registerExitHandler():
+ import atexit
+ atexit.register( __exithandler )
+
+def __enableReadlineSupport():
+ readline.set_history_length( 1000 )
+ readline.parse_and_bind( "tab: complete" )
+ try:
+ readline.read_history_file( "%s/.python-history" % os.getenv( "HOME", "/tmp" ) )
+ except IOError:
+ pass
+
+import sys
+try:
+ import rlcompleter, readline
+except ImportError:
+ pass
+else:
+ __registerExitHandler()
+ __enableReadlineSupport()
diff --git a/external/meta-python2/recipes-devtools/python/python/support_SOURCE_DATE_EPOCH_in_py_compile_2.7.patch b/external/meta-python2/recipes-devtools/python/python/support_SOURCE_DATE_EPOCH_in_py_compile_2.7.patch
new file mode 100644
index 00000000..12651798
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/support_SOURCE_DATE_EPOCH_in_py_compile_2.7.patch
@@ -0,0 +1,34 @@
+The compiled .pyc files contain time stamp corresponding to the compile time.
+This prevents binary reproducibility. This patch allows to achieve binary
+reproducibility by overriding the build time stamp by the value
+exported via SOURCE_DATE_EPOCH.
+
+Patch by Bernhard M. Wiedemann
+
+Upstream-Status: Backport
+
+Signed-off-by: Juro Bystricky <juro.bystricky@intel.com>
+
+Fri Feb 24 17:08:25 UTC 2017 - bwiedemann@suse.com
+
+- Add reproducible.patch to allow reproducible builds of various
+ python packages like python-amqp
+ Upstream: https://github.com/python/cpython/pull/296
+
+
+@@ -0,0 +1,15 @@
+Index: Python-2.7.13/Lib/py_compile.py
+===================================================================
+--- Python-2.7.13.orig/Lib/py_compile.py
++++ Python-2.7.13/Lib/py_compile.py
+@@ -108,6 +108,10 @@ def compile(file, cfile=None, dfile=None
+ timestamp = long(os.fstat(f.fileno()).st_mtime)
+ except AttributeError:
+ timestamp = long(os.stat(file).st_mtime)
++ sde = os.environ.get('SOURCE_DATE_EPOCH')
++ if sde and timestamp > int(sde):
++ timestamp = int(sde)
++ os.utime(file, (timestamp, timestamp))
+ codestring = f.read()
+ try:
+ codeobject = __builtin__.compile(codestring, dfile or file,'exec')
diff --git a/external/meta-python2/recipes-devtools/python/python/use_sysroot_ncurses_instead_of_host.patch b/external/meta-python2/recipes-devtools/python/python/use_sysroot_ncurses_instead_of_host.patch
new file mode 100644
index 00000000..fb4a3bcf
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python/use_sysroot_ncurses_instead_of_host.patch
@@ -0,0 +1,21 @@
+Python tries to use ncursesw from the host,
+if it is not found causes an error on configure,
+we should use ncursesw from sysroot instead
+
+Upstream-Status: Pending
+
+Signed-off-by: Alejandro Hernandez <alejandro.hernandez@linux.intel.com>
+
+Index: Python-2.7.9/configure.ac
+===================================================================
+--- Python-2.7.9.orig/configure.ac
++++ Python-2.7.9/configure.ac
+@@ -4311,7 +4311,7 @@ fi
+
+ # first curses configure check
+ ac_save_cppflags="$CPPFLAGS"
+-CPPFLAGS="$CPPFLAGS -I/usr/include/ncursesw"
++CPPFLAGS="$CPPFLAGS -I=/usr/include/ncursesw"
+
+ AC_CHECK_HEADERS(curses.h ncurses.h)
+
diff --git a/external/meta-python2/recipes-devtools/python/python_2.7.18.bb b/external/meta-python2/recipes-devtools/python/python_2.7.18.bb
new file mode 100644
index 00000000..be7c6d2d
--- /dev/null
+++ b/external/meta-python2/recipes-devtools/python/python_2.7.18.bb
@@ -0,0 +1,260 @@
+require python.inc
+
+DEPENDS = "libffi bzip2 gdbm openssl \
+ readline sqlite3 zlib virtual/crypt"
+
+DISTRO_SRC_URI ?= "file://sitecustomize.py"
+DISTRO_SRC_URI_linuxstdbase = ""
+SRC_URI += " \
+ file://01-use-proper-tools-for-cross-build.patch \
+ file://03-fix-tkinter-detection.patch \
+ file://06-avoid_usr_lib_termcap_path_in_linking.patch \
+ ${DISTRO_SRC_URI} \
+ file://multilib.patch \
+ file://cgi_py.patch \
+ file://setup_py_skip_cross_import_check.patch \
+ file://add-md5module-support.patch \
+ file://host_include_contamination.patch \
+ file://fix_for_using_different_libdir.patch \
+ file://setuptweaks.patch \
+ file://check-if-target-is-64b-not-host.patch \
+ file://search_db_h_in_inc_dirs_and_avoid_warning.patch \
+ ${@bb.utils.contains('PACKAGECONFIG', 'tk', '', 'file://avoid_warning_about_tkinter.patch', d)} \
+ file://avoid_warning_for_sunos_specific_module.patch \
+ file://python-2.7.3-remove-bsdb-rpath.patch \
+ file://run-ptest \
+ file://parallel-makeinst-create-bindir.patch \
+ file://use_sysroot_ncurses_instead_of_host.patch \
+ file://add-CROSSPYTHONPATH-for-PYTHON_FOR_BUILD.patch \
+ file://pass-missing-libraries-to-Extension-for-mul.patch \
+ file://support_SOURCE_DATE_EPOCH_in_py_compile_2.7.patch \
+ file://float-endian.patch \
+ file://0001-python2-use-cc_basename-to-replace-CC-for-checking-c.patch \
+"
+
+S = "${WORKDIR}/Python-${PV}"
+
+inherit autotools multilib_header python-dir pythonnative ptest
+
+EXTRA_OECONF += "--with-system-ffi"
+
+CACHED_CONFIGUREVARS = "ac_cv_file__dev_ptmx=yes \
+ ac_cv_file__dev_ptc=no \
+ ac_cv_working_tzset=yes"
+
+PACKAGECONFIG ??= "bdb"
+PACKAGECONFIG[bdb] = ",,db"
+PACKAGECONFIG[tk] = ",,tk"
+
+# pgen isn't needed in the current build, but use the binary from python-native just in case.
+EXTRA_OEMAKE = "PGEN=${STAGING_BINDIR_NATIVE}/python-native/pgen \
+ CROSSPYTHONPATH=${STAGING_LIBDIR_NATIVE}/python${PYTHON_MAJMIN}/lib-dynload/ \
+ STAGING_LIBDIR=${STAGING_LIBDIR} \
+ STAGING_INCDIR=${STAGING_INCDIR} \
+ STAGING_BASELIBDIR=${STAGING_BASELIBDIR} \
+ "
+
+do_configure_append() {
+ rm -f ${S}/Makefile.orig
+ autoreconf -Wcross --verbose --install --force --exclude=autopoint ../Python-${PV}/Modules/_ctypes/libffi
+}
+
+do_compile() {
+ # regenerate platform specific files, because they depend on system headers
+ cd ${S}/Lib/plat-linux2
+ include=${STAGING_INCDIR} ${STAGING_BINDIR_NATIVE}/python-native/python \
+ ${S}/Tools/scripts/h2py.py -i '(u_long)' \
+ ${STAGING_INCDIR}/dlfcn.h \
+ ${STAGING_INCDIR}/linux/cdrom.h \
+ ${STAGING_INCDIR}/netinet/in.h \
+ ${STAGING_INCDIR}/sys/types.h
+ sed -e 's,${STAGING_DIR_HOST},,g' -i *.py
+ cd -
+
+ # remove any bogus LD_LIBRARY_PATH
+ sed -i -e s,RUNSHARED=.*,RUNSHARED=, Makefile
+
+ if [ ! -f Makefile.orig ]; then
+ install -m 0644 Makefile Makefile.orig
+ fi
+ sed -i -e 's#^LDFLAGS=.*#LDFLAGS=${LDFLAGS} -L. -L${STAGING_LIBDIR}#g' \
+ -e 's,libdir=${libdir},libdir=${STAGING_LIBDIR},g' \
+ -e 's,libexecdir=${libexecdir},libexecdir=${STAGING_DIR_HOST}${libexecdir},g' \
+ -e 's,^LIBDIR=.*,LIBDIR=${STAGING_LIBDIR},g' \
+ -e 's,includedir=${includedir},includedir=${STAGING_INCDIR},g' \
+ -e 's,^INCLUDEDIR=.*,INCLUDE=${STAGING_INCDIR},g' \
+ -e 's,^CONFINCLUDEDIR=.*,CONFINCLUDE=${STAGING_INCDIR},g' \
+ Makefile
+ # save copy of it now, because if we do it in do_install and
+ # then call do_install twice we get Makefile.orig == Makefile.sysroot
+ install -m 0644 Makefile Makefile.sysroot
+
+ export CROSS_COMPILE="${TARGET_PREFIX}"
+ export PYTHONBUILDDIR="${B}"
+
+ oe_runmake OPT="${CFLAGS}"
+}
+
+do_install() {
+ # make install needs the original Makefile, or otherwise the inclues would
+ # go to ${D}${STAGING...}/...
+ install -m 0644 Makefile.orig Makefile
+
+ export CROSS_COMPILE="${TARGET_PREFIX}"
+ export PYTHONBUILDDIR="${B}"
+
+ # After swizzling the makefile, we need to run the build again.
+ # install can race with the build so we have to run this first, then install
+ oe_runmake DESTDIR=${D} LIBDIR=${libdir}
+
+ oe_runmake DESTDIR=${D} LIBDIR=${libdir} install
+
+ install -m 0644 Makefile.sysroot ${D}/${libdir}/python${PYTHON_MAJMIN}/config/Makefile
+
+ if [ -e ${WORKDIR}/sitecustomize.py ]; then
+ install -m 0644 ${WORKDIR}/sitecustomize.py ${D}/${libdir}/python${PYTHON_MAJMIN}
+ fi
+
+ oe_multilib_header python${PYTHON_MAJMIN}/pyconfig.h
+
+ if [ -z "${@bb.utils.filter('PACKAGECONFIG', 'bdb', d)}" ]; then
+ rm -rf ${D}/${libdir}/python${PYTHON_MAJMIN}/bsddb
+ fi
+
+ # Python 3.x version of 2to3 is now the default
+ mv ${D}/${bindir}/2to3 ${D}/${bindir}/2to3-${PYTHON_MAJMIN}
+}
+
+do_install_append_class-nativesdk () {
+ create_wrapper ${D}${bindir}/python2.7 PYTHONHOME='${prefix}' TERMINFO_DIRS='${sysconfdir}/terminfo:/etc/terminfo:/usr/share/terminfo:/usr/share/misc/terminfo:/lib/terminfo' PYTHONNOUSERSITE='1'
+}
+
+SSTATE_SCAN_FILES += "Makefile"
+PACKAGE_PREPROCESS_FUNCS += "py_package_preprocess"
+
+py_package_preprocess () {
+ # copy back the old Makefile to fix target package
+ install -m 0644 ${B}/Makefile.orig ${PKGD}/${libdir}/python${PYTHON_MAJMIN}/config/Makefile
+
+ # Remove references to buildmachine paths in target Makefile and _sysconfigdata
+ sed -i -e 's:--sysroot=${STAGING_DIR_TARGET}::g' -e s:'--with-libtool-sysroot=${STAGING_DIR_TARGET}'::g \
+ -e 's|${DEBUG_PREFIX_MAP}||g' \
+ -e 's:${HOSTTOOLS_DIR}/::g' \
+ -e 's:${RECIPE_SYSROOT_NATIVE}::g' \
+ -e 's:${RECIPE_SYSROOT}::g' \
+ -e 's:${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}::g' \
+ ${PKGD}/${libdir}/python${PYTHON_MAJMIN}/config/Makefile \
+ ${PKGD}/${libdir}/python${PYTHON_MAJMIN}/_sysconfigdata.py
+ (cd ${PKGD}; python -m py_compile ./${libdir}/python${PYTHON_MAJMIN}/_sysconfigdata.py)
+}
+
+PACKAGES_remove = "${PN}"
+
+# manual dependency additions
+RPROVIDES_${PN}-modules = "${PN}"
+RRECOMMENDS_${PN}-core_append_class-nativesdk = " nativesdk-python-modules"
+RRECOMMENDS_${PN}-crypt = "openssl"
+
+# package libpython2
+PACKAGES =+ "lib${BPN}2"
+FILES_lib${BPN}2 = "${libdir}/libpython*.so.*"
+
+# catch all the rest (unsorted)
+PACKAGES += "${PN}-misc"
+FILES_${PN}-misc = "${libdir}/python${PYTHON_MAJMIN}"
+RDEPENDS_${PN}-modules += "${PN}-misc"
+
+# ptest
+RDEPENDS_${PN}-ptest = "${PN}-modules ${PN}-tests unzip tzdata-europe coreutils sed"
+RDEPENDS_${PN}-tkinter += "${@bb.utils.contains('PACKAGECONFIG', 'tk', 'tk tk-lib', '', d)}"
+# catch manpage
+PACKAGES += "${PN}-man"
+FILES_${PN}-man = "${datadir}/man"
+
+# Nasty but if bdb isn't enabled the package won't be generated
+RDEPENDS_${PN}-modules_remove = "${@bb.utils.contains('PACKAGECONFIG', 'bdb', '', '${PN}-bsddb', d)}"
+
+RDEPENDS_${PN}-dev = ""
+
+BBCLASSEXTEND = "nativesdk"
+
+# We want bytecode precompiled .py files (.pyc's) by default
+# but the user may set it on their own conf
+
+INCLUDE_PYCS ?= "1"
+
+python(){
+ import collections, json
+
+ filename = os.path.join(d.getVar('THISDIR'), 'python', 'python2-manifest.json')
+ # This python changes the datastore based on the contents of a file, so mark
+ # that dependency.
+ bb.parse.mark_dependency(d, filename)
+
+ with open(filename) as manifest_file:
+ manifest_str = manifest_file.read()
+ json_start = manifest_str.find('# EOC') + 6
+ manifest_file.seek(json_start)
+ manifest_str = manifest_file.read()
+ python_manifest = json.loads(manifest_str, object_pairs_hook=collections.OrderedDict)
+
+ include_pycs = d.getVar('INCLUDE_PYCS')
+
+ packages = d.getVar('PACKAGES').split()
+ pn = d.getVar('PN')
+
+ newpackages=[]
+
+ for key in python_manifest:
+ pypackage= pn + '-' + key
+
+ if pypackage not in packages:
+ # We need to prepend, otherwise python-misc gets everything
+ # so we use a new variable
+ newpackages.append(pypackage)
+
+ # "Build" python's manifest FILES, RDEPENDS and SUMMARY
+ d.setVar('FILES_' + pypackage, '')
+ for value in python_manifest[key]['files']:
+ d.appendVar('FILES_' + pypackage, ' ' + value)
+ if include_pycs == '1':
+ if value.endswith('.py'):
+ d.appendVar('FILES_' + pypackage, ' ' + value + '?')
+
+ for value in python_manifest[key]['rdepends']:
+ # Make it work with or without $PN
+ if '${PN}' in value:
+ value=value.split('-')[1]
+ d.appendVar('RDEPENDS_' + pypackage, ' ' + pn + '-' + value)
+ d.setVar('SUMMARY_' + pypackage, python_manifest[key]['summary'])
+
+ # Prepending so to avoid python-misc getting everything
+ packages = newpackages + packages
+ d.setVar('PACKAGES', ' '.join(packages))
+ d.setVar('ALLOW_EMPTY_${PN}-modules', '1')
+}
+
+# Files needed to create a new manifest
+SRC_URI += "file://create_manifest2.py file://get_module_deps2.py file://python2-manifest.json"
+
+do_create_manifest() {
+ # This task should be run with every new release of Python.
+ # We must ensure that PACKAGECONFIG enables everything when creating
+ # a new manifest, this is to base our new manifest on a complete
+ # native python build, containing all dependencies, otherwise the task
+ # wont be able to find the required files.
+ # e.g. BerkeleyDB is an optional build dependency so it may or may not
+ # be present, we must ensure it is.
+
+ cd ${WORKDIR}
+ # This needs to be executed by python-native and NOT by HOST's python
+ nativepython create_manifest2.py
+ cp python2-manifest.json.new ${THISDIR}/python/python2-manifest.json
+}
+
+# bitbake python -c create_manifest
+addtask do_create_manifest
+
+# Make sure we have native python ready when we create a new manifest
+do_create_manifest[depends] += "python:do_prepare_recipe_sysroot"
+do_create_manifest[depends] += "python:do_patch"
diff --git a/external/meta-python2/recipes-extended/python-cson/python-cson_git.bb b/external/meta-python2/recipes-extended/python-cson/python-cson_git.bb
new file mode 100644
index 00000000..efb338cf
--- /dev/null
+++ b/external/meta-python2/recipes-extended/python-cson/python-cson_git.bb
@@ -0,0 +1,21 @@
+# Copyright (C) 2015 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "Python library for CSON (schema-compressed JSON)"
+HOMEPAGE = "https://github.com/gt3389b/python-cson/"
+LICENSE = "MIT"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=7709d2635e63ab96973055a23c2a4cac"
+
+SRCREV = "f3f2898c44bb16b951d3e9f2fbf6d1c4158edda2"
+SRC_URI = "git://github.com/gt3389b/python-cson.git"
+
+S = "${WORKDIR}/git"
+
+RDEPENDS_${PN}_class-native = ""
+DEPENDS_append_class-native = " python-native "
+
+inherit setuptools
+
+BBCLASSEXTEND = "native"
+
diff --git a/external/meta-python2/recipes-extended/python-pyephem/python-pyephem_3.7.7.0.bb b/external/meta-python2/recipes-extended/python-pyephem/python-pyephem_3.7.7.0.bb
new file mode 100644
index 00000000..422f0dbc
--- /dev/null
+++ b/external/meta-python2/recipes-extended/python-pyephem/python-pyephem_3.7.7.0.bb
@@ -0,0 +1,17 @@
+SUMMARY = "PyEphem astronomical calculations"
+HOMEPAGE = "http://rhodesmill.org/pyephem/"
+
+LICENSE = "LGPL-3.0"
+LIC_FILES_CHKSUM = "file://COPYING;md5=f288303760f6e5ceaafe3aaa32186ab1"
+
+SRC_URI[md5sum] = "46c035b4a903ff26e0d8ad0f1fe6cc35"
+SRC_URI[sha256sum] = "607148429f85412915e32265779c0cf6d09f73aa97cf1ff0d101ac22c69c4436"
+
+PYPI_PACKAGE = "ephem"
+
+inherit pypi setuptools
+
+RDEPENDS_${PN} += "\
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-math \
+ "
diff --git a/external/meta-python2/recipes-extended/python-pyparted/python-pyparted_3.11.3.bb b/external/meta-python2/recipes-extended/python-pyparted/python-pyparted_3.11.3.bb
new file mode 100644
index 00000000..86caf2af
--- /dev/null
+++ b/external/meta-python2/recipes-extended/python-pyparted/python-pyparted_3.11.3.bb
@@ -0,0 +1,32 @@
+SUMMARY = "Python bindings for libparted"
+DESCRIPTION = "pyparted is a set of Python modules that provide Python programmers \
+an interface to libparted, the GNU parted library for disk partitioning and \
+filesystem manipulation."
+HOMEPAGE = "https://github.com/rhinstaller/pyparted"
+SECTION = "devel/python"
+
+LICENSE = "GPL-2.0+"
+LIC_FILES_CHKSUM = "\
+ file://COPYING;md5=8ca43cbc842c2336e835926c2166c28b \
+ file://src/_pedmodule.c;beginline=10;endline=22;md5=9e53304db812b80d0939e11bb69dcab2 \
+"
+
+# upstream only publishes releases in github archives which are discouraged
+SRCREV = "481510c10866851844b19f3d2ffcdaa37efc0cf8"
+SRC_URI = "git://github.com/rhinstaller/pyparted.git;protocol=https"
+
+DEPENDS += "parted"
+
+S = "${WORKDIR}/git"
+
+RDEPENDS_${PN}_class-target += " \
+ parted (>= 2.3) \
+"
+RDEPENDS_${PN}_class-native = ""
+
+inherit distutils
+
+RDEPENDS_${PN} += "python-stringold python-codecs python-math python-subprocess"
+RDEPENDS_${PN}_class-native = ""
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-extended/pywbem/python-pywbem_0.15.0.bb b/external/meta-python2/recipes-extended/pywbem/python-pywbem_0.15.0.bb
new file mode 100644
index 00000000..2b1e9300
--- /dev/null
+++ b/external/meta-python2/recipes-extended/pywbem/python-pywbem_0.15.0.bb
@@ -0,0 +1,68 @@
+SUMMARY = "Python WBEM Client and Provider Interface"
+DESCRIPTION = "\
+A Python library for making CIM (Common Information Model) operations over \
+HTTP using the WBEM CIM-XML protocol. It is based on the idea that a good \
+WBEM client should be easy to use and not necessarily require a large amount \
+of programming knowledge. It is suitable for a large range of tasks from \
+simply poking around to writing web and GUI applications. \
+\
+WBEM, or Web Based Enterprise Management is a manageability protocol, like \
+SNMP, standardised by the Distributed Management Task Force (DMTF) available \
+at http://www.dmtf.org/standards/wbem. \
+\
+It also provides a Python provider interface, and is the fastest and easiest \
+way to write providers on the planet."
+HOMEPAGE = "http://pywbem.github.io"
+SECTION = "devel/python"
+
+LICENSE = "LGPLv2.1"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=fbc093901857fcd118f065f900982c24"
+
+inherit pypi setuptools update-alternatives
+
+SRCREV = "b3386b3bee8876d15f0745147c0b08937d8ab18e"
+PYPI_SRC_URI = "git://github.com/pywbem/pywbem;protocol=https;branch=stable_0.15"
+
+S = "${WORKDIR}/git"
+
+DEPENDS += " \
+ ${PYTHON_PN}-m2crypto-native \
+ ${PYTHON_PN}-ply-native \
+ ${PYTHON_PN}-pyyaml-native \
+ ${PYTHON_PN}-six-native \
+ ${PYTHON_PN}-typing-native \
+"
+
+
+do_install_append() {
+ mv ${D}${bindir}/wbemcli.py ${D}${bindir}/pywbemcli
+
+ rm -f ${D}${bindir}/*.bat
+}
+
+RDEPENDS_${PN}_class-target += "\
+ ${PYTHON_PN}-argparse \
+ ${PYTHON_PN}-datetime \
+ ${PYTHON_PN}-io \
+ ${PYTHON_PN}-logging \
+ ${PYTHON_PN}-m2crypto \
+ ${PYTHON_PN}-misc \
+ ${PYTHON_PN}-netclient \
+ ${PYTHON_PN}-ply \
+ ${PYTHON_PN}-pyyaml \
+ ${PYTHON_PN}-six \
+ ${PYTHON_PN}-stringold \
+ ${PYTHON_PN}-subprocess \
+ ${PYTHON_PN}-threading \
+ ${PYTHON_PN}-unixadmin \
+ ${PYTHON_PN}-xml \
+"
+
+ALTERNATIVE_${PN} = "mof_compiler pywbemcli wbemcli"
+ALTERNATIVE_TARGET[mof_compiler] = "${bindir}/mof_compiler"
+ALTERNATIVE_TARGET[pywbemcli] = "${bindir}/pywbemcli"
+ALTERNATIVE_TARGET[wbemcli] = "${bindir}/wbemcli"
+
+ALTERNATIVE_PRIORITY = "30"
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-python2/recipes-support/dnssec-conf/dnssec-conf_2.02.bb b/external/meta-python2/recipes-support/dnssec-conf/dnssec-conf_2.02.bb
new file mode 100644
index 00000000..1b767a39
--- /dev/null
+++ b/external/meta-python2/recipes-support/dnssec-conf/dnssec-conf_2.02.bb
@@ -0,0 +1,41 @@
+SUMMARY = "DNSSEC and DLV configuration and priming tool"
+DESCRIPTION = "\
+DNSSEC configuration and priming tool. Keys are required until the root \
+is signed, as well as for local unpublished DNSSEC keys to be preloaded \
+into the recursive nameserver. These DNSSEC configuration files can be \
+directly included in the bind or unbound nameserver configuration files. \
+dnssec-conf includes a commandline configuration client for Bind and \
+Unbound, known DNSSEC keys, URL's to official publication pages of keys, \
+and harvested keys, as well a script to harvest DNSKEY's from DNS. \
+See also: system-config-dnssec"
+HOMEPAGE = "https://github.com/xelerance/dnssec-conf"
+SECTION = "net"
+LICENSE = "GPLv2+"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0636e73ff0215e8d672dc4c32c317bb3"
+DEPENDS += "xmlto-native docbook-xml-dtd4-native \
+ docbook-xsl-stylesheets-native libxslt-native"
+
+SRC_URI = "git://github.com/xelerance/dnssec-conf.git"
+SRCREV = "8e799683736b4a7b5e5e78f98fba0a6f48393537"
+
+S = "${WORKDIR}/git"
+
+do_install () {
+ rm -rf ${D}
+ make PREFIX=${prefix} DESTDIR=${D} ETCDIR=${D}${sysconfdir} install
+ # We no longer ship trust anchors. Most of these are in the DLV Registry now.
+ # and it prevents the problem of shipping outdated trust anchors.
+ # For DLV, we ship the ISC DLV Registry key
+ rm -rf ${D}${sysconfdir}/pki/dnssec-keys/harvest/*
+ rm -rf ${D}${sysconfdir}/pki/dnssec-keys/production/reverse/*
+ install -d -m 0755 ${D}${sysconfdir}/sysconfig
+ install -m 0644 packaging/fedora/dnssec.sysconfig ${D}${sysconfdir}/sysconfig/dnssec
+}
+
+RDEPENDS_${PN} = "\
+ bind-utils \
+ curl \
+ python \
+ python-dnspython \
+ python-pyparsing \
+"