diff --git a/.travis.yml b/.travis.yml
index 59a7e03..0b7b450 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,14 +1,15 @@
 sudo: required
-dist: trusty
+dist: xenial
 language: python
 python:
-- '2.7'
+- '3.6'
 install:
 - deactivate
 - export PATH=/usr/bin:$PATH
 - sudo dpkg --add-architecture i386
+- sudo add-apt-repository ppa:jonathonf/python-3.6 -y
 - sudo apt-get -qq update
-- sudo apt-get -qq install build-essential ccache git libncurses5:i386 libstdc++6:i386 libgtk2.0-0:i386 libpangox-1.0-0:i386 libpangoxft-1.0-0:i386 libidn11:i386 python2.7 python2.7-dev openjdk-8-jdk unzip zlib1g-dev zlib1g:i386 m4 libc6-dev-i386
+- sudo apt-get -qq install build-essential python3.6 python3.6-dev python3.6-venv python3-pip ccache git libncurses5:i386 libstdc++6:i386 libgtk2.0-0:i386 libpangox-1.0-0:i386 libpangoxft-1.0-0:i386 libidn11:i386 python2.7 python2.7-dev openjdk-8-jdk unzip zlib1g-dev zlib1g:i386 m4 libc6-dev-i386
 - sudo pip install --upgrade cython==0.25.2 pip setuptools
 - wget -q https://nodejs.org/dist/v8.11.1/node-v8.11.1-linux-x64.tar.xz
 - tar -xf node-v8.11.1-linux-x64.tar.xz
@@ -26,11 +27,14 @@ install:
 - cd ..
 - mv buildozer.spec.travis buildozer.spec
 - mkdir -p cd ~/.buildozer/android/platform/
-- wget -q 'https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip' -P ~/.buildozer/android/platform/
+- wget -q 'https://us.crystax.net/download/crystax-ndk-10.3.2-linux-x86_64.tar.xz' -P ~/.buildozer/android/
 - wget -q 'https://dl.google.com/android/android-sdk_r23-linux.tgz' -P ~/.buildozer/android/platform/
 - wget -q 'https://dl.google.com/android/repository/platform-27_r01.zip' -P ~/.buildozer/android/platform/
 - wget -q 'https://dl.google.com/android/repository/build-tools_r26.0.1-linux.zip' -P ~/.buildozer/android/platform/
-- unzip -qq ~/.buildozer/android/platform/android-ndk-r13b-linux-x86_64.zip -d ~/.buildozer/android/platform/
+- tar -xf ~/.buildozer/android/crystax-ndk-10.3.2-linux-x86_64.tar.xz -C ~/.buildozer/android/
+- cp -f $TRAVIS_BUILD_DIR/scripts/build-target-python.sh ~/.buildozer/android/crystax-ndk-10.3.2/build/tools/build-target-python.sh
+- rm -rf ~/.buildozer/android/crystax-ndk-10.3.2/platforms/android-9
+- ln -s ~/.buildozer/android/crystax-ndk-10.3.2/platforms/android-21 ~/.buildozer/android/crystax-ndk-10.3.2/platforms/android-9
 - tar -xf ~/.buildozer/android/platform/android-sdk_r23-linux.tgz -C ~/.buildozer/android/platform/
 - mv ~/.buildozer/android/platform/android-sdk-linux ~/.buildozer/android/platform/android-sdk-23
 - unzip -qq ~/.buildozer/android/platform/platform-27_r01.zip -d ~/.buildozer/android/platform/android-sdk-23/platforms
diff --git a/Vagrantfile b/Vagrantfile
index e3d5fc5..713a2ef 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -43,7 +43,7 @@ Vagrant.configure("2") do |config|
     dpkg --add-architecture i386
 	apt-get update
 	apt-get install -y libssl-dev
-	apt-get install -y autoconf libffi-dev pkg-config libtool build-essential ccache git libncurses5:i386 libstdc++6:i386 libgtk2.0-0:i386 libpangox-1.0-0:i386 libpangoxft-1.0-0:i386 libidn11:i386 python2.7 python2.7-dev openjdk-8-jdk unzip zlib1g-dev zlib1g:i386 m4 libc6-dev-i386 python-pip
+	apt-get install -y python3.6 python3.6-dev python3-pip autoconf libffi-dev pkg-config libtool build-essential ccache git libncurses5:i386 libstdc++6:i386 libgtk2.0-0:i386 libpangox-1.0-0:i386 libpangoxft-1.0-0:i386 libidn11:i386 python2.7 python2.7-dev openjdk-8-jdk unzip zlib1g-dev zlib1g:i386 m4 libc6-dev-i386 python-pip
 	pip install -f --upgrade setuptools pyopenssl
 	git clone https://github.com/lbryio/buildozer.git
     cd buildozer
@@ -63,12 +63,15 @@ Vagrant.configure("2") do |config|
 	cp $HOME/lbry-android/buildozer.spec.vagrant $HOME/lbry-android/buildozer.spec
 
 	mkdir -p cd $HOME/.buildozer/android/platform/
-	wget -q 'https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip' -P $HOME/.buildozer/android/platform/
+	wget -q 'https://us.crystax.net/download/crystax-ndk-10.3.2-linux-x86_64.tar.xz' -P $HOME/.buildozer/android/
 	wget -q 'https://dl.google.com/android/android-sdk_r23-linux.tgz' -P $HOME/.buildozer/android/platform/
 	wget -q 'https://dl.google.com/android/repository/platform-27_r01.zip' -P $HOME/.buildozer/android/platform/
 	wget -q 'https://dl.google.com/android/repository/build-tools_r26.0.1-linux.zip' -P $HOME/.buildozer/android/platform/
-	unzip -qq $HOME/.buildozer/android/platform/android-ndk-r13b-linux-x86_64.zip -d $HOME/.buildozer/android/platform/
-	rm $HOME/.buildozer/android/platform/android-ndk-r13b-linux-x86_64.zip
+	tar -xf ~/.buildozer/android/crystax-ndk-10.3.2-linux-x86_64.tar.xz -C $HOME/.buildozer/android/
+	rm $HOME/.buildozer/android/crystax-ndk-10.3.2-linux-x86_64.tar.xz
+	ln -s $HOME/.buildozer/android/crystax-ndk-10.3.2/platforms/android-21 $HOME/.buildozer/android/crystax-ndk-10.3.2/platforms/android-9
+	cp -f $HOME/lbry-android/scripts/build-target-python.sh $HOME/.buildozer/android/crystax-ndk-10.3.2/build/tools/build-target-python.sh
+	rm -rf $HOME/.buildozer/android/crystax-ndk-10.3.2/platforms/android-9
 	tar -xf $HOME/.buildozer/android/platform/android-sdk_r23-linux.tgz -C $HOME/.buildozer/android/platform/
 	rm $HOME/.buildozer/android/platform/android-sdk_r23-linux.tgz
 	mv $HOME/.buildozer/android/platform/android-sdk-linux $HOME/.buildozer/android/platform/android-sdk-23
diff --git a/buildozer.spec.sample b/buildozer.spec.sample
index 7305b75..fe62613 100644
--- a/buildozer.spec.sample
+++ b/buildozer.spec.sample
@@ -36,7 +36,7 @@ version.filename = %(source.dir)s/main.py
 
 # (list) Application requirements
 # comma seperated e.g. requirements = sqlite3,kivy
-requirements = openssl, sqlite3, hostpython2, android, distro, pyjnius, certifi==2018.4.16, constantly, incremental, functools32, miniupnpc==1.9, gmpy==1.17, twisted==16.6.0, appdirs==1.4.3, argparse==1.2.1, docopt==0.6.2, base58==0.2.2, colorama==0.3.7, dnspython==1.12.0, ecdsa==0.13, envparse==0.2.0, jsonrpc==1.2, jsonrpclib==0.1.7, jsonschema==2.5.1, pbkdf2==1.3, pyyaml==3.12, qrcode==5.2.2, requests==2.9.1, seccure==0.3.1.3, attrs==18.1.0, pyasn1, pyasn1-modules, service_identity==16.0.0, six==1.9.0, slowaes==0.1a1, txJSON-RPC==0.5, wsgiref==0.1.2, zope.interface==4.3.3, protobuf==3.2.0, keyring==10.4.0, netifaces, txupnp==0.0.1a10, git+https://github.com/lbryio/lbryschema.git@v0.0.16#egg=lbryschema, git+https://github.com/lbryio/lbryum.git#egg=lbryum, git+https://github.com/lbryio/lbry.git@v0.21.2#egg=lbrynet, asn1crypto, cryptography==2.2.2, pyopenssl==17.4.0, treq==17.8.0, funcsigs, mock, pbr, unqlite
+requirements = python3crystax, openssl, sqlite3, hostpython3crystax, android, distro, pyjnius, certifi==2018.4.16, constantly, incremental, miniupnpc==1.9, gmpy, appdirs==1.4.3, argparse==1.2.1, docopt, base58==1.0.0, colorama==0.3.7, dnspython==1.12.0, ecdsa==0.13, envparse, jsonrpclib==0.1.7, jsonschema==2.5.1, pbkdf2, pyyaml, qrcode==5.2.2, requests, seccure==0.3.1.3, attrs==18.1.0, pyasn1, pyasn1-modules, service_identity==16.0.0, six==1.9.0, txJSON-RPC, zope.interface==4.3.3, protobuf==3.2.0, keyring==10.4.0, txupnp, git+https://github.com/lbryio/lbryschema.git#egg=lbryschema, git+https://github.com/lbryio/lbryum.git#egg=lbryum, git+https://github.com/lbryio/lbry.git#egg=lbrynet, asn1crypto, treq==17.8.0, funcsigs, mock, pbr, pyopenssl, twisted, idna, Automat, hyperlink, PyHamcrest, netifaces, cryptography, aiohttp, git+https://github.com/lbryio/torba#egg=torba, coincurve
 
 # (str) Custom source folders for requirements
 # Sets custom source for any requirements with recipes
@@ -98,16 +98,16 @@ android.minapi = 21
 android.sdk = 23
 
 # (str) Android NDK version to use
-android.ndk = 13b
+#android.ndk = 13b
 
 # (bool) Use --private data storage (True) or --dir public storage (False)
 #android.private_storage = True
 
 # (str) Android NDK directory (if empty, it will be automatically downloaded.)
-#android.ndk_path = ~/Dev/SDKs/android-ndk-r13b
+android.ndk_path = ~/.buildozer/android/crystax-ndk-10.3.2
 
 # (str) Android SDK directory (if empty, it will be automatically downloaded.)
-#android.sdk_path = ~/Dev/SDKs/android
+#android.sdk_path = ~/.buildozer/android
 
 # (str) ANT directory (if empty, it will be automatically downloaded.)
 #android.ant_path =
diff --git a/buildozer.spec.travis b/buildozer.spec.travis
index 7305b75..fe62613 100644
--- a/buildozer.spec.travis
+++ b/buildozer.spec.travis
@@ -36,7 +36,7 @@ version.filename = %(source.dir)s/main.py
 
 # (list) Application requirements
 # comma seperated e.g. requirements = sqlite3,kivy
-requirements = openssl, sqlite3, hostpython2, android, distro, pyjnius, certifi==2018.4.16, constantly, incremental, functools32, miniupnpc==1.9, gmpy==1.17, twisted==16.6.0, appdirs==1.4.3, argparse==1.2.1, docopt==0.6.2, base58==0.2.2, colorama==0.3.7, dnspython==1.12.0, ecdsa==0.13, envparse==0.2.0, jsonrpc==1.2, jsonrpclib==0.1.7, jsonschema==2.5.1, pbkdf2==1.3, pyyaml==3.12, qrcode==5.2.2, requests==2.9.1, seccure==0.3.1.3, attrs==18.1.0, pyasn1, pyasn1-modules, service_identity==16.0.0, six==1.9.0, slowaes==0.1a1, txJSON-RPC==0.5, wsgiref==0.1.2, zope.interface==4.3.3, protobuf==3.2.0, keyring==10.4.0, netifaces, txupnp==0.0.1a10, git+https://github.com/lbryio/lbryschema.git@v0.0.16#egg=lbryschema, git+https://github.com/lbryio/lbryum.git#egg=lbryum, git+https://github.com/lbryio/lbry.git@v0.21.2#egg=lbrynet, asn1crypto, cryptography==2.2.2, pyopenssl==17.4.0, treq==17.8.0, funcsigs, mock, pbr, unqlite
+requirements = python3crystax, openssl, sqlite3, hostpython3crystax, android, distro, pyjnius, certifi==2018.4.16, constantly, incremental, miniupnpc==1.9, gmpy, appdirs==1.4.3, argparse==1.2.1, docopt, base58==1.0.0, colorama==0.3.7, dnspython==1.12.0, ecdsa==0.13, envparse, jsonrpclib==0.1.7, jsonschema==2.5.1, pbkdf2, pyyaml, qrcode==5.2.2, requests, seccure==0.3.1.3, attrs==18.1.0, pyasn1, pyasn1-modules, service_identity==16.0.0, six==1.9.0, txJSON-RPC, zope.interface==4.3.3, protobuf==3.2.0, keyring==10.4.0, txupnp, git+https://github.com/lbryio/lbryschema.git#egg=lbryschema, git+https://github.com/lbryio/lbryum.git#egg=lbryum, git+https://github.com/lbryio/lbry.git#egg=lbrynet, asn1crypto, treq==17.8.0, funcsigs, mock, pbr, pyopenssl, twisted, idna, Automat, hyperlink, PyHamcrest, netifaces, cryptography, aiohttp, git+https://github.com/lbryio/torba#egg=torba, coincurve
 
 # (str) Custom source folders for requirements
 # Sets custom source for any requirements with recipes
@@ -98,16 +98,16 @@ android.minapi = 21
 android.sdk = 23
 
 # (str) Android NDK version to use
-android.ndk = 13b
+#android.ndk = 13b
 
 # (bool) Use --private data storage (True) or --dir public storage (False)
 #android.private_storage = True
 
 # (str) Android NDK directory (if empty, it will be automatically downloaded.)
-#android.ndk_path = ~/Dev/SDKs/android-ndk-r13b
+android.ndk_path = ~/.buildozer/android/crystax-ndk-10.3.2
 
 # (str) Android SDK directory (if empty, it will be automatically downloaded.)
-#android.sdk_path = ~/Dev/SDKs/android
+#android.sdk_path = ~/.buildozer/android
 
 # (str) ANT directory (if empty, it will be automatically downloaded.)
 #android.ant_path =
diff --git a/buildozer.spec.vagrant b/buildozer.spec.vagrant
index 7305b75..fe62613 100644
--- a/buildozer.spec.vagrant
+++ b/buildozer.spec.vagrant
@@ -36,7 +36,7 @@ version.filename = %(source.dir)s/main.py
 
 # (list) Application requirements
 # comma seperated e.g. requirements = sqlite3,kivy
-requirements = openssl, sqlite3, hostpython2, android, distro, pyjnius, certifi==2018.4.16, constantly, incremental, functools32, miniupnpc==1.9, gmpy==1.17, twisted==16.6.0, appdirs==1.4.3, argparse==1.2.1, docopt==0.6.2, base58==0.2.2, colorama==0.3.7, dnspython==1.12.0, ecdsa==0.13, envparse==0.2.0, jsonrpc==1.2, jsonrpclib==0.1.7, jsonschema==2.5.1, pbkdf2==1.3, pyyaml==3.12, qrcode==5.2.2, requests==2.9.1, seccure==0.3.1.3, attrs==18.1.0, pyasn1, pyasn1-modules, service_identity==16.0.0, six==1.9.0, slowaes==0.1a1, txJSON-RPC==0.5, wsgiref==0.1.2, zope.interface==4.3.3, protobuf==3.2.0, keyring==10.4.0, netifaces, txupnp==0.0.1a10, git+https://github.com/lbryio/lbryschema.git@v0.0.16#egg=lbryschema, git+https://github.com/lbryio/lbryum.git#egg=lbryum, git+https://github.com/lbryio/lbry.git@v0.21.2#egg=lbrynet, asn1crypto, cryptography==2.2.2, pyopenssl==17.4.0, treq==17.8.0, funcsigs, mock, pbr, unqlite
+requirements = python3crystax, openssl, sqlite3, hostpython3crystax, android, distro, pyjnius, certifi==2018.4.16, constantly, incremental, miniupnpc==1.9, gmpy, appdirs==1.4.3, argparse==1.2.1, docopt, base58==1.0.0, colorama==0.3.7, dnspython==1.12.0, ecdsa==0.13, envparse, jsonrpclib==0.1.7, jsonschema==2.5.1, pbkdf2, pyyaml, qrcode==5.2.2, requests, seccure==0.3.1.3, attrs==18.1.0, pyasn1, pyasn1-modules, service_identity==16.0.0, six==1.9.0, txJSON-RPC, zope.interface==4.3.3, protobuf==3.2.0, keyring==10.4.0, txupnp, git+https://github.com/lbryio/lbryschema.git#egg=lbryschema, git+https://github.com/lbryio/lbryum.git#egg=lbryum, git+https://github.com/lbryio/lbry.git#egg=lbrynet, asn1crypto, treq==17.8.0, funcsigs, mock, pbr, pyopenssl, twisted, idna, Automat, hyperlink, PyHamcrest, netifaces, cryptography, aiohttp, git+https://github.com/lbryio/torba#egg=torba, coincurve
 
 # (str) Custom source folders for requirements
 # Sets custom source for any requirements with recipes
@@ -98,16 +98,16 @@ android.minapi = 21
 android.sdk = 23
 
 # (str) Android NDK version to use
-android.ndk = 13b
+#android.ndk = 13b
 
 # (bool) Use --private data storage (True) or --dir public storage (False)
 #android.private_storage = True
 
 # (str) Android NDK directory (if empty, it will be automatically downloaded.)
-#android.ndk_path = ~/Dev/SDKs/android-ndk-r13b
+android.ndk_path = ~/.buildozer/android/crystax-ndk-10.3.2
 
 # (str) Android SDK directory (if empty, it will be automatically downloaded.)
-#android.sdk_path = ~/Dev/SDKs/android
+#android.sdk_path = ~/.buildozer/android
 
 # (str) ANT directory (if empty, it will be automatically downloaded.)
 #android.ant_path =
diff --git a/p4a/pythonforandroid/bootstrap.py b/p4a/pythonforandroid/bootstrap.py
index f7aa6c9..ef89fef 100644
--- a/p4a/pythonforandroid/bootstrap.py
+++ b/p4a/pythonforandroid/bootstrap.py
@@ -1,12 +1,12 @@
-from os.path import (join, dirname, isdir, splitext, basename, realpath)
-from os import listdir, mkdir
+from os.path import (join, dirname, isdir, splitext, basename)
+from os import listdir
 import sh
 import glob
 import json
 import importlib
 
 from pythonforandroid.logger import (warning, shprint, info, logger,
-                                     debug, error)
+                                     debug)
 from pythonforandroid.util import (current_directory, ensure_dir,
                                    temp_directory, which)
 from pythonforandroid.recipe import Recipe
diff --git a/p4a/pythonforandroid/bootstraps/lbry/build/jni/src/start.c b/p4a/pythonforandroid/bootstraps/lbry/build/jni/src/start.c
index e709ca5..80cd5ac 100644
--- a/p4a/pythonforandroid/bootstraps/lbry/build/jni/src/start.c
+++ b/p4a/pythonforandroid/bootstraps/lbry/build/jni/src/start.c
@@ -308,9 +308,9 @@ JNIEXPORT void JNICALL Java_org_kivy_android_PythonService_nativeStart(
   setenv("PYTHONHOME", python_home, 1);
   setenv("PYTHONPATH", python_path, 1);
   setenv("PYTHON_SERVICE_ARGUMENT", arg, 1);
-  
+
   char ca_path[128];
-  snprintf(ca_path, 128, "%s/lib/python2.7/site-packages/certifi/cacert.pem", python_home);
+  snprintf(ca_path, 128, "%s/crystax_python/site-packages/certifi/cacert.pem", python_home);
   setenv("SSL_CERT_FILE", ca_path, 1);
 
   char *argv[] = {"."};
diff --git a/p4a/pythonforandroid/build.py b/p4a/pythonforandroid/build.py
index 461839c..3876688 100644
--- a/p4a/pythonforandroid/build.py
+++ b/p4a/pythonforandroid/build.py
@@ -396,6 +396,7 @@ class Context(object):
             'platforms',
             'android-{}'.format(self.android_min_api),
             platform_dir)
+
         if not exists(self.ndk_platform):
             warning('ndk_platform doesn\'t exist: {}'.format(
                 self.ndk_platform))
@@ -529,7 +530,7 @@ class Context(object):
         if self.python_recipe.from_crystax:
             return self.get_python_install_dir()
         return join(self.get_python_install_dir(),
-                    'lib', 'python2.7', 'site-packages')
+                    'lib', 'python3.6', 'site-packages')
 
     def get_libs_dir(self, arch):
         '''The libs dir for a given arch.'''
@@ -634,7 +635,7 @@ def run_pymodules_install(ctx, modules):
 
     venv = sh.Command(ctx.virtualenv)
     with current_directory(join(ctx.build_dir)):
-        shprint(venv, '--python=python2.7', 'venv')
+        shprint(venv, '--python=python3.6', 'venv')
 
         info('Creating a requirements.txt file for the Python modules')
         with open('requirements.txt', 'w') as fileh:
diff --git a/p4a/pythonforandroid/distribution.py b/p4a/pythonforandroid/distribution.py
index 0db59a2..735b64a 100644
--- a/p4a/pythonforandroid/distribution.py
+++ b/p4a/pythonforandroid/distribution.py
@@ -41,7 +41,7 @@ class Distribution(object):
         return str(self)
 
     @classmethod
-    def get_distribution(cls, ctx, name=None, recipes=[], 
+    def get_distribution(cls, ctx, name=None, recipes=[],
                          force_build=False,
                          extra_dist_dirs=[],
                          require_perfect_match=False):
@@ -70,10 +70,6 @@ class Distribution(object):
             correct set of recipes.
         '''
 
-        # AND: This whole function is a bit hacky, it needs checking
-        # properly to make sure it follows logically correct
-        # possibilities
-
         existing_dists = Distribution.get_distributions(ctx)
 
         needs_build = True  # whether the dist needs building, will be returned
diff --git a/p4a/pythonforandroid/logger.py b/p4a/pythonforandroid/logger.py
index 93c086f..38afba0 100644
--- a/p4a/pythonforandroid/logger.py
+++ b/p4a/pythonforandroid/logger.py
@@ -1,4 +1,3 @@
-
 import logging
 import os
 import re
@@ -16,7 +15,7 @@ if not six.PY3:
     stderr = codecs.getwriter('utf8')(stderr)
 
 if six.PY2:
-    unistr = unicode
+    unistr = unicode  # noqa F821
 else:
     unistr = str
 
@@ -43,6 +42,7 @@ class LevelDifferentiatingFormatter(logging.Formatter):
                 Err_Style.RESET_ALL) + record.msg
         return super(LevelDifferentiatingFormatter, self).format(record)
 
+
 logger = logging.getLogger('p4a')
 if not hasattr(logger, 'touched'):  # Necessary as importlib reloads
                                     # this, which would add a second
@@ -72,6 +72,7 @@ class colorama_shim(object):
     def enable(self, enable):
         self._enabled = enable
 
+
 Out_Style = colorama_shim(Colo_Style)
 Out_Fore = colorama_shim(Colo_Fore)
 Err_Style = colorama_shim(Colo_Style)
@@ -173,6 +174,8 @@ def shprint(command, *args, **kwargs):
         msg_width = columns - len(msg_hdr) - 1
         output = command(*args, **kwargs)
         for line in output:
+            if isinstance(line, bytes):
+                line = line.decode('utf-8', errors='replace')
             if logger.level > logging.DEBUG:
                 msg = line.replace(
                     '\n', ' ').replace(
diff --git a/p4a/pythonforandroid/patching.py b/p4a/pythonforandroid/patching.py
index 541bab8..2a47733 100644
--- a/p4a/pythonforandroid/patching.py
+++ b/p4a/pythonforandroid/patching.py
@@ -18,6 +18,7 @@ def is_platform(platform):
         return uname()[0] == platform
     return is_x
 
+
 is_linux = is_platform('Linux')
 is_darwin = is_platform('Darwin')
 
@@ -30,31 +31,31 @@ def is_arch(xarch):
 
 def is_api_gt(apiver):
     def is_x(recipe, **kwargs):
-        return recipe.ctx.android_min_api > apiver
+        return recipe.ctx.android_api > apiver
     return is_x
 
 
 def is_api_gte(apiver):
     def is_x(recipe, **kwargs):
-        return recipe.ctx.android_min_api >= apiver
+        return recipe.ctx.android_api >= apiver
     return is_x
 
 
 def is_api_lt(apiver):
     def is_x(recipe, **kwargs):
-        return recipe.ctx.android_min_api < apiver
+        return recipe.ctx.android_api < apiver
     return is_x
 
 
 def is_api_lte(apiver):
     def is_x(recipe, **kwargs):
-        return recipe.ctx.android_min_api <= apiver
+        return recipe.ctx.android_api <= apiver
     return is_x
 
 
 def is_api(apiver):
     def is_x(recipe, **kwargs):
-        return recipe.ctx.android_min_api == apiver
+        return recipe.ctx.android_api == apiver
     return is_x
 
 
diff --git a/p4a/pythonforandroid/recipe.py b/p4a/pythonforandroid/recipe.py
index d80d03b..20bab44 100644
--- a/p4a/pythonforandroid/recipe.py
+++ b/p4a/pythonforandroid/recipe.py
@@ -1,11 +1,11 @@
-from os.path import join, dirname, isdir, exists, isfile, split, realpath, basename
+from os.path import basename, dirname, exists, isdir, isfile, join, realpath
 import importlib
-import zipfile
 import glob
 from shutil import rmtree
 from six import PY2, with_metaclass
 
 import hashlib
+from re import match
 
 import sh
 import shutil
@@ -20,7 +20,6 @@ from pythonforandroid.logger import (logger, info, warning, error, debug, shprin
 from pythonforandroid.util import (urlretrieve, current_directory, ensure_dir)
 
 # this import is necessary to keep imp.load_source from complaining :)
-import pythonforandroid.recipes
 
 
 if PY2:
@@ -149,7 +148,7 @@ class Recipe(with_metaclass(RecipeMeta)):
 
             urlretrieve(url, target, report_hook)
             return target
-        elif parsed_url.scheme in ('git', 'git+ssh', 'git+http', 'git+https'):
+        elif parsed_url.scheme in ('git', 'git+file', 'git+ssh', 'git+http', 'git+https'):
             if isdir(target):
                 with current_directory(target):
                     shprint(sh.git, 'fetch', '--tags')
@@ -168,43 +167,6 @@ class Recipe(with_metaclass(RecipeMeta)):
                         shprint(sh.git, 'submodule', 'update', '--recursive')
             return target
 
-    def extract_source(self, source, cwd):
-        """
-        (internal) Extract the `source` into the directory `cwd`.
-        """
-        if not source:
-            return
-        if isfile(source):
-            info("Extract {} into {}".format(source, cwd))
-
-            if source.endswith(".tgz") or source.endswith(".tar.gz"):
-                shprint(sh.tar, "-C", cwd, "-xvzf", source)
-
-            elif source.endswith(".tbz2") or source.endswith(".tar.bz2"):
-                shprint(sh.tar, "-C", cwd, "-xvjf", source)
-
-            elif source.endswith(".zip"):
-                zf = zipfile.ZipFile(source)
-                zf.extractall(path=cwd)
-                zf.close()
-
-            else:
-                warning(
-                    "Error: cannot extract, unrecognized extension for {}"
-                    .format(source))
-                raise Exception()
-
-        elif isdir(source):
-            info("Copying {} into {}".format(source, cwd))
-
-            shprint(sh.cp, '-a', source, cwd)
-
-        else:
-            warning(
-                "Error: cannot extract or copy, unrecognized path {}"
-                .format(source))
-            raise Exception()
-
     # def get_archive_rootdir(self, filename):
     #     if filename.endswith(".tgz") or filename.endswith(".tar.gz") or \
     #         filename.endswith(".tbz2") or filename.endswith(".tar.bz2"):
@@ -225,19 +187,19 @@ class Recipe(with_metaclass(RecipeMeta)):
         build directory.
         """
         info("Applying patch {}".format(filename))
-        filename = join(self.recipe_dir, filename)
+        filename = join(self.get_recipe_dir(), filename)
         shprint(sh.patch, "-t", "-d", self.get_build_dir(arch), "-p1",
                 "-i", filename, _tail=10)
 
     def copy_file(self, filename, dest):
         info("Copy {} to {}".format(filename, dest))
-        filename = join(self.recipe_dir, filename)
+        filename = join(self.get_recipe_dir(), filename)
         dest = join(self.build_dir, dest)
         shutil.copy(filename, dest)
 
     def append_file(self, filename, dest):
         info("Append {} to {}".format(filename, dest))
-        filename = join(self.recipe_dir, filename)
+        filename = join(self.get_recipe_dir(), filename)
         dest = join(self.build_dir, dest)
         with open(filename, "rb") as fd:
             data = fd.read()
@@ -329,7 +291,14 @@ class Recipe(with_metaclass(RecipeMeta)):
         return join(self.get_build_container_dir(arch), self.name)
 
     def get_recipe_dir(self):
-        # AND: Redundant, an equivalent property is already set by get_recipe
+        """
+        Returns the local recipe directory or defaults to the core recipe
+        directory.
+        """
+        if self.ctx.local_recipes is not None:
+            local_recipe_dir = join(self.ctx.local_recipes, self.name)
+            if exists(local_recipe_dir):
+                return local_recipe_dir
         return join(self.ctx.root_dir, 'recipes', self.name)
 
     # Public Recipe API to be subclassed if needed
@@ -349,6 +318,16 @@ class Recipe(with_metaclass(RecipeMeta)):
             return
 
         url = self.versioned_url
+        ma = match(u'^(.+)#md5=([0-9a-f]{32})$', url)
+        if ma:                  # fragmented URL?
+            if self.md5sum:
+                raise ValueError(
+                    ('Received md5sum from both the {} recipe '
+                     'and its url').format(self.name))
+            url = ma.group(1)
+            expected_md5 = ma.group(2)
+        else:
+            expected_md5 = self.md5sum
 
         shprint(sh.mkdir, '-p', join(self.ctx.packages_path, self.name))
 
@@ -356,44 +335,41 @@ class Recipe(with_metaclass(RecipeMeta)):
             filename = shprint(sh.basename, url).stdout[:-1].decode('utf-8')
 
             do_download = True
-
             marker_filename = '.mark-{}'.format(filename)
             if exists(filename) and isfile(filename):
                 if not exists(marker_filename):
                     shprint(sh.rm, filename)
-                elif self.md5sum:
+                elif expected_md5:
                     current_md5 = md5sum(filename)
-                    if current_md5 == self.md5sum:
-                        debug('Checked md5sum: downloaded expected content!')
-                        do_download = False
-                    else:
-                        info('Downloaded unexpected content...')
+                    if current_md5 != expected_md5:
                         debug('* Generated md5sum: {}'.format(current_md5))
-                        debug('* Expected md5sum: {}'.format(self.md5sum))
-
+                        debug('* Expected md5sum: {}'.format(expected_md5))
+                        raise ValueError(
+                            ('Generated md5sum does not match expected md5sum '
+                             'for {} recipe').format(self.name))
+                    do_download = False
                 else:
                     do_download = False
-                    info('{} download already cached, skipping'
-                         .format(self.name))
 
             # If we got this far, we will download
             if do_download:
                 debug('Downloading {} from {}'.format(self.name, url))
 
                 shprint(sh.rm, '-f', marker_filename)
-                self.download_file(url, filename)
+                self.download_file(self.versioned_url, filename)
                 shprint(sh.touch, marker_filename)
 
-                if exists(filename) and isfile(filename) and self.md5sum:
+                if exists(filename) and isfile(filename) and expected_md5:
                     current_md5 = md5sum(filename)
-                    if self.md5sum is not None:
-                        if current_md5 == self.md5sum:
-                            debug('Checked md5sum: downloaded expected content!')
-                        else:
-                            info('Downloaded unexpected content...')
+                    if expected_md5 is not None:
+                        if current_md5 != expected_md5:
                             debug('* Generated md5sum: {}'.format(current_md5))
-                            debug('* Expected md5sum: {}'.format(self.md5sum))
-                            exit(1)
+                            debug('* Expected md5sum: {}'.format(expected_md5))
+                            raise ValueError(
+                                ('Generated md5sum does not match expected md5sum '
+                                'for {} recipe').format(self.name))
+            else:
+                info('{} download already cached, skipping'.format(self.name))
 
     def unpack(self, arch):
         info_main('Unpacking {} for {}'.format(self.name, arch))
@@ -404,8 +380,6 @@ class Recipe(with_metaclass(RecipeMeta)):
         if user_dir is not None:
             info('P4A_{}_DIR exists, symlinking instead'.format(
                 self.name.lower()))
-            # AND: Currently there's something wrong if I use ln, fix this
-            warning('Using cp -a instead of symlink...fix this!')
             if exists(self.get_build_dir(arch)):
                 return
             shprint(sh.rm, '-rf', build_dir)
@@ -421,11 +395,13 @@ class Recipe(with_metaclass(RecipeMeta)):
 
         filename = shprint(
             sh.basename, self.versioned_url).stdout[:-1].decode('utf-8')
+        ma = match(u'^(.+)#md5=([0-9a-f]{32})$', filename)
+        if ma:                  # fragmented URL?
+            filename = ma.group(1)
 
         with current_directory(build_dir):
             directory_name = self.get_build_dir(arch)
 
-            # AND: Could use tito's get_archive_rootdir here
             if not exists(directory_name) or not isdir(directory_name):
                 extraction_filename = join(
                     self.ctx.packages_path, self.name, filename)
@@ -638,7 +614,6 @@ class Recipe(with_metaclass(RecipeMeta)):
         if len(logger.handlers) > 1:
             logger.removeHandler(logger.handlers[1])
         recipe = mod.recipe
-        recipe.recipe_dir = dirname(recipe_file)
         recipe.ctx = ctx
         cls.recipes[name] = recipe
         return recipe
@@ -755,6 +730,10 @@ class PythonRecipe(Recipe):
             return join(
                 Recipe.get_recipe('hostpython2', self.ctx).get_build_dir(),
                 'hostpython')
+        elif 'hostpython3crystax' in self.ctx.recipe_build_order:
+            return join(
+                Recipe.get_recipe('hostpython3crystax', self.ctx).get_build_dir(),
+                'hostpython')
         else:
             python_recipe = self.ctx.python_recipe
             return 'python{}'.format(python_recipe.version)
@@ -779,6 +758,34 @@ class PythonRecipe(Recipe):
         env['PYTHONNOUSERSITE'] = '1'
 
         if not self.call_hostpython_via_targetpython:
+            # sets python headers/linkages...depending on python's recipe
+            python_version = self.ctx.python_recipe.version
+            python_short_version = '.'.join(python_version.split('.')[:2])
+            if 'python2' in self.ctx.recipe_build_order:
+                env['PYTHON_ROOT'] = self.ctx.get_python_install_dir()
+                env['CFLAGS'] += ' -I' + env[
+                    'PYTHON_ROOT'] + '/include/python2.7'
+                env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + \
+                                  ' -lpython2.7'
+            elif self.ctx.python_recipe.from_crystax:
+                ndk_dir_python = join(self.ctx.ndk_dir, 'sources',
+                                      'python', python_version)
+                env['CFLAGS'] += ' -I{} '.format(
+                    join(ndk_dir_python, 'include',
+                         'python'))
+                env['LDFLAGS'] += ' -L{}'.format(
+                    join(ndk_dir_python, 'libs', arch.arch))
+                env['LDFLAGS'] += ' -lpython{}m'.format(python_short_version)
+            elif 'python3' in self.ctx.recipe_build_order:
+                # This headers are unused cause python3 recipe was removed
+                # TODO: should be reviewed when python3 recipe added
+                env['PYTHON_ROOT'] = self.ctx.get_python_install_dir()
+                env['CFLAGS'] += ' -I' + env[
+                    'PYTHON_ROOT'] + '/include/python{}m'.format(
+                    python_short_version)
+                env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + \
+                                  ' -lpython{}m'.format(
+                                      python_short_version)
             hppath = []
             hppath.append(join(dirname(self.hostpython_location), 'Lib'))
             hppath.append(join(hppath[0], 'site-packages'))
@@ -819,28 +826,12 @@ class PythonRecipe(Recipe):
         with current_directory(self.get_build_dir(arch.arch)):
             hostpython = sh.Command(self.hostpython_location)
 
-
             if self.ctx.python_recipe.from_crystax:
-                # hppath = join(dirname(self.hostpython_location), 'Lib',
-                #               'site-packages')
                 hpenv = env.copy()
-                # if 'PYTHONPATH' in hpenv:
-                #     hpenv['PYTHONPATH'] = ':'.join([hppath] +
-                #                                    hpenv['PYTHONPATH'].split(':'))
-                # else:
-                #     hpenv['PYTHONPATH'] = hppath
-                # hpenv['PYTHONHOME'] = self.ctx.get_python_install_dir()
-                # shprint(hostpython, 'setup.py', 'build',
-                #         _env=hpenv, *self.setup_extra_args)
                 shprint(hostpython, 'setup.py', 'install', '-O2',
                         '--root={}'.format(self.ctx.get_python_install_dir()),
                         '--install-lib=.',
-                        # AND: will need to unhardcode the 3.5 when adding 2.7 (and other crystax supported versions)
                         _env=hpenv, *self.setup_extra_args)
-                # site_packages_dir = self.ctx.get_site_packages_dir()
-                # built_files = glob.glob(join('build', 'lib*', '*'))
-                # for filen in built_files:
-                #     shprint(sh.cp, '-r', filen, join(site_packages_dir, split(filen)[-1]))
             elif self.call_hostpython_via_targetpython:
                 shprint(hostpython, 'setup.py', 'install', '-O2', _env=env,
                         *self.setup_extra_args)
@@ -857,7 +848,6 @@ class PythonRecipe(Recipe):
                         '--root={}'.format(self.ctx.get_python_install_dir()),
                         '--install-lib=lib/python2.7/site-packages',
                         _env=hpenv, *self.setup_extra_args)
-                # AND: Hardcoded python2.7 needs fixing
 
             # If asked, also install in the hostpython build dir
             if self.install_in_hostpython:
@@ -917,6 +907,7 @@ class CompiledComponentsPythonRecipe(PythonRecipe):
         shprint(hostpython, 'setup.py', self.build_cmd, '-v', _env=env,
                 *self.setup_extra_args)
 
+
 class CppCompiledComponentsPythonRecipe(CompiledComponentsPythonRecipe):
     """ Extensions that require the cxx-stl """
     call_hostpython_via_targetpython = False
@@ -926,39 +917,34 @@ class CppCompiledComponentsPythonRecipe(CompiledComponentsPythonRecipe):
         keys = dict(
             ctx=self.ctx,
             arch=arch,
-            arch_noeabi=arch.arch.replace('eabi', ''),
-            pyroot=self.ctx.get_python_install_dir()
+            arch_noeabi=arch.arch.replace('eabi', '')
         )
         env['LDSHARED'] = env['CC'] + ' -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions'
-        env['CFLAGS'] += " -I{pyroot}/include/python2.7 " \
-                        " -I{ctx.ndk_dir}/platforms/android-{ctx.android_min_api}/arch-{arch_noeabi}/usr/include" \
+        env['CFLAGS'] += " -I{ctx.ndk_dir}/platforms/android-{ctx.android_api}/arch-{arch_noeabi}/usr/include" \
                         " -I{ctx.ndk_dir}/sources/cxx-stl/gnu-libstdc++/{ctx.toolchain_version}/include" \
                         " -I{ctx.ndk_dir}/sources/cxx-stl/gnu-libstdc++/{ctx.toolchain_version}/libs/{arch.arch}/include".format(**keys)
         env['CXXFLAGS'] = env['CFLAGS'] + ' -frtti -fexceptions'
         env['LDFLAGS'] += " -L{ctx.ndk_dir}/sources/cxx-stl/gnu-libstdc++/{ctx.toolchain_version}/libs/{arch.arch}" \
-                " -lpython2.7" \
                 " -lgnustl_shared".format(**keys)
 
-
         return env
 
-    def build_compiled_components(self,arch):
+    def build_compiled_components(self, arch):
         super(CppCompiledComponentsPythonRecipe, self).build_compiled_components(arch)
 
         # Copy libgnustl_shared.so
         with current_directory(self.get_build_dir(arch.arch)):
             sh.cp(
-                "{ctx.ndk_dir}/sources/cxx-stl/gnu-libstdc++/{ctx.toolchain_version}/libs/{arch.arch}/libgnustl_shared.so".format(ctx=self.ctx,arch=arch),
+                "{ctx.ndk_dir}/sources/cxx-stl/gnu-libstdc++/{ctx.toolchain_version}/libs/{arch.arch}/libgnustl_shared.so".format(ctx=self.ctx, arch=arch),
                 self.ctx.get_libs_dir(arch.arch)
             )
 
 
-
-
 class CythonRecipe(PythonRecipe):
     pre_build_ext = False
     cythonize = True
     cython_args = []
+    call_hostpython_via_targetpython = False
 
     def __init__(self, *args, **kwargs):
         super(CythonRecipe, self).__init__(*args, **kwargs)
@@ -1082,21 +1068,6 @@ class CythonRecipe(PythonRecipe):
         env['LIBLINK_PATH'] = liblink_path
         ensure_dir(liblink_path)
 
-        if self.ctx.python_recipe.from_crystax:
-            env['CFLAGS'] = '-I{} '.format(
-                join(self.ctx.ndk_dir, 'sources', 'python',
-                     self.ctx.python_recipe.version, 'include',
-                     'python')) + env['CFLAGS']
-
-            # Temporarily hardcode the -lpython3.x as this does not
-            # get applied automatically in some environments.  This
-            # will need generalising, along with the other hardcoded
-            # py3.5 references, to support other python3 or crystax
-            # python versions.
-            python3_version = self.ctx.python_recipe.version
-            python3_version = '.'.join(python3_version.split('.')[:2])
-            env['LDFLAGS'] = env['LDFLAGS'] + ' -lpython{}m'.format(python3_version)
-
         return env
 
 
diff --git a/p4a/pythonforandroid/recipes/cryptography/__init__.py b/p4a/pythonforandroid/recipes/cryptography/__init__.py
index 91fae24..64f79df 100644
--- a/p4a/pythonforandroid/recipes/cryptography/__init__.py
+++ b/p4a/pythonforandroid/recipes/cryptography/__init__.py
@@ -5,7 +5,7 @@ class CryptographyRecipe(CompiledComponentsPythonRecipe):
     name = 'cryptography'
     version = '1.4'
     url = 'https://github.com/pyca/cryptography/archive/{version}.tar.gz'
-    depends = [('python2', 'python3crystax'), 'openssl', 'idna', 'pyasn1', 'six', 'setuptools', 'enum34', 'ipaddress', 'cffi']
+    depends = [('python2', 'python3crystax'), 'openssl', 'idna', 'pyasn1', 'six', 'setuptools', 'ipaddress', 'cffi']
     call_hostpython_via_targetpython = False
 
     def get_recipe_env(self, arch):
diff --git a/recipes/android/__init__.py b/recipes/android/__init__.py
index 87fdff0..1611095 100644
--- a/recipes/android/__init__.py
+++ b/recipes/android/__init__.py
@@ -1,3 +1,83 @@
+from pythonforandroid.recipe import CythonRecipe, IncludedFilesBehaviour
+from pythonforandroid.util import current_directory
+from pythonforandroid.patching import will_build
+from pythonforandroid import logger
+
+from os.path import join
+
+
+class AndroidRecipe(IncludedFilesBehaviour, CythonRecipe):
+    # name = 'android'
+    version = None
+    url = None
+
+    src_filename = 'src'
+
+    depends = [('pygame', 'sdl2', 'genericndkbuild'), ('python2', 'python3crystax')]
+
+    config_env = {}
+
+    def get_recipe_env(self, arch):
+        env = super(AndroidRecipe, self).get_recipe_env(arch)
+        env.update(self.config_env)
+        return env
+
+    def prebuild_arch(self, arch):
+        super(AndroidRecipe, self).prebuild_arch(arch)
+
+        tpxi = 'DEF {} = {}\n'
+        th = '#define {} {}\n'
+        tpy = '{} = {}\n'
+
+        bootstrap = bootstrap_name = self.ctx.bootstrap.name
+        is_sdl2 = bootstrap_name in ('sdl2', 'sdl2python3', 'sdl2_gradle')
+        is_pygame = bootstrap_name in ('pygame',)
+        is_webview = bootstrap_name in ('webview',)
+        is_lbry = bootstrap_name in ('lbry',)
+
+        if is_sdl2 or is_webview or is_lbry:
+            if is_sdl2:
+                bootstrap = 'sdl2'
+            java_ns = 'org.kivy.android'
+            jni_ns = 'org/kivy/android'
+        elif is_pygame:
+            java_ns = 'org.renpy.android'
+            jni_ns = 'org/renpy/android'
+        else:
+            logger.error('unsupported bootstrap for android recipe: {}'.format(bootstrap_name))
+            exit(1)
+
+        config = {
+            'BOOTSTRAP': bootstrap,
+            'IS_SDL2': int(is_sdl2),
+            'IS_PYGAME': int(is_pygame),
+            'PY2': int(will_build('python2')(self)),
+            'JAVA_NAMESPACE': java_ns,
+            'JNI_NAMESPACE': jni_ns,
+        }
+
+        with current_directory(self.get_build_dir(arch.arch)):
+            with open(join('android', 'config.pxi'), 'w') as fpxi:
+                with open(join('android', 'config.h'), 'w') as fh:
+                    with open(join('android', 'config.py'), 'w') as fpy:
+                        for key, value in config.items():
+                            fpxi.write(tpxi.format(key, repr(value)))
+                            fpy.write(tpy.format(key, repr(value)))
+                            fh.write(th.format(key, value if isinstance(value, int)
+                                                    else '"{}"'.format(value)))
+                            self.config_env[key] = str(value)
+
+                        if is_sdl2:
+                            fh.write('JNIEnv *SDL_AndroidGetJNIEnv(void);\n')
+                            fh.write('#define SDL_ANDROID_GetJNIEnv SDL_AndroidGetJNIEnv\n')
+                        elif is_pygame:
+                            fh.write('JNIEnv *SDL_ANDROID_GetJNIEnv(void);\n')
+
+
+recipe = AndroidRecipe()
+
+
+'''
 from pythonforandroid.recipe import CythonRecipe, Recipe, IncludedFilesBehaviour
 from pythonforandroid.util import current_directory
 from pythonforandroid.patching import will_build
@@ -83,3 +163,4 @@ class AndroidRecipe(IncludedFilesBehaviour, CythonRecipe):
 
 
 recipe = AndroidRecipe()
+'''
\ No newline at end of file
diff --git a/recipes/android/src/setup.py b/recipes/android/src/setup.py
index 8a276fe..47ef6a9 100755
--- a/recipes/android/src/setup.py
+++ b/recipes/android/src/setup.py
@@ -6,7 +6,7 @@ lib_dict = {
     'pygame': ['sdl'],
     'sdl2': ['SDL2', 'SDL2_image', 'SDL2_mixer', 'SDL2_ttf']
 }
-sdl_libs = lib_dict[os.environ['BOOTSTRAP']]
+sdl_libs = lib_dict[os.environ['BOOTSTRAP']] if os.environ['BOOTSTRAP'] == 'sdl2' else []
 
 renpy_sound = Extension('android._android_sound',
                         ['android/_android_sound.c', 'android/_android_sound_jni.c', ],
diff --git a/recipes/cffi/__init__.py b/recipes/cffi/__init__.py
index 0fc6018..b4aa5ed 100644
--- a/recipes/cffi/__init__.py
+++ b/recipes/cffi/__init__.py
@@ -1,36 +1,58 @@
-from pythonforandroid.recipe import CompiledComponentsPythonRecipe, Recipe
-from os.path import join
+
+import os
+from pythonforandroid.recipe import CompiledComponentsPythonRecipe
 
 
 class CffiRecipe(CompiledComponentsPythonRecipe):
-	name = 'cffi'
-	version = '1.11.0'
-	#url = 'https://pypi.python.org/packages/source/c/cffi/cffi-{version}.tar.gz'
-	url = 'https://pypi.python.org/packages/4e/32/4070bdf32812c89eb635c80880a5caa2e0189aa7999994c265577e5154f3/cffi-{version}.tar.gz'
+    name = 'cffi'
+    version = '1.11.5'
+    url = 'https://pypi.python.org/packages/source/c/cffi/cffi-{version}.tar.gz'
 
-	depends = [('python2', 'python3crystax'), 'setuptools', 'pycparser', 'libffi']
+    depends = [('python2', 'python3crystax'), 'setuptools', 'pycparser', 'libffi']
 
-	patches = ['disable-pkg-config.patch']
+    patches = ['disable-pkg-config.patch']
 
-	# call_hostpython_via_targetpython = False
-	install_in_hostpython = True
+    # call_hostpython_via_targetpython = False
+    install_in_hostpython = True
 
-	def get_recipe_env(self, arch=None):
-		env = super(CffiRecipe, self).get_recipe_env(arch)
-		libffi = self.get_recipe('libffi', self.ctx)
-		includes = libffi.get_include_dirs(arch)
-		env['CFLAGS'] = ' -I'.join([env.get('CFLAGS', '')] + includes)
-		env['LDFLAGS'] = (env.get('CFLAGS', '') + ' -L' +
-		                  self.ctx.get_libs_dir(arch.arch))
-		env['LDSHARED'] = env['CC'] + ' -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions'
-		env['PYTHONPATH'] = ':'.join([self.ctx.get_site_packages_dir(), env['BUILDLIB_PATH']])
-		
-		target_python = Recipe.get_recipe('python2', self.ctx).get_build_dir(arch.arch)
-		env['PYTHON_ROOT'] = join(target_python, 'python-install')
-		env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python2.7'
-		env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + ' -lpython2.7'
-		
-		return env
+    def get_hostrecipe_env(self, arch=None):
+        # fixes missing ffi.h on some host systems (e.g. gentoo)
+        env = super(CffiRecipe, self).get_hostrecipe_env(arch)
+        libffi = self.get_recipe('libffi', self.ctx)
+        includes = libffi.get_include_dirs(arch)
+        env['FFI_INC'] = ",".join(includes)
+        return env
+
+    def get_recipe_env(self, arch=None):
+        env = super(CffiRecipe, self).get_recipe_env(arch)
+        # sets linker to use the correct gcc (cross compiler)
+        env['LDSHARED'] = env['CC'] + ' -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions'
+        libffi = self.get_recipe('libffi', self.ctx)
+        includes = libffi.get_include_dirs(arch)
+        env['CFLAGS'] = ' -I'.join([env.get('CFLAGS', '')] + includes)
+        env['LDFLAGS'] = (env.get('CFLAGS', '') + ' -L' +
+                          self.ctx.get_libs_dir(arch.arch))
+        env['LDFLAGS'] += ' -L{}'.format(os.path.join(self.ctx.bootstrap.build_dir, 'libs', arch.arch))
+
+        # required for libc and libdl
+        ndk_dir = self.ctx.ndk_platform
+        ndk_lib_dir = os.path.join(ndk_dir, 'usr', 'lib')
+        env['LDFLAGS'] += ' -L{}'.format(ndk_lib_dir)
+        env['LDFLAGS'] += " --sysroot={}".format(self.ctx.ndk_platform)
+        env['PYTHONPATH'] = ':'.join([
+            self.ctx.get_site_packages_dir(),
+            env['BUILDLIB_PATH'],
+        ])
+        if self.ctx.ndk == 'crystax':
+            # only keeps major.minor (discards patch)
+            python_version = self.ctx.python_recipe.version[0:3]
+            ndk_dir_python = os.path.join(self.ctx.ndk_dir, 'sources/python/', python_version)
+            env['LDFLAGS'] += ' -L{}'.format(os.path.join(ndk_dir_python, 'libs', arch.arch))
+            env['LDFLAGS'] += ' -lpython{}m'.format(python_version)
+            # until `pythonforandroid/archs.py` gets merged upstream:
+            # https://github.com/kivy/python-for-android/pull/1250/files#diff-569e13021e33ced8b54385f55b49cbe6
+            env['CFLAGS'] += ' -I{}/include/python/'.format(ndk_dir_python)
+        return env
 
 
-recipe = CffiRecipe()
+recipe = CffiRecipe()
\ No newline at end of file
diff --git a/recipes/cffi/disable-pkg-config.patch b/recipes/cffi/disable-pkg-config.patch
index 56346bb..cf2abd5 100644
--- a/recipes/cffi/disable-pkg-config.patch
+++ b/recipes/cffi/disable-pkg-config.patch
@@ -1,17 +1,18 @@
-diff -Naur cffi-1.4.2/setup.py b/setup.py
---- cffi-1.4.2/setup.py	2015-12-21 12:09:47.000000000 -0600
-+++ b/setup.py	2015-12-23 10:20:40.590622524 -0600
-@@ -5,8 +5,7 @@
+diff --git a/setup.py b/setup.py
+index c1db368..57311c3 100644
+--- a/setup.py
++++ b/setup.py
+@@ -5,8 +5,7 @@ import errno
  
  sources = ['c/_cffi_backend.c']
  libraries = ['ffi']
 -include_dirs = ['/usr/include/ffi',
 -                '/usr/include/libffi']    # may be changed by pkg-config
-+include_dirs = []
++include_dirs = os.environ['FFI_INC'].split(",") if 'FFI_INC' in os.environ else []
  define_macros = []
  library_dirs = []
  extra_compile_args = []
-@@ -67,14 +66,7 @@
+@@ -67,14 +66,7 @@ def ask_supports_thread():
          sys.stderr.write("The above error message can be safely ignored\n")
  
  def use_pkg_config():
diff --git a/recipes/coincurve/__init__.py b/recipes/coincurve/__init__.py
new file mode 100644
index 0000000..921655e
--- /dev/null
+++ b/recipes/coincurve/__init__.py
@@ -0,0 +1,42 @@
+import os
+from pythonforandroid.recipe import PythonRecipe, CompiledComponentsPythonRecipe
+
+
+class CoincurveRecipe(CompiledComponentsPythonRecipe):
+    version = '7.1.0'
+    url = 'https://github.com/ofek/coincurve/archive/{version}.tar.gz'
+    call_hostpython_via_targetpython = False
+    depends = [('python2', 'python3crystax'), 'setuptools',
+        'libffi', 'cffi', 'libsecp256k1']
+    patches = [
+        "cross_compile.patch", "drop_setup_requires.patch",
+        "find_lib.patch", "no-download.patch", "setup.py.patch"]
+
+    def get_recipe_env(self, arch=None, with_flags_in_cc=True):
+        env = super(CoincurveRecipe, self).get_recipe_env(arch, with_flags_in_cc)
+        # sets linker to use the correct gcc (cross compiler)
+        env['LDSHARED'] = env['CC'] + ' -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions'
+        libsecp256k1 = self.get_recipe('libsecp256k1', self.ctx)
+        libsecp256k1_dir = libsecp256k1.get_build_dir(arch.arch)
+        env['LDFLAGS'] += ' -L{}'.format(os.path.join(libsecp256k1_dir, '.libs'))
+        env['CFLAGS'] += ' -I' + os.path.join(libsecp256k1_dir, 'include')
+        # only keeps major.minor (discards patch)
+        python_version = self.ctx.python_recipe.version[0:3]
+        # required additional library and path for Crystax
+        if self.ctx.ndk == 'crystax':
+            ndk_dir_python = os.path.join(self.ctx.ndk_dir, 'sources/python/', python_version)
+            env['LDFLAGS'] += ' -L{}'.format(os.path.join(ndk_dir_python, 'libs', arch.arch))
+            env['LDFLAGS'] += ' -lpython{}m'.format(python_version)
+            # until `pythonforandroid/archs.py` gets merged upstream:
+            # https://github.com/kivy/python-for-android/pull/1250/files#diff-569e13021e33ced8b54385f55b49cbe6
+            env['CFLAGS'] += ' -I{}/include/python/'.format(ndk_dir_python)
+        else:
+            env['PYTHON_ROOT'] = self.ctx.get_python_install_dir()
+            env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python{}'.format(python_version)
+            env['LDFLAGS'] += " -lpython{}".format(python_version)
+        env['LDFLAGS'] += " -lsecp256k1"
+        return env
+
+
+recipe = CoincurveRecipe()
+
diff --git a/recipes/coincurve/cross_compile.patch b/recipes/coincurve/cross_compile.patch
new file mode 100644
index 0000000..fbbdd49
--- /dev/null
+++ b/recipes/coincurve/cross_compile.patch
@@ -0,0 +1,12 @@
+diff --git a/setup.py b/setup.py
+index c224fb2..bf925bd 100644
+--- a/setup.py
++++ b/setup.py
+@@ -182,6 +182,7 @@ class build_clib(_build_clib):
+             '--disable-dependency-tracking',
+             '--with-pic',
+             '--enable-module-recovery',
++            "--host=%s" % os.environ['TOOLCHAIN_PREFIX'],
+             '--disable-jni',
+             '--prefix',
+             os.path.abspath(self.build_clib),
diff --git a/recipes/coincurve/drop_setup_requires.patch b/recipes/coincurve/drop_setup_requires.patch
new file mode 100644
index 0000000..9994b3f
--- /dev/null
+++ b/recipes/coincurve/drop_setup_requires.patch
@@ -0,0 +1,12 @@
+diff --git a/setup.py b/setup.py
+index c224fb2..466e789 100644
+--- a/setup.py
++++ b/setup.py
+@@ -250,7 +250,6 @@ else:
+         def has_c_libraries(self):
+             return not has_system_lib()
+     setup_kwargs = dict(
+-        setup_requires=['cffi>=1.3.0', 'pytest-runner>=2.6.2'],
+         ext_package='coincurve',
+         cffi_modules=['_cffi_build/build.py:ffi'],
+         cmdclass={
diff --git a/recipes/coincurve/find_lib.patch b/recipes/coincurve/find_lib.patch
new file mode 100644
index 0000000..3d3c41d
--- /dev/null
+++ b/recipes/coincurve/find_lib.patch
@@ -0,0 +1,13 @@
+diff --git a/setup_support.py b/setup_support.py
+index e7a4f2e..72f0c4d 100644
+--- a/setup_support.py
++++ b/setup_support.py
+@@ -68,6 +69,8 @@ def build_flags(library, type_, path):
+ 
+ 
+ def _find_lib():
++    # we're picking up the recipe one
++    return True
+     from cffi import FFI
+     ffi = FFI()
+     try:
diff --git a/recipes/coincurve/no-download.patch b/recipes/coincurve/no-download.patch
new file mode 100644
index 0000000..fcf4d20
--- /dev/null
+++ b/recipes/coincurve/no-download.patch
@@ -0,0 +1,13 @@
+diff --git a/setup.py b/setup.py
+index c224fb2..d5f6d1a 100644
+--- a/setup.py
++++ b/setup.py
+@@ -51,6 +51,8 @@ if [int(i) for i in setuptools_version.split('.', 2)[:2]] < [3, 3]:
+ 
+ 
+ def download_library(command):
++    # we will use the custom libsecp256k1 recipe
++    return
+     if command.dry_run:
+         return
+     libdir = absolute('libsecp256k1')
diff --git a/recipes/coincurve/setup.py.patch b/recipes/coincurve/setup.py.patch
new file mode 100644
index 0000000..bdc7ab4
--- /dev/null
+++ b/recipes/coincurve/setup.py.patch
@@ -0,0 +1,22 @@
+From bf3a0684e9b0af29d9777f61d6e7e1d3cc0f2803 Mon Sep 17 00:00:00 2001
+From: Kieran Prasch <kieranprasch@gmail.com>
+Date: Thu, 19 Jul 2018 14:11:48 -0700
+Subject: [PATCH] Exclude tests in setup.py
+
+---
+ setup.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index 0b579f1..0a793ed 100644
+--- a/setup.py
++++ b/setup.py
+@@ -277,7 +277,7 @@ def has_c_libraries(self):
+     install_requires=['asn1crypto', 'cffi>=1.3.0'],
+     tests_require=['pytest>=2.8.7'],
+ 
+-    packages=find_packages(exclude=('_cffi_build', '_cffi_build.*', 'libsecp256k1')),
++    packages=find_packages(exclude=('_cffi_build', '_cffi_build.*', 'libsecp256k1', 'tests')),
+ 
+     distclass=Distribution,
+     zip_safe=False,
diff --git a/recipes/cryptography/__init__.py b/recipes/cryptography/__init__.py
index d286924..c69ad61 100644
--- a/recipes/cryptography/__init__.py
+++ b/recipes/cryptography/__init__.py
@@ -1,30 +1,37 @@
 from pythonforandroid.recipe import CompiledComponentsPythonRecipe, Recipe
 from os.path import dirname, join
+import os
 
 class CryptographyRecipe(CompiledComponentsPythonRecipe):
     name = 'cryptography'
-    version = '2.2.2'
+    version = '2.3.1'
     url = 'https://github.com/pyca/cryptography/archive/{version}.tar.gz'
-    depends = [('python2', 'python3crystax'), 'openssl', 'idna', 'pyasn1', 'six', 'setuptools', 'enum34', 'ipaddress', 'cffi']
+    depends = [('python2', 'python3crystax'), 'openssl', 'idna', 'pyasn1', 'six', 'setuptools', 'ipaddress', 'cffi']
     call_hostpython_via_targetpython = False
+    patches = ['force-urandom.patch']
 
     def get_recipe_env(self, arch):
         env = super(CryptographyRecipe, self).get_recipe_env(arch)
         r = self.get_recipe('openssl', self.ctx)
         openssl_dir = r.get_build_dir(arch.arch)
-        target_python = Recipe.get_recipe('python2', self.ctx).get_build_dir(arch.arch)
-        env['PYTHON_ROOT'] = self.ctx.get_python_install_dir()
-        env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python2.7' + \
-                         ' -I' + join(openssl_dir, 'include') + \
-                         ' -I' + join(target_python, 'Modules/_ctypes/libffi_arm_wince')
+        env['CFLAGS'] += ' -I' + join(openssl_dir, 'include') + ' -w'
         # Set linker to use the correct gcc
         env['LDSHARED'] = env['CC'] + ' -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions'
-        env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + \
-                          ' -L' + openssl_dir + \
-                          ' -lpython2.7' + \
+        env['LDFLAGS'] += ' -L' + openssl_dir + \
                           ' -lssl' + r.version + \
                           ' -lcrypto' + r.version
-        
+
+        if self.ctx.ndk == 'crystax':
+            # only keeps major.minor (discards patch)
+            python_version = self.ctx.python_recipe.version[0:3]
+            ndk_dir_python = os.path.join(self.ctx.ndk_dir, 'sources/python/', python_version)
+            env['LDFLAGS'] += ' -L{}'.format(os.path.join(ndk_dir_python, 'libs', arch.arch))
+            env['LDFLAGS'] += ' -lpython{}m'.format(python_version)
+            # until `pythonforandroid/archs.py` gets merged upstream:
+            # https://github.com/kivy/python-for-android/pull/1250/files#diff-569e13021e33ced8b54385f55b49cbe6
+            env['CFLAGS'] += ' -I{}/include/python/'.format(ndk_dir_python) + ' -L{}'.format(os.path.join(ndk_dir_python, 'libs', arch.arch))
+
+
         return env
 
 recipe = CryptographyRecipe()
diff --git a/recipes/cryptography/force-urandom.patch b/recipes/cryptography/force-urandom.patch
new file mode 100644
index 0000000..dceeab3
--- /dev/null
+++ b/recipes/cryptography/force-urandom.patch
@@ -0,0 +1,11 @@
+--- x/src/_cffi_src/openssl/src/osrandom_engine.h	2018-09-25 23:19:08.303397032 +0100
++++ y/src/_cffi_src/openssl/src/osrandom_engine.h	2018-09-25 23:21:45.945980819 +0100
+@@ -42,7 +42,7 @@
+     #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_GETENTROPY
+   #elif defined(__linux__) && defined(SYS_getrandom)
+     /* Linux 3.4.17+ */
+-    #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_GETRANDOM
++    #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM // force /dev/urandom
+   #else
+     /* Keep this as last entry, fall back to /dev/urandom */
+     #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM
diff --git a/recipes/gmpy/__init__.py b/recipes/gmpy/__init__.py
index 23c6053..d96bdd0 100644
--- a/recipes/gmpy/__init__.py
+++ b/recipes/gmpy/__init__.py
@@ -27,10 +27,10 @@ class GmpyRecipe(CythonRecipe):
         libgmp_build_dir = Recipe.get_recipe('libgmp', self.ctx).get_build_dir(arch.arch)
         env['CFLAGS'] += ' -I%s' % (join(libgmp_build_dir, 'include'))
 
-        target_python = Recipe.get_recipe('python2', self.ctx).get_build_dir(arch.arch)
+        target_python = Recipe.get_recipe('python3crystax', self.ctx).get_build_dir(arch.arch)
         env['PYTHON_ROOT'] = join(target_python, 'python-install')
-        env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python2.7'
-        env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + ' -lpython2.7'
+        env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python3.6'
+        env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + ' -lpython3.6m'
 
         return env
 
diff --git a/recipes/hostpython2/Setup b/recipes/hostpython2/Setup
deleted file mode 100644
index 5820771..0000000
--- a/recipes/hostpython2/Setup
+++ /dev/null
@@ -1,495 +0,0 @@
-# -*- makefile -*-
-# The file Setup is used by the makesetup script to construct the files
-# Makefile and config.c, from Makefile.pre and config.c.in,
-# respectively.  The file Setup itself is initially copied from
-# Setup.dist; once it exists it will not be overwritten, so you can edit
-# Setup to your heart's content.  Note that Makefile.pre is created
-# from Makefile.pre.in by the toplevel configure script.
-
-# (VPATH notes: Setup and Makefile.pre are in the build directory, as
-# are Makefile and config.c; the *.in and *.dist files are in the source
-# directory.)
-
-# Each line in this file describes one or more optional modules.
-# Modules enabled here will not be compiled by the setup.py script,
-# so the file can be used to override setup.py's behavior.
-
-# Lines have the following structure:
-#
-# <module> ... [<sourcefile> ...] [<cpparg> ...] [<library> ...]
-#
-# <sourcefile> is anything ending in .c (.C, .cc, .c++ are C++ files)
-# <cpparg> is anything starting with -I, -D, -U or -C
-# <library> is anything ending in .a or beginning with -l or -L
-# <module> is anything else but should be a valid Python
-# identifier (letters, digits, underscores, beginning with non-digit)
-#
-# (As the makesetup script changes, it may recognize some other
-# arguments as well, e.g. *.so and *.sl as libraries.  See the big
-# case statement in the makesetup script.)
-#
-# Lines can also have the form
-#
-# <name> = <value>
-#
-# which defines a Make variable definition inserted into Makefile.in
-#
-# Finally, if a line contains just the word "*shared*" (without the
-# quotes but with the stars), then the following modules will not be
-# built statically.  The build process works like this:
-#
-# 1. Build all modules that are declared as static in Modules/Setup,
-#    combine them into libpythonxy.a, combine that into python.
-# 2. Build all modules that are listed as shared in Modules/Setup.
-# 3. Invoke setup.py. That builds all modules that
-#    a) are not builtin, and
-#    b) are not listed in Modules/Setup, and
-#    c) can be build on the target
-#
-# Therefore, modules declared to be shared will not be
-# included in the config.c file, nor in the list of objects to be
-# added to the library archive, and their linker options won't be
-# added to the linker options. Rules to create their .o files and
-# their shared libraries will still be added to the Makefile, and
-# their names will be collected in the Make variable SHAREDMODS.  This
-# is used to build modules as shared libraries.  (They can be
-# installed using "make sharedinstall", which is implied by the
-# toplevel "make install" target.)  (For compatibility,
-# *noconfig* has the same effect as *shared*.)
-#
-# In addition, *static* explicitly declares the following modules to
-# be static.  Lines containing "*static*" and "*shared*" may thus
-# alternate throughout this file.
-
-# NOTE: As a standard policy, as many modules as can be supported by a
-# platform should be present.  The distribution comes with all modules
-# enabled that are supported by most platforms and don't require you
-# to ftp sources from elsewhere.
-
-
-# Some special rules to define PYTHONPATH.
-# Edit the definitions below to indicate which options you are using.
-# Don't add any whitespace or comments!
-
-# Directories where library files get installed.
-# DESTLIB is for Python modules; MACHDESTLIB for shared libraries.
-DESTLIB=$(LIBDEST)
-MACHDESTLIB=$(BINLIBDEST)
-
-# NOTE: all the paths are now relative to the prefix that is computed
-# at run time!
-
-# Standard path -- don't edit.
-# No leading colon since this is the first entry.
-# Empty since this is now just the runtime prefix.
-DESTPATH=
-
-# Site specific path components -- should begin with : if non-empty
-SITEPATH=
-
-# Standard path components for test modules
-TESTPATH=
-
-# Path components for machine- or system-dependent modules and shared libraries
-MACHDEPPATH=:plat-$(PLATDIR)
-EXTRAMACHDEPPATH=
-
-# Path component for the Tkinter-related modules
-# The TKPATH variable is always enabled, to save you the effort.
-TKPATH=:lib-tk
-
-# Path component for old modules.
-OLDPATH=:lib-old
-
-COREPYTHONPATH=$(DESTPATH)$(SITEPATH)$(TESTPATH)$(MACHDEPPATH)$(EXTRAMACHDEPPATH)$(TKPATH)$(OLDPATH)
-PYTHONPATH=$(COREPYTHONPATH)
-
-
-# The modules listed here can't be built as shared libraries for
-# various reasons; therefore they are listed here instead of in the
-# normal order.
-
-# This only contains the minimal set of modules required to run the
-# setup.py script in the root of the Python source tree.
-
-posix posixmodule.c		# posix (UNIX) system calls
-errno errnomodule.c		# posix (UNIX) errno values
-pwd pwdmodule.c			# this is needed to find out the user's home dir
-				# if $HOME is not set
-_sre _sre.c			# Fredrik Lundh's new regular expressions
-_codecs _codecsmodule.c		# access to the builtin codecs and codec registry
-_weakref _weakref.c             # weak referencess
-
-# The zipimport module is always imported at startup. Having it as a
-# builtin module avoids some bootstrapping problems and reduces overhead.
-zipimport zipimport.c
-
-# The rest of the modules listed in this file are all commented out by
-# default.  Usually they can be detected and built as dynamically
-# loaded modules by the new setup.py script added in Python 2.1.  If
-# you're on a platform that doesn't support dynamic loading, want to
-# compile modules statically into the Python binary, or need to
-# specify some odd set of compiler switches, you can uncomment the
-# appropriate lines below.
-
-# ======================================================================
-
-# The Python symtable module depends on .h files that setup.py doesn't track
-_symtable symtablemodule.c
-
-# The SGI specific GL module:
-
-GLHACK=-Dclear=__GLclear
-#gl glmodule.c cgensupport.c -I$(srcdir) $(GLHACK) -lgl -lX11
-
-# Pure module.  Cannot be linked dynamically.
-# -DWITH_QUANTIFY, -DWITH_PURIFY, or -DWITH_ALL_PURE
-#WHICH_PURE_PRODUCTS=-DWITH_ALL_PURE
-#PURE_INCLS=-I/usr/local/include
-#PURE_STUBLIBS=-L/usr/local/lib -lpurify_stubs -lquantify_stubs
-#pure puremodule.c $(WHICH_PURE_PRODUCTS) $(PURE_INCLS) $(PURE_STUBLIBS)
-
-# Uncommenting the following line tells makesetup that all following
-# modules are to be built as shared libraries (see above for more
-# detail; also note that *static* reverses this effect):
-
-#*shared*
-
-# GNU readline.  Unlike previous Python incarnations, GNU readline is
-# now incorporated in an optional module, configured in the Setup file
-# instead of by a configure script switch.  You may have to insert a
-# -L option pointing to the directory where libreadline.* lives,
-# and you may have to change -ltermcap to -ltermlib or perhaps remove
-# it, depending on your system -- see the GNU readline instructions.
-# It's okay for this to be a shared library, too.
-
-#readline readline.c -lreadline -ltermcap
-
-# Modules that should always be present (non UNIX dependent):
-
-array arraymodule.c	# array objects
-cmath cmathmodule.c _math.c # -lm # complex math library functions
-math mathmodule.c _math.c # -lm # math library functions, e.g. sin()
-_struct _struct.c	# binary structure packing/unpacking
-time timemodule.c # -lm # time operations and variables
-operator operator.c	# operator.add() and similar goodies
-#_testcapi _testcapimodule.c    # Python C API test module
-_random _randommodule.c	# Random number generator
-_collections _collectionsmodule.c # Container types
-_heapq _heapqmodule.c		# Heapq type
-itertools itertoolsmodule.c	# Functions creating iterators for efficient looping
-strop stropmodule.c		# String manipulations
-_functools _functoolsmodule.c	# Tools for working with functions and callable objects
-_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c	# elementtree accelerator
-#_pickle _pickle.c	# pickle accelerator
-datetime datetimemodule.c	# date/time type
-_bisect _bisectmodule.c	# Bisection algorithms
-
-unicodedata unicodedata.c    # static Unicode character database
-
-# access to ISO C locale support
-#_locale _localemodule.c  # -lintl
-
-
-# Modules with some UNIX dependencies -- on by default:
-# (If you have a really backward UNIX, select and socket may not be
-# supported...)
-
-fcntl fcntlmodule.c	# fcntl(2) and ioctl(2)
-#spwd spwdmodule.c		# spwd(3)
-#grp grpmodule.c		# grp(3)
-select selectmodule.c	# select(2); not on ancient System V
-
-# Memory-mapped files (also works on Win32).
-#mmap mmapmodule.c
-
-# CSV file helper
-#_csv _csv.c
-
-# Socket module helper for socket(2)
-_socket socketmodule.c
-
-# Socket module helper for SSL support; you must comment out the other
-# socket line above, and possibly edit the SSL variable:
-#SSL=/usr/local/ssl
-#_ssl _ssl.c \
-#	-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-#	-L$(SSL)/lib -lssl -lcrypto
-
-# The crypt module is now disabled by default because it breaks builds
-# on many systems (where -lcrypt is needed), e.g. Linux (I believe).
-#
-# First, look at Setup.config; configure may have set this for you.
-
-#crypt cryptmodule.c # -lcrypt	# crypt(3); needs -lcrypt on some systems
-
-
-# Some more UNIX dependent modules -- off by default, since these
-# are not supported by all UNIX systems:
-
-#nis nismodule.c -lnsl	# Sun yellow pages -- not everywhere
-#termios termios.c	# Steen Lumholt's termios module
-#resource resource.c	# Jeremy Hylton's rlimit interface
-
-
-# Multimedia modules -- off by default.
-# These don't work for 64-bit platforms!!!
-# #993173 says audioop works on 64-bit platforms, though.
-# These represent audio samples or images as strings:
-
-#audioop audioop.c	# Operations on audio samples
-#imageop imageop.c	# Operations on images
-
-
-# Note that the _md5 and _sha modules are normally only built if the
-# system does not have the OpenSSL libs containing an optimized version.
-
-# The _md5 module implements the RSA Data Security, Inc. MD5
-# Message-Digest Algorithm, described in RFC 1321.  The necessary files
-# md5.c and md5.h are included here.
-
-_md5 md5module.c md5.c
-
-
-# The _sha module implements the SHA checksum algorithms.
-# (NIST's Secure Hash Algorithms.)
-_sha shamodule.c
-_sha256 sha256module.c
-_sha512 sha512module.c
-
-
-# SGI IRIX specific modules -- off by default.
-
-# These module work on any SGI machine:
-
-# *** gl must be enabled higher up in this file ***
-#fm fmmodule.c $(GLHACK) -lfm -lgl		# Font Manager
-#sgi sgimodule.c			# sgi.nap() and a few more
-
-# This module requires the header file
-# /usr/people/4Dgifts/iristools/include/izoom.h:
-#imgfile imgfile.c -limage -lgutil -lgl -lm	# Image Processing Utilities
-
-
-# These modules require the Multimedia Development Option (I think):
-
-#al almodule.c -laudio			# Audio Library
-#cd cdmodule.c -lcdaudio -lds -lmediad	# CD Audio Library
-#cl clmodule.c -lcl -lawareaudio	# Compression Library
-#sv svmodule.c yuvconvert.c -lsvideo -lXext -lX11	# Starter Video
-
-
-# The FORMS library, by Mark Overmars, implements user interface
-# components such as dialogs and buttons using SGI's GL and FM
-# libraries.  You must ftp the FORMS library separately from
-# ftp://ftp.cs.ruu.nl/pub/SGI/FORMS.  It was tested with FORMS 2.2a.
-# NOTE: if you want to be able to use FORMS and curses simultaneously
-# (or both link them statically into the same binary), you must
-# compile all of FORMS with the cc option "-Dclear=__GLclear".
-
-# The FORMS variable must point to the FORMS subdirectory of the forms
-# toplevel directory:
-
-#FORMS=/ufs/guido/src/forms/FORMS
-#fl flmodule.c -I$(FORMS) $(GLHACK) $(FORMS)/libforms.a -lfm -lgl
-
-
-# SunOS specific modules -- off by default:
-
-#sunaudiodev sunaudiodev.c
-
-
-# A Linux specific module -- off by default; this may also work on
-# some *BSDs.
-
-#linuxaudiodev linuxaudiodev.c
-
-
-# George Neville-Neil's timing module:
-
-#timing timingmodule.c
-
-
-# The _tkinter module.
-#
-# The command for _tkinter is long and site specific.  Please
-# uncomment and/or edit those parts as indicated.  If you don't have a
-# specific extension (e.g. Tix or BLT), leave the corresponding line
-# commented out.  (Leave the trailing backslashes in!  If you
-# experience strange errors, you may want to join all uncommented
-# lines and remove the backslashes -- the backslash interpretation is
-# done by the shell's "read" command and it may not be implemented on
-# every system.
-
-# *** Always uncomment this (leave the leading underscore in!):
-# _tkinter _tkinter.c tkappinit.c -DWITH_APPINIT \
-# *** Uncomment and edit to reflect where your Tcl/Tk libraries are:
-#	-L/usr/local/lib \
-# *** Uncomment and edit to reflect where your Tcl/Tk headers are:
-#	-I/usr/local/include \
-# *** Uncomment and edit to reflect where your X11 header files are:
-#	-I/usr/X11R6/include \
-# *** Or uncomment this for Solaris:
-#	-I/usr/openwin/include \
-# *** Uncomment and edit for Tix extension only:
-#	-DWITH_TIX -ltix8.1.8.2 \
-# *** Uncomment and edit for BLT extension only:
-#	-DWITH_BLT -I/usr/local/blt/blt8.0-unoff/include -lBLT8.0 \
-# *** Uncomment and edit for PIL (TkImaging) extension only:
-#     (See http://www.pythonware.com/products/pil/ for more info)
-#	-DWITH_PIL -I../Extensions/Imaging/libImaging  tkImaging.c \
-# *** Uncomment and edit for TOGL extension only:
-#	-DWITH_TOGL togl.c \
-# *** Uncomment and edit to reflect your Tcl/Tk versions:
-#	-ltk8.2 -ltcl8.2 \
-# *** Uncomment and edit to reflect where your X11 libraries are:
-#	-L/usr/X11R6/lib \
-# *** Or uncomment this for Solaris:
-#	-L/usr/openwin/lib \
-# *** Uncomment these for TOGL extension only:
-#	-lGL -lGLU -lXext -lXmu \
-# *** Uncomment for AIX:
-#	-lld \
-# *** Always uncomment this; X11 libraries to link with:
-#	-lX11
-
-# Lance Ellinghaus's syslog module
-#syslog syslogmodule.c		# syslog daemon interface
-
-
-# Curses support, requring the System V version of curses, often
-# provided by the ncurses library.  e.g. on Linux, link with -lncurses
-# instead of -lcurses).
-#
-# First, look at Setup.config; configure may have set this for you.
-
-#_curses _cursesmodule.c -lcurses -ltermcap
-# Wrapper for the panel library that's part of ncurses and SYSV curses.
-#_curses_panel _curses_panel.c -lpanel -lncurses
-
-
-# Generic (SunOS / SVR4) dynamic loading module.
-# This is not needed for dynamic loading of Python modules --
-# it is a highly experimental and dangerous device for calling
-# *arbitrary* C functions in *arbitrary* shared libraries:
-
-#dl dlmodule.c
-
-
-# Modules that provide persistent dictionary-like semantics.  You will
-# probably want to arrange for at least one of them to be available on
-# your machine, though none are defined by default because of library
-# dependencies.  The Python module anydbm.py provides an
-# implementation independent wrapper for these; dumbdbm.py provides
-# similar functionality (but slower of course) implemented in Python.
-
-# The standard Unix dbm module has been moved to Setup.config so that
-# it will be compiled as a shared library by default.  Compiling it as
-# a built-in module causes conflicts with the pybsddb3 module since it
-# creates a static dependency on an out-of-date version of db.so.
-#
-# First, look at Setup.config; configure may have set this for you.
-
-#dbm dbmmodule.c 	# dbm(3) may require -lndbm or similar
-
-# Anthony Baxter's gdbm module.  GNU dbm(3) will require -lgdbm:
-#
-# First, look at Setup.config; configure may have set this for you.
-
-#gdbm gdbmmodule.c -I/usr/local/include -L/usr/local/lib -lgdbm
-
-
-# Sleepycat Berkeley DB interface.
-#
-# This requires the Sleepycat DB code, see http://www.sleepycat.com/
-# The earliest supported version of that library is 3.0, the latest
-# supported version is 4.0 (4.1 is specifically not supported, as that
-# changes the semantics of transactional databases). A list of available
-# releases can be found at
-#
-# http://www.sleepycat.com/update/index.html
-#
-# Edit the variables DB and DBLIBVERto point to the db top directory
-# and the subdirectory of PORT where you built it.
-#DB=/usr/local/BerkeleyDB.4.0
-#DBLIBVER=4.0
-#DBINC=$(DB)/include
-#DBLIB=$(DB)/lib
-#_bsddb _bsddb.c -I$(DBINC) -L$(DBLIB) -ldb-$(DBLIBVER)
-
-# Historical Berkeley DB 1.85
-#
-# This module is deprecated; the 1.85 version of the Berkeley DB library has
-# bugs that can cause data corruption. If you can, use later versions of the
-# library instead, available from <http://www.sleepycat.com/>.
-
-#DB=/depot/sundry/src/berkeley-db/db.1.85
-#DBPORT=$(DB)/PORT/irix.5.3
-#bsddb185 bsddbmodule.c -I$(DBPORT)/include -I$(DBPORT) $(DBPORT)/libdb.a
-
-
-
-# Helper module for various ascii-encoders
-binascii binascii.c
-
-# Fred Drake's interface to the Python parser
-parser parsermodule.c
-
-# cStringIO and cPickle
-cStringIO cStringIO.c
-cPickle cPickle.c
-
-
-# Lee Busby's SIGFPE modules.
-# The library to link fpectl with is platform specific.
-# Choose *one* of the options below for fpectl:
-
-# For SGI IRIX (tested on 5.3):
-#fpectl fpectlmodule.c -lfpe
-
-# For Solaris with SunPro compiler (tested on Solaris 2.5 with SunPro C 4.2):
-# (Without the compiler you don't have -lsunmath.)
-#fpectl fpectlmodule.c -R/opt/SUNWspro/lib -lsunmath -lm
-
-# For other systems: see instructions in fpectlmodule.c.
-#fpectl fpectlmodule.c ...
-
-# Test module for fpectl.  No extra libraries needed.
-#fpetest fpetestmodule.c
-
-# Andrew Kuchling's zlib module.
-# This require zlib 1.1.3 (or later).
-# See http://www.gzip.org/zlib/
-zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
-
-# Interface to the Expat XML parser
-#
-# Expat was written by James Clark and is now maintained by a group of
-# developers on SourceForge; see www.libexpat.org for more
-# information.  The pyexpat module was written by Paul Prescod after a
-# prototype by Jack Jansen.  Source of Expat 1.95.2 is included in
-# Modules/expat/.  Usage of a system shared libexpat.so/expat.dll is
-# not advised.
-#
-# More information on Expat can be found at www.libexpat.org.
-#
-pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI
-
-
-# Hye-Shik Chang's CJKCodecs
-
-# multibytecodec is required for all the other CJK codec modules
-#_multibytecodec cjkcodecs/multibytecodec.c
-
-#_codecs_cn cjkcodecs/_codecs_cn.c
-#_codecs_hk cjkcodecs/_codecs_hk.c
-#_codecs_iso2022 cjkcodecs/_codecs_iso2022.c
-#_codecs_jp cjkcodecs/_codecs_jp.c
-#_codecs_kr cjkcodecs/_codecs_kr.c
-#_codecs_tw cjkcodecs/_codecs_tw.c
-
-# Example -- included for reference only:
-# xx xxmodule.c
-
-# Another example -- the 'xxsubtype' module shows C-level subtyping in action
-xxsubtype xxsubtype.c
diff --git a/recipes/hostpython2/__init__.py b/recipes/hostpython2/__init__.py
deleted file mode 100644
index 5deb45e..0000000
--- a/recipes/hostpython2/__init__.py
+++ /dev/null
@@ -1,60 +0,0 @@
-
-from pythonforandroid.toolchain import Recipe, shprint, current_directory, info, warning
-from os.path import join, exists
-from os import environ
-import sh
-
-
-class Hostpython2Recipe(Recipe):
-    version = '2.7.13'
-    url = 'http://python.org/ftp/python/{version}/Python-{version}.tar.xz'
-    name = 'hostpython2'
-
-    conflicts = ['hostpython3']
-
-    def get_build_container_dir(self, arch=None):
-        choices = self.check_recipe_choices()
-        dir_name = '-'.join([self.name] + choices)
-        return join(self.ctx.build_dir, 'other_builds', dir_name, 'desktop')
-
-    def get_build_dir(self, arch=None):
-        return join(self.get_build_container_dir(), self.name)
-
-    def prebuild_arch(self, arch):
-        # Override hostpython Setup?
-        shprint(sh.cp, join(self.get_recipe_dir(), 'Setup'),
-                join(self.get_build_dir(), 'Modules', 'Setup'))
-
-    def build_arch(self, arch):
-        env = dict(environ)
-        with current_directory(self.get_build_dir()):
-
-            if exists('hostpython'):
-                info('hostpython already exists, skipping build')
-                self.ctx.hostpython = join(self.get_build_dir(),
-                                           'hostpython')
-                self.ctx.hostpgen = join(self.get_build_dir(),
-                                           'hostpgen')
-                return
-
-            configure = sh.Command('./configure')
-
-            shprint(configure, _env=env)
-            shprint(sh.make, '-j5', _env=env)
-
-            shprint(sh.mv, join('Parser', 'pgen'), 'hostpgen')
-
-            if exists('python.exe'):
-                shprint(sh.mv, 'python.exe', 'hostpython')
-            elif exists('python'):
-                shprint(sh.mv, 'python', 'hostpython')
-            else:
-                warning('Unable to find the python executable after '
-                        'hostpython build! Exiting.')
-                exit(1)
-
-        self.ctx.hostpython = join(self.get_build_dir(), 'hostpython')
-        self.ctx.hostpgen = join(self.get_build_dir(), 'hostpgen')
-
-
-recipe = Hostpython2Recipe()
diff --git a/recipes/hostpython3crystax/__init__.py b/recipes/hostpython3crystax/__init__.py
new file mode 100644
index 0000000..1559df2
--- /dev/null
+++ b/recipes/hostpython3crystax/__init__.py
@@ -0,0 +1,46 @@
+from pythonforandroid.toolchain import Recipe, shprint
+from os.path import join
+import sh
+
+
+class Hostpython3Recipe(Recipe):
+    version = 'auto'  # the version is taken from the python3crystax recipe
+    name = 'hostpython3crystax'
+
+    conflicts = ['hostpython2']
+
+    def get_build_container_dir(self, arch=None):
+        choices = self.check_recipe_choices()
+        dir_name = '-'.join([self.name] + choices)
+        return join(self.ctx.build_dir, 'other_builds', dir_name, 'desktop')
+
+    # def prebuild_armeabi(self):
+    #     # Override hostpython Setup?
+    #     shprint(sh.cp, join(self.get_recipe_dir(), 'Setup'),
+    #             join(self.get_build_dir('armeabi'), 'Modules', 'Setup'))
+
+    def get_build_dir(self, arch=None):
+        return join(self.get_build_container_dir(), self.name)
+
+    def build_arch(self, arch):
+        """
+        Creates expected build and symlinks system Python version.
+        """
+        self.ctx.hostpython = '/usr/bin/false'
+        self.ctx.hostpgen = '/usr/bin/false'
+        # creates the sub buildir (used by other recipes)
+        # https://github.com/kivy/python-for-android/issues/1154
+        sub_build_dir = join(self.get_build_dir(), 'build')
+        shprint(sh.mkdir, '-p', sub_build_dir)
+        python3crystax = self.get_recipe('python3crystax', self.ctx)
+        system_python = sh.which("python" + python3crystax.version)
+        if system_python is None:
+            raise OSError(
+                ('Trying to use python3crystax=={} but this Python version '
+                 'is not installed locally.').format(python3crystax.version))
+        link_dest = join(self.get_build_dir(), 'hostpython')
+        shprint(sh.ln, '-sf', system_python, link_dest)
+
+
+recipe = Hostpython3Recipe()
+
diff --git a/recipes/idna/__init__.py b/recipes/idna/__init__.py
new file mode 100644
index 0000000..a79c0f6
--- /dev/null
+++ b/recipes/idna/__init__.py
@@ -0,0 +1,14 @@
+from pythonforandroid.recipe import PythonRecipe
+
+
+class IdnaRecipe(PythonRecipe):
+    name = 'idna'
+    version = '2.6'
+    url = 'https://github.com/kjd/idna/archive/v{version}.tar.gz'
+
+    depends = [('python2', 'python3crystax'), 'setuptools']
+
+    call_hostpython_via_targetpython = False
+
+
+recipe = IdnaRecipe()
\ No newline at end of file
diff --git a/recipes/incremental/__init__.py b/recipes/incremental/__init__.py
index 4a61083..10e6b10 100644
--- a/recipes/incremental/__init__.py
+++ b/recipes/incremental/__init__.py
@@ -7,7 +7,7 @@ class IncrementalRecipe(PythonRecipe):
     version = '17.5.0'
     url = 'https://pypi.python.org/packages/8f/26/02c4016aa95f45479eea37c90c34f8fab6775732ae62587a874b619ca097/incremental-{version}.tar.gz'
 
-    depends = ['python2', 'setuptools']
+    depends = [('python2', 'python3crystax'), 'setuptools']
 
     call_hostpython_via_targetpython = False
     install_in_hostpython = True
diff --git a/recipes/ipaddress/__init__.py b/recipes/ipaddress/__init__.py
index 12a042a..509ecc5 100644
--- a/recipes/ipaddress/__init__.py
+++ b/recipes/ipaddress/__init__.py
@@ -2,13 +2,11 @@ from pythonforandroid.recipe import PythonRecipe
 
 
 class IpaddressRecipe(PythonRecipe):
-	name = 'ipaddress'
-	version = '1.0.16'
-	url = 'https://pypi.python.org/packages/source/i/ipaddress/ipaddress-{version}.tar.gz'
+    name = 'ipaddress'
+    version = '1.0.16'
+    url = 'https://pypi.python.org/packages/source/i/ipaddress/ipaddress-{version}.tar.gz'
 
-	depends = ['python2']
-	
-	call_hostpython_via_targetpython = False
+    depends = [('python2', 'python3crystax')]
 
 
-recipe = IpaddressRecipe()
+recipe = IpaddressRecipe()
\ No newline at end of file
diff --git a/recipes/libffi/Application.mk b/recipes/libffi/Application.mk
new file mode 100644
index 0000000..599da11
--- /dev/null
+++ b/recipes/libffi/Application.mk
@@ -0,0 +1,3 @@
+APP_OPTIM := release
+APP_ABI := all # or armeabi
+APP_MODULES := libffi
\ No newline at end of file
diff --git a/recipes/libffi/__init__.py b/recipes/libffi/__init__.py
new file mode 100644
index 0000000..6d80840
--- /dev/null
+++ b/recipes/libffi/__init__.py
@@ -0,0 +1,83 @@
+from os.path import exists, join
+from pythonforandroid.recipe import Recipe
+from pythonforandroid.logger import info, shprint
+from pythonforandroid.util import current_directory
+import sh
+
+
+class LibffiRecipe(Recipe):
+    name = 'libffi'
+    version = 'v3.2.1'
+    url = 'https://github.com/atgreen/libffi/archive/{version}.zip'
+
+    patches = ['remove-version-info.patch']
+
+    def get_host(self, arch):
+        with current_directory(self.get_build_dir(arch.arch)):
+            host = None
+            with open('Makefile') as f:
+                for line in f:
+                    if line.startswith('host = '):
+                        host = line.strip()[7:]
+                        break
+
+            if not host or not exists(host):
+                raise RuntimeError('failed to find build output! ({})'
+                                   .format(host))
+
+            return host
+
+    def should_build(self, arch):
+        return not exists(join(self.ctx.get_libs_dir(arch.arch), 'libffi.so'))
+
+    def build_arch(self, arch):
+        env = self.get_recipe_env(arch)
+        with current_directory(self.get_build_dir(arch.arch)):
+            if not exists('configure'):
+                shprint(sh.Command('./autogen.sh'), _env=env)
+            shprint(sh.Command('autoreconf'), '-vif', _env=env)
+            shprint(sh.Command('./configure'),
+                    '--host=' + arch.toolchain_prefix,
+                    '--prefix=' + self.ctx.get_python_install_dir(),
+                    '--enable-shared', _env=env)
+            #'--with-sysroot={}'.format(self.ctx.ndk_platform),
+            #'--target={}'.format(arch.toolchain_prefix),
+
+            # ndk 15 introduces unified headers required --sysroot and
+            # -isysroot for libraries and headers. libtool's head explodes
+            # trying to weave them into it's own magic. The result is a link
+            # failure tryng to link libc. We call make to compile the bits
+            # and manually link...
+
+            try:
+                shprint(sh.make, '-j5', 'libffi.la', _env=env)
+            except sh.ErrorReturnCode_2:
+                info("make libffi.la failed as expected")
+            cc = sh.Command(env['CC'].split()[0])
+            cflags = env['CC'].split()[1:]
+
+            cflags.extend(['-march=armv7-a', '-mfloat-abi=softfp', '-mfpu=vfp',
+                           '-mthumb', '-shared', '-fPIC', '-DPIC',
+                           'src/.libs/prep_cif.o', 'src/.libs/types.o',
+                           'src/.libs/raw_api.o', 'src/.libs/java_raw_api.o',
+                           'src/.libs/closures.o', 'src/arm/.libs/sysv.o',
+                           'src/arm/.libs/ffi.o', ]
+                         )
+
+            ldflags = env['LDFLAGS'].split()
+            cflags.extend(ldflags)
+            cflags.extend(['-Wl,-soname', '-Wl,libffi.so', '-o',
+                           '.libs/libffi.so'])
+
+            with current_directory(self.get_host(arch)):
+                shprint(cc, *cflags, _env=env)
+
+            shprint(sh.cp, '-t', self.ctx.get_libs_dir(arch.arch),
+                    join(self.get_host(arch), '.libs', 'libffi.so'))
+
+    def get_include_dirs(self, arch):
+        return [join(self.get_build_dir(arch.arch), self.get_host(arch),
+                     'include')]
+
+
+recipe = LibffiRecipe()
diff --git a/recipes/libffi/disable-mips-check.patch b/recipes/libffi/disable-mips-check.patch
new file mode 100644
index 0000000..0f727ba
--- /dev/null
+++ b/recipes/libffi/disable-mips-check.patch
@@ -0,0 +1,35 @@
+diff -Naur libffi/Android.mk b/Android.mk
+--- libffi/Android.mk	2015-12-22 17:00:48.025478556 -0600
++++ b/Android.mk	2015-12-22 17:02:23.999249390 -0600
+@@ -23,23 +23,20 @@
+ # Build rules for the target.
+ #
+ 
+-# We only build ffi for mips.
+-ifeq ($(TARGET_ARCH),mips)
+ 
+-   include $(CLEAR_VARS)
++include $(CLEAR_VARS)
+ 
+-   ffi_arch := $(TARGET_ARCH)
+-   ffi_os := $(TARGET_OS)
++ffi_arch := $(TARGET_ARCH)
++ffi_os := $(TARGET_OS)
+ 
+-   # This include just keeps the nesting a bit saner.
+-   include $(LOCAL_PATH)/Libffi.mk
++# This include just keeps the nesting a bit saner.
++include $(LOCAL_PATH)/Libffi.mk
+ 
+-   LOCAL_MODULE_TAGS := optional
+-   LOCAL_MODULE := libffi
++LOCAL_MODULE_TAGS := optional
++LOCAL_MODULE := libffi
+ 
+-   include $(BUILD_SHARED_LIBRARY)
++include $(BUILD_SHARED_LIBRARY)
+ 
+-endif
+ 
+ # Also include the rules for the test suite.
+ include external/libffi/testsuite/Android.mk
diff --git a/recipes/libffi/remove-version-info.patch b/recipes/libffi/remove-version-info.patch
new file mode 100644
index 0000000..7bdc11a
--- /dev/null
+++ b/recipes/libffi/remove-version-info.patch
@@ -0,0 +1,12 @@
+diff -Naur libffi/Makefile.am b/Makefile.am
+--- libffi/Makefile.am	2014-11-12 06:00:59.000000000 -0600
++++ b/Makefile.am	2015-12-23 15:57:10.363148806 -0600
+@@ -249,7 +249,7 @@
+ AM_CFLAGS += -DFFI_DEBUG
+ endif
+ 
+-libffi_la_LDFLAGS = -no-undefined -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS)
++libffi_la_LDFLAGS = -no-undefined -avoid-version $(LTLDFLAGS) $(AM_LTLDFLAGS)
+ 
+ AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
+ AM_CCASFLAGS = $(AM_CPPFLAGS)
diff --git a/recipes/libgmp/__init__.py b/recipes/libgmp/__init__.py
index a974f04..7e5ba59 100644
--- a/recipes/libgmp/__init__.py
+++ b/recipes/libgmp/__init__.py
@@ -3,6 +3,7 @@ from os.path import exists, join, realpath
 from os import uname
 import glob
 import sh
+import os
 
 
 class LibGMPRecipe(Recipe):
@@ -18,8 +19,20 @@ class LibGMPRecipe(Recipe):
         env = super(LibGMPRecipe, self).get_recipe_env(arch)
         env['LIBGMP_LDFLAGS'] = '-avoid-version'
 
-        return env
+        ndk_dir = self.ctx.ndk_platform
+        ndk_lib_dir = os.path.join(ndk_dir, 'usr', 'lib')
+        if self.ctx.ndk == 'crystax':
+            crystax_lib_dir = os.path.join(self.ctx.ndk_dir, 'sources/crystax/libs', arch.arch)
+            env['CFLAGS'] = '{} -L{} -L{}'.format(env.get('CFLAGS'), crystax_lib_dir, ndk_lib_dir);
 
+        env['LDFLAGS'] += ' -L{}'.format(ndk_lib_dir)
+        env['LDFLAGS'] += " --sysroot={}".format(self.ctx.ndk_platform)
+        env['PYTHONPATH'] = ':'.join([
+            self.ctx.get_site_packages_dir(),
+            env['BUILDLIB_PATH'],
+        ])
+
+        return env
 
     def build_arch(self, arch):
         with current_directory(self.get_build_dir(arch.arch)):
diff --git a/recipes/libsecp256k1/__init__.py b/recipes/libsecp256k1/__init__.py
new file mode 100644
index 0000000..69349d9
--- /dev/null
+++ b/recipes/libsecp256k1/__init__.py
@@ -0,0 +1,33 @@
+from pythonforandroid.toolchain import shprint, current_directory
+from pythonforandroid.recipe import Recipe
+from multiprocessing import cpu_count
+from os.path import exists
+import sh
+
+
+class LibSecp256k1Recipe(Recipe):
+
+    version = 'b0452e6'
+    url = 'https://github.com/bitcoin-core/secp256k1/archive/{version}.zip'
+
+    def build_arch(self, arch):
+        super(LibSecp256k1Recipe, self).build_arch(arch)
+        env = self.get_recipe_env(arch)
+        with current_directory(self.get_build_dir(arch.arch)):
+            if not exists('configure'):
+                shprint(sh.Command('./autogen.sh'), _env=env)
+            shprint(
+                sh.Command('./configure'),
+                '--host=' + arch.toolchain_prefix,
+                '--prefix=' + self.ctx.get_python_install_dir(),
+                '--enable-shared',
+                '--enable-module-recovery',
+                '--enable-experimental',
+                '--enable-module-ecdh',
+                _env=env)
+            shprint(sh.make, '-j' + str(cpu_count()), _env=env)
+            libs = ['.libs/libsecp256k1.so']
+            self.install_libs(arch, *libs)
+
+
+recipe = LibSecp256k1Recipe()
diff --git a/recipes/miniupnpc/__init__.py b/recipes/miniupnpc/__init__.py
index 821ac7c..a4b3a54 100644
--- a/recipes/miniupnpc/__init__.py
+++ b/recipes/miniupnpc/__init__.py
@@ -24,8 +24,8 @@ class MiniupnpcRecipe(CythonRecipe):
 
         target_python = Recipe.get_recipe('python2', self.ctx).get_build_dir(arch.arch)
         env['PYTHON_ROOT'] = join(target_python, 'python-install')
-        env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python2.7'
-        env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + ' -lpython2.7'
+        env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python3.6'
+        env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + ' -lpython3.6m'
 
         return env
 
diff --git a/recipes/netifaces/__init__.py b/recipes/netifaces/__init__.py
index 0c65188..b34fc7b 100644
--- a/recipes/netifaces/__init__.py
+++ b/recipes/netifaces/__init__.py
@@ -2,23 +2,31 @@
 import glob
 from pythonforandroid.toolchain import CompiledComponentsPythonRecipe, Recipe
 from os.path import join
+import os
 import sh
 
 
 class NetifacesRecipe(CompiledComponentsPythonRecipe):
     version = '0.10.7'
     url = 'https://files.pythonhosted.org/packages/81/39/4e9a026265ba944ddf1fea176dbb29e0fe50c43717ba4fcf3646d099fe38/netifaces-{version}.tar.gz'
-    depends = ['python2', 'setuptools']
+    depends = [('python2', 'python3crystax'), 'setuptools']
     call_hostpython_via_targetpython = False
+    patches = ['socket-ioctls.patch']
 
     def get_recipe_env(self, arch):
         env = super(NetifacesRecipe, self).get_recipe_env(arch)
 
-        target_python = Recipe.get_recipe('python2', self.ctx).get_build_dir(arch.arch)
-        env['PYTHON_ROOT'] = join(target_python, 'python-install')
         env['LDSHARED'] = env['CC'] + ' -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions'
-        env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python2.7'
-        env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + ' -lpython2.7'
+
+        if self.ctx.ndk == 'crystax':
+            # only keeps major.minor (discards patch)
+            python_version = self.ctx.python_recipe.version[0:3]
+            ndk_dir_python = os.path.join(self.ctx.ndk_dir, 'sources/python/', python_version)
+            env['LDFLAGS'] += ' -L{}'.format(os.path.join(ndk_dir_python, 'libs', arch.arch))
+            env['LDFLAGS'] += ' -lpython{}m'.format(python_version)
+            # until `pythonforandroid/archs.py` gets merged upstream:
+            # https://github.com/kivy/python-for-android/pull/1250/files#diff-569e13021e33ced8b54385f55b49cbe6
+            env['CFLAGS'] += ' -I{}/include/python/'.format(ndk_dir_python)
 
         return env
 
diff --git a/recipes/netifaces/socket-ioctls.patch b/recipes/netifaces/socket-ioctls.patch
new file mode 100644
index 0000000..4e6da70
--- /dev/null
+++ b/recipes/netifaces/socket-ioctls.patch
@@ -0,0 +1,29 @@
+--- a/netifaces.c	2018-09-25 21:26:48.238476102 +0100
++++ b/netifaces.c	2018-09-25 21:55:14.201995669 +0100
+@@ -22,6 +22,10 @@
+   obj = Py_InitModule3((name), (methods), (doc));
+ #endif
+ 
++#ifndef HAVE_SOCKET_IOCTLS
++#define HAVE_SOCKET_IOCTLS 1
++#endif
++
+ #ifndef WIN32
+ 
+ #  include <sys/types.h>
+@@ -178,12 +182,12 @@
+ #    include <ifaddrs.h>
+ #  endif /* HAVE_GETIFADDRS */
+ 
+-#  if !HAVE_GETIFADDRS && (!HAVE_SOCKET_IOCTLS || !HAVE_SIOCGIFCONF)
++//#  if !HAVE_GETIFADDRS && (!HAVE_SOCKET_IOCTLS || !HAVE_SIOCGIFCONF)
+ /* If the platform doesn't define, what we need, barf.  If you're seeing this,
+    it means you need to write suitable code to retrieve interface information
+    on your system. */
+-#    error You need to add code for your platform.
+-#  endif
++//#    error You need to add code for your platform.
++//#  endif
+ 
+ #else /* defined(WIN32) */
+ 
diff --git a/recipes/openssl/__init__.py b/recipes/openssl/__init__.py
index 1908469..4152b04 100644
--- a/recipes/openssl/__init__.py
+++ b/recipes/openssl/__init__.py
@@ -57,7 +57,7 @@ class OpenSSLRecipe(Recipe):
                     break
                 shprint(sh.make, 'clean', _env=env)
 
-            self.install_libs(arch, 'libssl' + self.version + '.so',
-                              'libcrypto' + self.version + '.so')
+            self.install_libs(arch, 'libssl.a', 'libssl' + self.version + '.so',
+                              'libcrypto.a', 'libcrypto' + self.version + '.so')
 
 recipe = OpenSSLRecipe()
diff --git a/recipes/pyasn1/__init__.py b/recipes/pyasn1/__init__.py
index 140a3bd..a10f7ca 100644
--- a/recipes/pyasn1/__init__.py
+++ b/recipes/pyasn1/__init__.py
@@ -5,8 +5,7 @@ from pythonforandroid.toolchain import PythonRecipe
 class PyASN1Recipe(PythonRecipe):
     version = '0.4.2'
     url = 'https://pypi.python.org/packages/source/p/pyasn1/pyasn1-{version}.tar.gz'
-    depends = ['python2']
-    
-    call_hostpython_via_targetpython = False
+    depends = [('python2', 'python3crystax')]
+
 
 recipe = PyASN1Recipe()
diff --git a/recipes/pyjnius/__init__.py b/recipes/pyjnius/__init__.py
index d9eaf42..c336e8a 100644
--- a/recipes/pyjnius/__init__.py
+++ b/recipes/pyjnius/__init__.py
@@ -18,10 +18,10 @@ class PyjniusRecipe(CythonRecipe):
 
     def get_recipe_env(self, arch):
         env = super(PyjniusRecipe, self).get_recipe_env(arch)
-        target_python = Recipe.get_recipe('python2', self.ctx).get_build_dir(arch.arch)
+        target_python = Recipe.get_recipe('python3crystax', self.ctx).get_build_dir(arch.arch)
         env['PYTHON_ROOT'] = join(target_python, 'python-install')
-        env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python2.7'
-        env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + ' -lpython2.7'
+        env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python3.6'
+        env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + ' -lpython3.6m'
 
         return env
 
diff --git a/recipes/pyopenssl/__init__.py b/recipes/pyopenssl/__init__.py
new file mode 100644
index 0000000..c328470
--- /dev/null
+++ b/recipes/pyopenssl/__init__.py
@@ -0,0 +1,13 @@
+from pythonforandroid.recipe import PythonRecipe
+
+
+class PyOpenSSLRecipe(PythonRecipe):
+    version = '17.4.0'
+    url = 'https://pypi.python.org/packages/source/p/pyOpenSSL/pyOpenSSL-{version}.tar.gz'
+    depends = [('python2', 'python3crystax'), 'openssl', 'setuptools']
+    site_packages_name = 'OpenSSL'
+
+    call_hostpython_via_targetpython = False
+
+
+recipe = PyOpenSSLRecipe()
\ No newline at end of file
diff --git a/recipes/python2/Setup.local-ssl b/recipes/python2/Setup.local-ssl
deleted file mode 100644
index eadc6ea..0000000
--- a/recipes/python2/Setup.local-ssl
+++ /dev/null
@@ -1,4 +0,0 @@
-SSL=
-_ssl _ssl.c \
-  -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-  -L$(SSL) -lssl$(OPENSSL_VERSION) -lcrypto$(OPENSSL_VERSION)
diff --git a/recipes/python2/__init__.py b/recipes/python2/__init__.py
deleted file mode 100644
index 5842efc..0000000
--- a/recipes/python2/__init__.py
+++ /dev/null
@@ -1,203 +0,0 @@
-
-from pythonforandroid.recipe import TargetPythonRecipe, Recipe
-from pythonforandroid.toolchain import shprint, current_directory, info
-from pythonforandroid.patching import (is_linux, is_darwin, is_api_gt,
-                                       check_all, is_api_lt, is_ndk)
-from os.path import exists, join, realpath
-import sh
-
-
-class Python2Recipe(TargetPythonRecipe):
-    version = "2.7.13"
-    url = 'http://python.org/ftp/python/{version}/Python-{version}.tar.xz'
-    name = 'python2'
-
-    depends = ['hostpython2']
-    conflicts = ['python3crystax', 'python3']
-    opt_depends = ['openssl','sqlite3']
-
-    patches = [  # 2.7.13-specific patches
-               'patches/Python-{version}-xcompile.patch',
-               'patches/Python-{version}-ctypes-disable-wchar.patch',
-               'patches/Python-{version}-ctypes-libffi-fix-configure.patch',
-               'patches/ffi-config.sub-{version}.patch',
-               # 'patches/fix-locale-{version}.patch',
-               'patches/fix-platform-{version}.patch',
-               'patches/fix-platform-processor.patch',
-               'patches/fix-pwdmodule.patch',
-               'patches/modules-locales-{version}.patch',
-
-                 # Old 2.7.2 patches
-               'patches/ctypes-find-library.patch',
-               'patches/custom-loader.patch',
-               'patches/disable-modules.patch',
-               'patches/fix-dlfcn.patch',
-               'patches/fix-dynamic-lookup.patch',
-               'patches/fix-filesystemdefaultencoding.patch',
-               'patches/fix-gethostbyaddr.patch',
-               'patches/fix-termios.patch' ]
-
-    from_crystax = False
-
-    def build_arch(self, arch):
-
-        if not exists(join(self.get_build_dir(arch.arch), 'libpython2.7.so')):
-            self.do_python_build(arch)
-
-        if not exists(self.ctx.get_python_install_dir()):
-            shprint(sh.cp, '-a', join(self.get_build_dir(arch.arch), 'python-install'),
-                    self.ctx.get_python_install_dir())
-
-        # This should be safe to run every time
-        info('Copying hostpython binary to targetpython folder')
-        shprint(sh.cp, self.ctx.hostpython,
-                join(self.ctx.get_python_install_dir(), 'bin', 'python.host'))
-        self.ctx.hostpython = join(self.ctx.get_python_install_dir(), 'bin', 'python.host')
-
-        if not exists(join(self.ctx.get_libs_dir(arch.arch), 'libpython2.7.so')):
-            shprint(sh.cp, join(self.get_build_dir(arch.arch), 'libpython2.7.so'), self.ctx.get_libs_dir(arch.arch))
-
-
-        # # if exists(join(self.get_build_dir(arch.arch), 'libpython2.7.so')):
-        # if exists(join(self.ctx.libs_dir, 'libpython2.7.so')):
-        #     info('libpython2.7.so already exists, skipping python build.')
-        #     if not exists(join(self.ctx.get_python_install_dir(), 'libpython2.7.so')):
-        #         info('Copying python-install to dist-dependent location')
-        #         shprint(sh.cp, '-a', 'python-install', self.ctx.get_python_install_dir())
-        #     self.ctx.hostpython = join(self.ctx.get_python_install_dir(), 'bin', 'python.host')
-
-        #     return
-
-    def do_python_build(self, arch):
-        shprint(sh.cp, self.ctx.hostpython, self.get_build_dir(arch.arch))
-        shprint(sh.cp, self.ctx.hostpgen, join(self.get_build_dir(arch.arch), 'Parser'))
-        hostpython = join(self.get_build_dir(arch.arch), 'hostpython')
-        hostpgen = join(self.get_build_dir(arch.arch), 'hostpython')
-
-        with current_directory(self.get_build_dir(arch.arch)):
-            hostpython_recipe = Recipe.get_recipe('hostpython2', self.ctx)
-            shprint(sh.cp, join(hostpython_recipe.get_recipe_dir(), 'Setup'), 'Modules')
-            env = arch.get_env()
-
-            # AND: Should probably move these to get_recipe_env for
-            # neatness, but the whole recipe needs tidying along these
-            # lines
-            env['HOSTARCH'] = 'arm-linux-androideabi'
-            env['BUILDARCH'] = shprint(sh.gcc, '-dumpmachine').stdout.decode('utf-8').split('\n')[0]
-            env['CFLAGS'] = ' '.join([env['CFLAGS'], '-DNO_MALLINFO'])
-            env['LDFLAGS'] += ' -Wl,--allow-multiple-definition'
-
-            # TODO need to add a should_build that checks if optional
-            # dependencies have changed (possibly in a generic way)
-            if 'openssl' in self.ctx.recipe_build_order:
-                r = Recipe.get_recipe('openssl', self.ctx)
-                openssl_build_dir = r.get_build_dir(arch.arch)
-                setuplocal = join('Modules', 'Setup.local')
-                shprint(sh.cp, join(self.get_recipe_dir(), 'Setup.local-ssl'), setuplocal)
-                #shprint(sh.cat, join(self.get_recipe_dir(), 'Setup.local-ssl'), '>>', setuplocal)
-                shprint(sh.sed, '-i.backup', 's#^SSL=.*#SSL={}#'.format(openssl_build_dir), setuplocal)
-                env['OPENSSL_VERSION'] = r.version
-                env['CFLAGS'] += ' -I%s' % join(openssl_build_dir, 'include')
-                env['LDFLAGS'] += ' -L%s' % openssl_build_dir
-
-            if 'sqlite3' in self.ctx.recipe_build_order:
-                # Include sqlite3 in python2 build
-                r = Recipe.get_recipe('sqlite3', self.ctx)
-                i = ' -I' + r.get_build_dir(arch.arch)
-                l = ' -L' + r.get_lib_dir(arch) + ' -lsqlite3'
-                # Insert or append to env
-                f = 'CPPFLAGS'
-                env[f] = env[f] + i if f in env else i
-                f = 'LDFLAGS'
-                env[f] = env[f] + l if f in env else l
-
-
-            with open('config.site', 'w') as fileh:
-                fileh.write('''
-    ac_cv_file__dev_ptmx=no
-    ac_cv_file__dev_ptc=no
-    ac_cv_have_long_long_format=yes
-                ''')
-
-            configure = sh.Command('./configure')
-            # AND: OFLAG isn't actually set, should it be?
-            shprint(configure,
-                    'CROSS_COMPILE_TARGET=yes',
-                    'CONFIG_SITE=config.site',
-                    '--host={}'.format(env['HOSTARCH']),
-                    '--build={}'.format(env['BUILDARCH']),
-                    '--prefix={}'.format(realpath('./python-install')),
-                    '--enable-shared',
-                    '--enable-ipv6',
-                    '--disable-toolbox-glue',
-                    '--disable-framework',
-                    '--with-system-ffi',
-                    _env=env)
-
-            # AND: tito left this comment in the original source. It's still true!
-            # FIXME, the first time, we got a error at:
-            # python$EXE ../../Tools/scripts/h2py.py -i '(u_long)' /usr/include/netinet/in.h
-        # /home/tito/code/python-for-android/build/python/Python-2.7.2/python: 1: Syntax error: word unexpected (expecting ")")
-            # because at this time, python is arm, not x86. even that, why /usr/include/netinet/in.h is used ?
-            # check if we can avoid this part.
-
-            # Hardcoded, remove -I/usr/include/x86_64-linux-gnu from CCSHARED and CFLAGS
-            # to prevent overriding android arm sysroot includes
-            make = sh.Command(env['MAKE'].split(' ')[0])
-            print('First install (expected to fail...')
-            try:
-                shprint(make, '-j5', 'install', 'HOSTPYTHON={}'.format(hostpython),
-                        'HOSTPGEN={}'.format(hostpgen),
-                        'CROSS_COMPILE_TARGET=yes',
-                        'INSTSONAME=libpython2.7.so',
-                        _env=env)
-            except sh.ErrorReturnCode_2:
-                print('First python2 make failed. This is expected, trying again.')
-
-            print('Make compile...')
-            shprint(make, '-j5', 'HOSTPYTHON={}'.format(hostpython),
-                'HOSTPGEN={}'.format(hostpgen),
-                'CROSS_COMPILE_TARGET=yes',
-                'INSTSONAME=libpython2.7.so',
-                _env=env)
-
-            print('Second install (expected to work)')
-            shprint(sh.touch, 'python.exe', 'python')
-            # -k added to keep going (need to figure out the reason for make: *** [libinstall] Error 1)
-            shprint(make, '-j5', 'install', 'HOSTPYTHON={}'.format(hostpython),
-                    'HOSTPGEN={}'.format(hostpgen),
-                    'CROSS_COMPILE_TARGET=yes',
-                    'INSTSONAME=libpython2.7.so',
-                    _env=env)
-
-            if is_darwin():
-                shprint(sh.cp, join(self.get_recipe_dir(), 'patches', '_scproxy.py'),
-                        join('python-install', 'Lib'))
-                shprint(sh.cp, join(self.get_recipe_dir(), 'patches', '_scproxy.py'),
-                        join('python-install', 'lib', 'python2.7'))
-
-            # reduce python
-            for dir_name in ('test', join('json', 'tests'), 'lib-tk',
-                             join('sqlite3', 'test'), join('unittest, test'),
-                             join('lib2to3', 'tests'), join('bsddb', 'tests'),
-                             join('distutils', 'tests'), join('email', 'test'),
-                             'curses'):
-                shprint(sh.rm, '-rf', join('python-install',
-                                           'lib', 'python2.7', dir_name))
-
-
-            # info('Copying python-install to dist-dependent location')
-            # shprint(sh.cp, '-a', 'python-install', self.ctx.get_python_install_dir())
-
-            # print('Copying hostpython binary to targetpython folder')
-            # shprint(sh.cp, self.ctx.hostpython,
-            #         join(self.ctx.get_python_install_dir(), 'bin', 'python.host'))
-            # self.ctx.hostpython = join(self.ctx.get_python_install_dir(), 'bin', 'python.host')
-
-
-
-        # print('python2 build done, exiting for debug')
-        # exit(1)
-
-
-recipe = Python2Recipe()
diff --git a/recipes/python2/patches/Python-2.7.13-ctypes-disable-wchar.patch b/recipes/python2/patches/Python-2.7.13-ctypes-disable-wchar.patch
deleted file mode 100644
index 9f8c440..0000000
--- a/recipes/python2/patches/Python-2.7.13-ctypes-disable-wchar.patch
+++ /dev/null
@@ -1,76 +0,0 @@
---- Python-2.7.9/Lib/ctypes/__init__.py.orig	2014-12-10 16:59:33.000000000 +0100
-+++ Python-2.7.9/Lib/ctypes/__init__.py	2016-03-17 14:00:15.636079979 +0100
-@@ -268,7 +268,7 @@
-     if _os.name in ("nt", "ce"):
-         _win_functype_cache.clear()
-     # _SimpleCData.c_wchar_p_from_param
--    POINTER(c_wchar).from_param = c_wchar_p.from_param
-+    # POINTER(c_wchar).from_param = c_wchar_p.from_param
-     # _SimpleCData.c_char_p_from_param
-     POINTER(c_char).from_param = c_char_p.from_param
-     _pointer_type_cache[None] = c_void_p
-@@ -288,29 +288,34 @@
-     else:
-         set_conversion_mode("ascii", "strict")
- 
--    class c_wchar_p(_SimpleCData):
--        _type_ = "Z"
--
--    class c_wchar(_SimpleCData):
--        _type_ = "u"
--
--    def create_unicode_buffer(init, size=None):
--        """create_unicode_buffer(aString) -> character array
--        create_unicode_buffer(anInteger) -> character array
--        create_unicode_buffer(aString, anInteger) -> character array
--        """
--        if isinstance(init, (str, unicode)):
--            if size is None:
--                size = len(init)+1
--            buftype = c_wchar * size
--            buf = buftype()
--            buf.value = init
--            return buf
--        elif isinstance(init, (int, long)):
--            buftype = c_wchar * init
--            buf = buftype()
--            return buf
--        raise TypeError(init)
-+# The wchar stuff causes a crash on Android (the bionic C library doesn't
-+# implement wchar_t anyway)
-+#
-+#    class c_wchar_p(_SimpleCData):
-+#        _type_ = "Z"
-+#
-+#    class c_wchar(_SimpleCData):
-+#        _type_ = "u"
-+#
-+#    POINTER(c_wchar).from_param = c_wchar_p.from_param #_SimpleCData.c_wchar_p_from_param
-+#
-+#    def create_unicode_buffer(init, size=None):
-+#        """create_unicode_buffer(aString) -> character array
-+#        create_unicode_buffer(anInteger) -> character array
-+#        create_unicode_buffer(aString, anInteger) -> character array
-+#        """
-+#        if isinstance(init, (str, unicode)):
-+#            if size is None:
-+#                size = len(init)+1
-+#            buftype = c_wchar * size
-+#            buf = buftype()
-+#            buf.value = init
-+#            return buf
-+#        elif isinstance(init, (int, long)):
-+#            buftype = c_wchar * init
-+#            buf = buftype()
-+#            return buf
-+#        raise TypeError(init)
- 
- # XXX Deprecated
- def SetPointerType(pointer, cls):
-@@ -552,4 +557,4 @@
-     elif sizeof(kind) == 8: c_uint64 = kind
- del(kind)
- 
--_reset_cache()
-+_reset_cache()
-\ No hay ningún carácter de nueva línea al final del fichero
diff --git a/recipes/python2/patches/Python-2.7.13-ctypes-libffi-fix-configure.patch b/recipes/python2/patches/Python-2.7.13-ctypes-libffi-fix-configure.patch
deleted file mode 100644
index 02d6f83..0000000
--- a/recipes/python2/patches/Python-2.7.13-ctypes-libffi-fix-configure.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-diff -pruN Python-2.7.9.orig//Modules/_ctypes/libffi/configure.ac Python-2.7.9/Modules/_ctypes/libffi/configure.ac
---- Python-2.7.9.orig//Modules/_ctypes/libffi/configure.ac      2009-04-28 22:01:18.000000000 +0200
-+++ Python-2.7.9/Modules/_ctypes/libffi/configure.ac    2010-04-20 22:46:02.000000000 +0200
-@@ -409,7 +409,7 @@
- 
- AC_CONFIG_LINKS(include/ffitarget.h:src/$TARGETDIR/ffitarget.h)
- 
--AC_CONFIG_FILES(include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc)
-+AC_CONFIG_FILES(include/Makefile include/ffi.h Makefile )
- 
- AC_CONFIG_LINKS(include/ffi_common.h:include/ffi_common.h)
- 
-diff -pruN Python-2.7.9.orig//Modules/_ctypes/libffi/Makefile.am Python-2.7.9/Modules/_ctypes/libffi/Makefile.am
---- Python-2.7.9.orig//Modules/_ctypes/libffi/Makefile.am       2008-03-04 21:09:11.000000000 +0100
-+++ Python-2.7.9/Modules/_ctypes/libffi/Makefile.am     2010-04-20 22:54:03.000000000 +0200
-@@ -2,7 +2,7 @@
- 
- AUTOMAKE_OPTIONS = foreign subdir-objects
- 
--SUBDIRS = include testsuite man
-+SUBDIRS = include
- 
- EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \
- 	src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h \
-@@ -34,8 +34,6 @@
- 	libtool-version ChangeLog.libffi m4/libtool.m4 \
- 	m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4
- 
--info_TEXINFOS = doc/libffi.texi
--
- ## ################################################################
- 
- ##
\ No newline at end of file
diff --git a/recipes/python2/patches/Python-2.7.13-xcompile.patch b/recipes/python2/patches/Python-2.7.13-xcompile.patch
deleted file mode 100644
index b3c9108..0000000
--- a/recipes/python2/patches/Python-2.7.13-xcompile.patch
+++ /dev/null
@@ -1,237 +0,0 @@
---- Python-2.7.13/configure	2016-12-17 21:05:07.000000000 +0100
-+++ Python-2.7.13-modified/configure	2017-08-10 12:59:24.094953614 +0100
-@@ -14927,7 +14927,7 @@
- $as_echo "$ac_cv_have_long_long_format" >&6; }
- fi
- 
--if test "$ac_cv_have_long_long_format" = yes
-+if test "$ac_cv_have_long_long_format" != no
- then
- 
- $as_echo "#define PY_FORMAT_LONG_LONG \"ll\"" >>confdefs.h
---- Python-2.7.13/Makefile.pre.in	2016-12-17 21:05:06.000000000 +0100
-+++ Python-2.7.13-modified/Makefile.pre.in	2017-08-11 00:17:32.557907871 +0100
-@@ -199,6 +199,7 @@
- 
- PYTHON=		python$(EXE)
- BUILDPYTHON=	python$(BUILDEXE)
-+HOSTPYTHON=     ./$(BUILDPYTHON)
- 
- PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@
- _PYTHON_HOST_PLATFORM=@_PYTHON_HOST_PLATFORM@
-@@ -246,6 +247,8 @@
- # Parser
- PGEN=		Parser/pgen$(EXE)
- 
-+HOSTPGEN=   $(PGEN)
-+
- PSRCS=		\
- 		Parser/acceler.c \
- 		Parser/grammar1.c \
-@@ -314,7 +317,7 @@
- 
- OPCODETARGETS_H= \
- 		$(srcdir)/Python/opcode_targets.h
--		
-+
- OPCODETARGETGEN= \
- 		$(srcdir)/Python/makeopcodetargets.py
- 
-@@ -544,8 +547,8 @@
- 	    *) quiet="";; \
- 	esac; \
- 	$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
--		_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
--		$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
-+		_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' PYTHONXCPREFIX='$(DESTDIR)$(prefix)' \
-+		$(HOSTPYTHON) -E $(srcdir)/setup.py $$quiet build
- 
- # Build static library
- # avoid long command lines, same as LIBRARY_OBJS
-@@ -681,7 +684,7 @@
- 
- $(GRAMMAR_H): @GENERATED_COMMENT@ $(GRAMMAR_INPUT) $(PGEN)
- 	@$(MKDIR_P) Include
--	$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
-+	$(HOSTPGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
- $(GRAMMAR_C): @GENERATED_COMMENT@ $(GRAMMAR_H)
- 	touch $(GRAMMAR_C)
- 
-@@ -1120,28 +1123,28 @@
- 		$(INSTALL_DATA) $(srcdir)/Modules/xxmodule.c \
- 			$(DESTDIR)$(LIBDEST)/distutils/tests ; \
- 	fi
--	PYTHONPATH=$(DESTDIR)$(LIBDEST)  $(RUNSHARED) \
--		$(PYTHON_FOR_BUILD) -Wi -tt $(DESTDIR)$(LIBDEST)/compileall.py \
-+	-PYTHONPATH=$(DESTDIR)$(LIBDEST)  $(RUNSHARED) \
-+		$(HOSTPYTHON) -Wi -tt $(DESTDIR)$(LIBDEST)/compileall.py \
- 		-d $(LIBDEST) -f \
- 		-x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
- 		$(DESTDIR)$(LIBDEST)
--	PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
--		$(PYTHON_FOR_BUILD) -Wi -tt -O $(DESTDIR)$(LIBDEST)/compileall.py \
-+	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
-+		$(HOSTPYTHON) -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) \
--		$(PYTHON_FOR_BUILD) -Wi -t $(DESTDIR)$(LIBDEST)/compileall.py \
-+		$(HOSTPYTHON) -Wi -t $(DESTDIR)$(LIBDEST)/compileall.py \
- 		-d $(LIBDEST)/site-packages -f \
- 		-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
- 	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
--		$(PYTHON_FOR_BUILD) -Wi -t -O $(DESTDIR)$(LIBDEST)/compileall.py \
-+		$(HOSTPYTHON) -Wi -t -O $(DESTDIR)$(LIBDEST)/compileall.py \
- 		-d $(LIBDEST)/site-packages -f \
- 		-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
- 	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
--		$(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt
-+		$(HOSTPYTHON) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt
- 	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
--		$(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
-+		$(HOSTPYTHON) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
- 
- # Create the PLATDIR source directory, if one wasn't distributed..
- $(srcdir)/Lib/$(PLATDIR):
-@@ -1253,11 +1256,13 @@
- # Install the dynamically loadable modules
- # This goes into $(exec_prefix)
- sharedinstall: sharedmods
--	$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/setup.py install \
-+	CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
-+	$(RUNSHARED) $(HOSTPYTHON) $(srcdir)/setup.py install \
-+		--skip-build \
- 	   	--prefix=$(prefix) \
--		--install-scripts=$(BINDIR) \
--		--install-platlib=$(DESTSHARED) \
--		--root=$(DESTDIR)/
-+		--install-scripts=$(DESTDIR)$(BINDIR) \
-+		--install-platlib=$(DESTDIR)$(DESTSHARED) \
-+		--root=/
- 	-rm $(DESTDIR)$(DESTSHARED)/_sysconfigdata.py*
- 
- # Here are a couple of targets for MacOSX again, to install a full
---- Python-2.7.13/setup.py	2016-12-17 21:05:07.000000000 +0100
-+++ Python-2.7.13-modified/setup.py	2017-08-11 00:05:55.922860254 +0100
-@@ -17,7 +17,7 @@
- from distutils.command.install_lib import install_lib
- from distutils.spawn import find_executable
- 
--cross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ
-+cross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ or ('PYTHONXCPREFIX' in os.environ)
- 
- def get_platform():
-     # cross build
-@@ -175,6 +175,7 @@
-     def __init__(self, dist):
-         build_ext.__init__(self, dist)
-         self.failed = []
-+        self.cross_compile = os.environ.get('CROSS_COMPILE_TARGET') == 'yes'
- 
-     def build_extensions(self):
- 
-@@ -310,6 +311,14 @@
-                           (ext.name, sys.exc_info()[1]))
-             self.failed.append(ext.name)
-             return
-+
-+        # Import check will not work when cross-compiling.
-+        if os.environ.has_key('PYTHONXCPREFIX'):
-+            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:
-@@ -341,7 +350,7 @@
-             self.get_ext_filename(self.get_ext_fullname(ext.name)))
- 
-         # Don't try to load extensions for cross builds
--        if cross_compiling:
-+        if cross_compiling or self.cross_compile:
-             return
- 
-         try:
-@@ -455,11 +464,9 @@
- 
-     def detect_modules(self):
-         # Ensure that /usr/local is always used
--        if not cross_compiling:
-+        if not cross_compiling or not self.cross_compile:
-             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()
- 
-         # Add paths specified in the environment variables LDFLAGS and
-@@ -496,16 +503,17 @@
-                     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') \
-+        #        and not self.cross_compile:
-             # 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
-@@ -517,7 +525,7 @@
-         # be assumed that no additional -I,-L directives are needed.
-         inc_dirs = self.compiler.include_dirs[:]
-         lib_dirs = self.compiler.library_dirs[:]
--        if not cross_compiling:
-+        if not cross_compiling or not self.cross_compile:
-             for d in (
-                 '/usr/include',
-                 ):
-@@ -526,7 +534,14 @@
-                 '/lib64', '/usr/lib64',
-                 '/lib', '/usr/lib',
-                 ):
--                add_dir_to_list(lib_dirs, d)
-+               add_dir_to_list(lib_dirs, d)
-+        else:
-+            cflags = os.environ.get('CFLAGS')
-+            if cflags:
-+                inc_dirs += [x[2:] for x in cflags.split() if x.startswith('-I')]
-+            ldflags = os.environ.get('LDFLAGS')
-+            if ldflags:
-+                lib_dirs += [x[2:] for x in ldflags.split() if x.startswith('-L')]
-         exts = []
-         missing = []
- 
-@@ -2048,8 +2063,15 @@
- 
-                 # 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))
-+                if cross_compiling or self.cross_compile:
-+                    cmd = "cd %s && env CFLAGS='' %s/configure --host=%s --build=%s %s" \
-+                          % (ffi_builddir, ffi_srcdir,
-+                             os.environ.get('HOSTARCH'),
-+                             os.environ.get('BUILDARCH'),
-+                             " ".join(config_args))
-+                else:
-+                    cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
-+                          % (ffi_builddir, ffi_srcdir, " ".join(config_args))
- 
-                 res = os.system(cmd)
-                 if res or not os.path.exists(ffi_configfile):
diff --git a/recipes/python2/patches/_scproxy.py b/recipes/python2/patches/_scproxy.py
deleted file mode 100644
index 2423940..0000000
--- a/recipes/python2/patches/_scproxy.py
+++ /dev/null
@@ -1,10 +0,0 @@
-'''
-Stub functions for _scproxy on iOS
-No proxy is supported yet.
-'''
-
-def _get_proxy_settings():
-    return {'exclude_simple': 1}
-
-def _get_proxies():
-    return {}
diff --git a/recipes/python2/patches/ctypes-find-library.patch b/recipes/python2/patches/ctypes-find-library.patch
deleted file mode 100644
index 6e32b8d..0000000
--- a/recipes/python2/patches/ctypes-find-library.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py
-index 52b3520..01b13a9 100644
---- a/Lib/ctypes/util.py
-+++ b/Lib/ctypes/util.py
-@@ -71,7 +71,23 @@ if os.name == "ce":
-     def find_library(name):
-         return name
-
--if os.name == "posix" and sys.platform == "darwin":
-+# This patch overrides the find_library to look in the right places on
-+# Android
-+if True:
-+    def find_library(name):
-+        # Check the user app lib dir
-+        app_root = os.path.abspath('./').split(os.path.sep)[0:4]
-+        lib_search = os.path.sep.join(app_root) + os.path.sep + 'lib'
-+        for filename in os.listdir(lib_search):
-+            if filename.endswith('.so') and name in filename:
-+                return lib_search + os.path.sep + filename
-+        # Check the normal Android system libraries
-+        for filename in os.listdir('/system/lib'):
-+            if filename.endswith('.so') and name in filename:
-+                return lib_search + os.path.sep + filename
-+        return None
-+
-+elif os.name == "posix" and sys.platform == "darwin":
-     from ctypes.macholib.dyld import dyld_find as _dyld_find
-     def find_library(name):
-         possible = ['lib%s.dylib' % name,
\ No newline at end of file
diff --git a/recipes/python2/patches/custom-loader.patch b/recipes/python2/patches/custom-loader.patch
deleted file mode 100644
index b5d4058..0000000
--- a/recipes/python2/patches/custom-loader.patch
+++ /dev/null
@@ -1,67 +0,0 @@
---- Python-2.7.9.orig/Python/dynload_shlib.c	2010-05-09 16:46:46.000000000 +0200
-+++ Python-2.7.9/Python/dynload_shlib.c	2011-04-20 17:52:12.000000000 +0200
-@@ -6,6 +6,7 @@
- 
- #include <sys/types.h>
- #include <sys/stat.h>
-+#include <stdlib.h>
- 
- #if defined(__NetBSD__)
- #include <sys/param.h>
-@@ -75,6 +76,21 @@
-     char pathbuf[260];
-     int dlopenflags=0;
- 
-+    static void *libpymodules = NULL;
-+    void *rv = NULL;
-+
-+    /* Ensure we have access to libpymodules. */
-+    if (libpymodules == NULL) {
-+        printf("ANDROID_APP_PATH = %s\n", getenv("ANDROID_APP_PATH"));
-+        PyOS_snprintf(pathbuf, sizeof(pathbuf), "%s/libpymodules.so", getenv("ANDROID_APP_PATH"));
-+        libpymodules = dlopen(pathbuf, RTLD_NOW);
-+
-+        if (libpymodules == NULL) {
-+            //abort();
-+        }
-+    }
-+        
-+
-     if (strchr(pathname, '/') == NULL) {
-         /* Prefix bare filename with "./" */
-         PyOS_snprintf(pathbuf, sizeof(pathbuf), "./%-.255s", pathname);
-@@ -84,6 +100,17 @@
-     PyOS_snprintf(funcname, sizeof(funcname),
-                   LEAD_UNDERSCORE "init%.200s", shortname);
- 
-+
-+    /* Read symbols that have been linked into the main binary. */
-+
-+    if (libpymodules) {
-+        rv = dlsym(libpymodules, funcname);
-+        if (rv != NULL) {
-+            return rv;
-+        }
-+    }
-+
-+
-     if (fp != NULL) {
-         int i;
-         struct stat statb;
---- Python-2.7.2.orig/Python/pythonrun.c	2010-10-29 05:45:34.000000000 +0200
-+++ Python-2.7.2/Python/pythonrun.c	2011-04-20 17:52:12.000000000 +0200
-@@ -254,9 +254,13 @@
-     _PyGILState_Init(interp, tstate);
- #endif /* WITH_THREAD */
- 
-+    /* For PGS4A, we don't want to call initsite, as we won't have the
-+       library path set up until start.pyx finishes running. */
-+#if 0
-     if (!Py_NoSiteFlag)
-         initsite(); /* Module site */
--
-+#endif 
-+    
-     if ((p = Py_GETENV("PYTHONIOENCODING")) && *p != '\0') {
-         p = icodeset = codeset = strdup(p);
-         free_codeset = 1;
\ No newline at end of file
diff --git a/recipes/python2/patches/disable-modules.patch b/recipes/python2/patches/disable-modules.patch
deleted file mode 100644
index f89a252..0000000
--- a/recipes/python2/patches/disable-modules.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- Python-2.7.13/setup.py	2016-12-17 21:05:07.000000000 +0100
-+++ Python-2.7.13/setup.py.disabled	2017-08-10 19:47:06.658219931 +0100
-@@ -33,7 +33,7 @@
- COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS"))
- 
- # This global variable is used to hold the list of modules to be disabled.
--disabled_module_list = []
-+disabled_module_list = ['_bsddb','_curses','_curses_panel','_locale','_tkinter','bsddb185','bz2','crypt','dbm','dl','gdbm','imageop','linuxaudiodev','nis','ossaudiodev','readline','spwd','sunaudiodev']
- 
- def add_dir_to_list(dirlist, dir):
-     """Add the directory 'dir' to the list 'dirlist' (at the front) if
diff --git a/recipes/python2/patches/ffi-config.sub-2.7.13.patch b/recipes/python2/patches/ffi-config.sub-2.7.13.patch
deleted file mode 100644
index db0ebbb..0000000
--- a/recipes/python2/patches/ffi-config.sub-2.7.13.patch
+++ /dev/null
@@ -1,1792 +0,0 @@
---- Python-2.7.9/Modules/_ctypes/libffi/config.sub.orig	2014-12-10 16:59:51.000000000 +0100
-+++ Python-2.7.9/Modules/_ctypes/libffi/config.sub	2015-05-03 18:58:32.633287511 +0200
-@@ -1,1788 +1,2 @@
- #! /bin/sh
--# Configuration validation subroutine script.
--#   Copyright 1992-2013 Free Software Foundation, Inc.
--
--timestamp='2013-04-24'
--
--# This file is free software; you can redistribute it and/or modify it
--# under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 3 of the License, or
--# (at your option) any later version.
--#
--# This program is distributed in the hope that it will be useful, but
--# WITHOUT ANY WARRANTY; without even the implied warranty of
--# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
--# General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License
--# along with this program; if not, see <http://www.gnu.org/licenses/>.
--#
--# As a special exception to the GNU General Public License, if you
--# distribute this file as part of a program that contains a
--# configuration script generated by Autoconf, you may include it under
--# the same distribution terms that you use for the rest of that
--# program.  This Exception is an additional permission under section 7
--# of the GNU General Public License, version 3 ("GPLv3").
--
--
--# Please send patches with a ChangeLog entry to config-patches@gnu.org.
--#
--# Configuration subroutine to validate and canonicalize a configuration type.
--# Supply the specified configuration type as an argument.
--# If it is invalid, we print an error message on stderr and exit with code 1.
--# Otherwise, we print the canonical config type on stdout and succeed.
--
--# You can get the latest version of this script from:
--# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
--
--# This file is supposed to be the same for all GNU packages
--# and recognize all the CPU types, system types and aliases
--# that are meaningful with *any* GNU software.
--# Each package is responsible for reporting which valid configurations
--# it does not support.  The user should be able to distinguish
--# a failure to support a valid configuration from a meaningless
--# configuration.
--
--# The goal of this file is to map all the various variations of a given
--# machine specification into a single specification in the form:
--#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
--# or in some cases, the newer four-part form:
--#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
--# It is wrong to echo any other type of specification.
--
--me=`echo "$0" | sed -e 's,.*/,,'`
--
--usage="\
--Usage: $0 [OPTION] CPU-MFR-OPSYS
--       $0 [OPTION] ALIAS
--
--Canonicalize a configuration name.
--
--Operation modes:
--  -h, --help         print this help, then exit
--  -t, --time-stamp   print date of last modification, then exit
--  -v, --version      print version number, then exit
--
--Report bugs and patches to <config-patches@gnu.org>."
--
--version="\
--GNU config.sub ($timestamp)
--
--Copyright 1992-2013 Free Software Foundation, Inc.
--
--This is free software; see the source for copying conditions.  There is NO
--warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
--
--help="
--Try \`$me --help' for more information."
--
--# Parse command line
--while test $# -gt 0 ; do
--  case $1 in
--    --time-stamp | --time* | -t )
--       echo "$timestamp" ; exit ;;
--    --version | -v )
--       echo "$version" ; exit ;;
--    --help | --h* | -h )
--       echo "$usage"; exit ;;
--    -- )     # Stop option processing
--       shift; break ;;
--    - )	# Use stdin as input.
--       break ;;
--    -* )
--       echo "$me: invalid option $1$help"
--       exit 1 ;;
--
--    *local*)
--       # First pass through any local machine types.
--       echo $1
--       exit ;;
--
--    * )
--       break ;;
--  esac
--done
--
--case $# in
-- 0) echo "$me: missing argument$help" >&2
--    exit 1;;
-- 1) ;;
-- *) echo "$me: too many arguments$help" >&2
--    exit 1;;
--esac
--
--# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
--# Here we must recognize all the valid KERNEL-OS combinations.
--maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
--case $maybe_os in
--  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
--  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
--  knetbsd*-gnu* | netbsd*-gnu* | \
--  kopensolaris*-gnu* | \
--  storm-chaos* | os2-emx* | rtmk-nova*)
--    os=-$maybe_os
--    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
--    ;;
--  android-linux)
--    os=-linux-android
--    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
--    ;;
--  *)
--    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
--    if [ $basic_machine != $1 ]
--    then os=`echo $1 | sed 's/.*-/-/'`
--    else os=; fi
--    ;;
--esac
--
--### Let's recognize common machines as not being operating systems so
--### that things like config.sub decstation-3100 work.  We also
--### recognize some manufacturers as not being operating systems, so we
--### can provide default operating systems below.
--case $os in
--	-sun*os*)
--		# Prevent following clause from handling this invalid input.
--		;;
--	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
--	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
--	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
--	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
--	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
--	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
--	-apple | -axis | -knuth | -cray | -microblaze*)
--		os=
--		basic_machine=$1
--		;;
--	-bluegene*)
--		os=-cnk
--		;;
--	-sim | -cisco | -oki | -wec | -winbond)
--		os=
--		basic_machine=$1
--		;;
--	-scout)
--		;;
--	-wrs)
--		os=-vxworks
--		basic_machine=$1
--		;;
--	-chorusos*)
--		os=-chorusos
--		basic_machine=$1
--		;;
--	-chorusrdb)
--		os=-chorusrdb
--		basic_machine=$1
--		;;
--	-hiux*)
--		os=-hiuxwe2
--		;;
--	-sco6)
--		os=-sco5v6
--		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
--		;;
--	-sco5)
--		os=-sco3.2v5
--		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
--		;;
--	-sco4)
--		os=-sco3.2v4
--		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
--		;;
--	-sco3.2.[4-9]*)
--		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
--		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
--		;;
--	-sco3.2v[4-9]*)
--		# Don't forget version if it is 3.2v4 or newer.
--		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
--		;;
--	-sco5v6*)
--		# Don't forget version if it is 3.2v4 or newer.
--		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
--		;;
--	-sco*)
--		os=-sco3.2v2
--		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
--		;;
--	-udk*)
--		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
--		;;
--	-isc)
--		os=-isc2.2
--		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
--		;;
--	-clix*)
--		basic_machine=clipper-intergraph
--		;;
--	-isc*)
--		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
--		;;
--	-lynx*178)
--		os=-lynxos178
--		;;
--	-lynx*5)
--		os=-lynxos5
--		;;
--	-lynx*)
--		os=-lynxos
--		;;
--	-ptx*)
--		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
--		;;
--	-windowsnt*)
--		os=`echo $os | sed -e 's/windowsnt/winnt/'`
--		;;
--	-psos*)
--		os=-psos
--		;;
--	-mint | -mint[0-9]*)
--		basic_machine=m68k-atari
--		os=-mint
--		;;
--esac
--
--# Decode aliases for certain CPU-COMPANY combinations.
--case $basic_machine in
--	# Recognize the basic CPU types without company name.
--	# Some are omitted here because they have special meanings below.
--	1750a | 580 \
--	| a29k \
--	| aarch64 | aarch64_be \
--	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
--	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
--	| am33_2.0 \
--	| arc | arceb \
--	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
--	| avr | avr32 \
--	| be32 | be64 \
--	| bfin \
--	| c4x | clipper \
--	| d10v | d30v | dlx | dsp16xx \
--	| epiphany \
--	| fido | fr30 | frv \
--	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
--	| hexagon \
--	| i370 | i860 | i960 | ia64 \
--	| ip2k | iq2000 \
--	| le32 | le64 \
--	| lm32 \
--	| m32c | m32r | m32rle | m68000 | m68k | m88k \
--	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
--	| mips | mipsbe | mipseb | mipsel | mipsle \
--	| mips16 \
--	| mips64 | mips64el \
--	| mips64octeon | mips64octeonel \
--	| mips64orion | mips64orionel \
--	| mips64r5900 | mips64r5900el \
--	| mips64vr | mips64vrel \
--	| mips64vr4100 | mips64vr4100el \
--	| mips64vr4300 | mips64vr4300el \
--	| mips64vr5000 | mips64vr5000el \
--	| mips64vr5900 | mips64vr5900el \
--	| mipsisa32 | mipsisa32el \
--	| mipsisa32r2 | mipsisa32r2el \
--	| mipsisa64 | mipsisa64el \
--	| mipsisa64r2 | mipsisa64r2el \
--	| mipsisa64sb1 | mipsisa64sb1el \
--	| mipsisa64sr71k | mipsisa64sr71kel \
--	| mipsr5900 | mipsr5900el \
--	| mipstx39 | mipstx39el \
--	| mn10200 | mn10300 \
--	| moxie \
--	| mt \
--	| msp430 \
--	| nds32 | nds32le | nds32be \
--	| nios | nios2 | nios2eb | nios2el \
--	| ns16k | ns32k \
--	| open8 \
--	| or1k | or32 \
--	| pdp10 | pdp11 | pj | pjl \
--	| powerpc | powerpc64 | powerpc64le | powerpcle \
--	| pyramid \
--	| rl78 | rx \
--	| score \
--	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
--	| sh64 | sh64le \
--	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
--	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
--	| spu \
--	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
--	| ubicom32 \
--	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
--	| we32k \
--	| x86 | xc16x | xstormy16 | xtensa \
--	| z8k | z80)
--		basic_machine=$basic_machine-unknown
--		;;
--	c54x)
--		basic_machine=tic54x-unknown
--		;;
--	c55x)
--		basic_machine=tic55x-unknown
--		;;
--	c6x)
--		basic_machine=tic6x-unknown
--		;;
--	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
--		basic_machine=$basic_machine-unknown
--		os=-none
--		;;
--	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
--		;;
--	ms1)
--		basic_machine=mt-unknown
--		;;
--
--	strongarm | thumb | xscale)
--		basic_machine=arm-unknown
--		;;
--	xgate)
--		basic_machine=$basic_machine-unknown
--		os=-none
--		;;
--	xscaleeb)
--		basic_machine=armeb-unknown
--		;;
--
--	xscaleel)
--		basic_machine=armel-unknown
--		;;
--
--	# We use `pc' rather than `unknown'
--	# because (1) that's what they normally are, and
--	# (2) the word "unknown" tends to confuse beginning users.
--	i*86 | x86_64)
--	  basic_machine=$basic_machine-pc
--	  ;;
--	# Object if more than one company name word.
--	*-*-*)
--		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
--		exit 1
--		;;
--	# Recognize the basic CPU types with company name.
--	580-* \
--	| a29k-* \
--	| aarch64-* | aarch64_be-* \
--	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
--	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
--	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
--	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
--	| avr-* | avr32-* \
--	| be32-* | be64-* \
--	| bfin-* | bs2000-* \
--	| c[123]* | c30-* | [cjt]90-* | c4x-* \
--	| clipper-* | craynv-* | cydra-* \
--	| d10v-* | d30v-* | dlx-* \
--	| elxsi-* \
--	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
--	| h8300-* | h8500-* \
--	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
--	| hexagon-* \
--	| i*86-* | i860-* | i960-* | ia64-* \
--	| ip2k-* | iq2000-* \
--	| le32-* | le64-* \
--	| lm32-* \
--	| m32c-* | m32r-* | m32rle-* \
--	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
--	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
--	| microblaze-* | microblazeel-* \
--	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
--	| mips16-* \
--	| mips64-* | mips64el-* \
--	| mips64octeon-* | mips64octeonel-* \
--	| mips64orion-* | mips64orionel-* \
--	| mips64r5900-* | mips64r5900el-* \
--	| mips64vr-* | mips64vrel-* \
--	| mips64vr4100-* | mips64vr4100el-* \
--	| mips64vr4300-* | mips64vr4300el-* \
--	| mips64vr5000-* | mips64vr5000el-* \
--	| mips64vr5900-* | mips64vr5900el-* \
--	| mipsisa32-* | mipsisa32el-* \
--	| mipsisa32r2-* | mipsisa32r2el-* \
--	| mipsisa64-* | mipsisa64el-* \
--	| mipsisa64r2-* | mipsisa64r2el-* \
--	| mipsisa64sb1-* | mipsisa64sb1el-* \
--	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
--	| mipsr5900-* | mipsr5900el-* \
--	| mipstx39-* | mipstx39el-* \
--	| mmix-* \
--	| mt-* \
--	| msp430-* \
--	| nds32-* | nds32le-* | nds32be-* \
--	| nios-* | nios2-* | nios2eb-* | nios2el-* \
--	| none-* | np1-* | ns16k-* | ns32k-* \
--	| open8-* \
--	| orion-* \
--	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
--	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
--	| pyramid-* \
--	| rl78-* | romp-* | rs6000-* | rx-* \
--	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
--	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
--	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
--	| sparclite-* \
--	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
--	| tahoe-* \
--	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
--	| tile*-* \
--	| tron-* \
--	| ubicom32-* \
--	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
--	| vax-* \
--	| we32k-* \
--	| x86-* | x86_64-* | xc16x-* | xps100-* \
--	| xstormy16-* | xtensa*-* \
--	| ymp-* \
--	| z8k-* | z80-*)
--		;;
--	# Recognize the basic CPU types without company name, with glob match.
--	xtensa*)
--		basic_machine=$basic_machine-unknown
--		;;
--	# Recognize the various machine names and aliases which stand
--	# for a CPU type and a company and sometimes even an OS.
--	386bsd)
--		basic_machine=i386-unknown
--		os=-bsd
--		;;
--	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
--		basic_machine=m68000-att
--		;;
--	3b*)
--		basic_machine=we32k-att
--		;;
--	a29khif)
--		basic_machine=a29k-amd
--		os=-udi
--		;;
--	abacus)
--		basic_machine=abacus-unknown
--		;;
--	adobe68k)
--		basic_machine=m68010-adobe
--		os=-scout
--		;;
--	alliant | fx80)
--		basic_machine=fx80-alliant
--		;;
--	altos | altos3068)
--		basic_machine=m68k-altos
--		;;
--	am29k)
--		basic_machine=a29k-none
--		os=-bsd
--		;;
--	amd64)
--		basic_machine=x86_64-pc
--		;;
--	amd64-*)
--		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
--		;;
--	amdahl)
--		basic_machine=580-amdahl
--		os=-sysv
--		;;
--	amiga | amiga-*)
--		basic_machine=m68k-unknown
--		;;
--	amigaos | amigados)
--		basic_machine=m68k-unknown
--		os=-amigaos
--		;;
--	amigaunix | amix)
--		basic_machine=m68k-unknown
--		os=-sysv4
--		;;
--	apollo68)
--		basic_machine=m68k-apollo
--		os=-sysv
--		;;
--	apollo68bsd)
--		basic_machine=m68k-apollo
--		os=-bsd
--		;;
--	aros)
--		basic_machine=i386-pc
--		os=-aros
--		;;
--	aux)
--		basic_machine=m68k-apple
--		os=-aux
--		;;
--	balance)
--		basic_machine=ns32k-sequent
--		os=-dynix
--		;;
--	blackfin)
--		basic_machine=bfin-unknown
--		os=-linux
--		;;
--	blackfin-*)
--		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
--		os=-linux
--		;;
--	bluegene*)
--		basic_machine=powerpc-ibm
--		os=-cnk
--		;;
--	c54x-*)
--		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
--		;;
--	c55x-*)
--		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
--		;;
--	c6x-*)
--		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
--		;;
--	c90)
--		basic_machine=c90-cray
--		os=-unicos
--		;;
--	cegcc)
--		basic_machine=arm-unknown
--		os=-cegcc
--		;;
--	convex-c1)
--		basic_machine=c1-convex
--		os=-bsd
--		;;
--	convex-c2)
--		basic_machine=c2-convex
--		os=-bsd
--		;;
--	convex-c32)
--		basic_machine=c32-convex
--		os=-bsd
--		;;
--	convex-c34)
--		basic_machine=c34-convex
--		os=-bsd
--		;;
--	convex-c38)
--		basic_machine=c38-convex
--		os=-bsd
--		;;
--	cray | j90)
--		basic_machine=j90-cray
--		os=-unicos
--		;;
--	craynv)
--		basic_machine=craynv-cray
--		os=-unicosmp
--		;;
--	cr16 | cr16-*)
--		basic_machine=cr16-unknown
--		os=-elf
--		;;
--	crds | unos)
--		basic_machine=m68k-crds
--		;;
--	crisv32 | crisv32-* | etraxfs*)
--		basic_machine=crisv32-axis
--		;;
--	cris | cris-* | etrax*)
--		basic_machine=cris-axis
--		;;
--	crx)
--		basic_machine=crx-unknown
--		os=-elf
--		;;
--	da30 | da30-*)
--		basic_machine=m68k-da30
--		;;
--	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
--		basic_machine=mips-dec
--		;;
--	decsystem10* | dec10*)
--		basic_machine=pdp10-dec
--		os=-tops10
--		;;
--	decsystem20* | dec20*)
--		basic_machine=pdp10-dec
--		os=-tops20
--		;;
--	delta | 3300 | motorola-3300 | motorola-delta \
--	      | 3300-motorola | delta-motorola)
--		basic_machine=m68k-motorola
--		;;
--	delta88)
--		basic_machine=m88k-motorola
--		os=-sysv3
--		;;
--	dicos)
--		basic_machine=i686-pc
--		os=-dicos
--		;;
--	djgpp)
--		basic_machine=i586-pc
--		os=-msdosdjgpp
--		;;
--	dpx20 | dpx20-*)
--		basic_machine=rs6000-bull
--		os=-bosx
--		;;
--	dpx2* | dpx2*-bull)
--		basic_machine=m68k-bull
--		os=-sysv3
--		;;
--	ebmon29k)
--		basic_machine=a29k-amd
--		os=-ebmon
--		;;
--	elxsi)
--		basic_machine=elxsi-elxsi
--		os=-bsd
--		;;
--	encore | umax | mmax)
--		basic_machine=ns32k-encore
--		;;
--	es1800 | OSE68k | ose68k | ose | OSE)
--		basic_machine=m68k-ericsson
--		os=-ose
--		;;
--	fx2800)
--		basic_machine=i860-alliant
--		;;
--	genix)
--		basic_machine=ns32k-ns
--		;;
--	gmicro)
--		basic_machine=tron-gmicro
--		os=-sysv
--		;;
--	go32)
--		basic_machine=i386-pc
--		os=-go32
--		;;
--	h3050r* | hiux*)
--		basic_machine=hppa1.1-hitachi
--		os=-hiuxwe2
--		;;
--	h8300hms)
--		basic_machine=h8300-hitachi
--		os=-hms
--		;;
--	h8300xray)
--		basic_machine=h8300-hitachi
--		os=-xray
--		;;
--	h8500hms)
--		basic_machine=h8500-hitachi
--		os=-hms
--		;;
--	harris)
--		basic_machine=m88k-harris
--		os=-sysv3
--		;;
--	hp300-*)
--		basic_machine=m68k-hp
--		;;
--	hp300bsd)
--		basic_machine=m68k-hp
--		os=-bsd
--		;;
--	hp300hpux)
--		basic_machine=m68k-hp
--		os=-hpux
--		;;
--	hp3k9[0-9][0-9] | hp9[0-9][0-9])
--		basic_machine=hppa1.0-hp
--		;;
--	hp9k2[0-9][0-9] | hp9k31[0-9])
--		basic_machine=m68000-hp
--		;;
--	hp9k3[2-9][0-9])
--		basic_machine=m68k-hp
--		;;
--	hp9k6[0-9][0-9] | hp6[0-9][0-9])
--		basic_machine=hppa1.0-hp
--		;;
--	hp9k7[0-79][0-9] | hp7[0-79][0-9])
--		basic_machine=hppa1.1-hp
--		;;
--	hp9k78[0-9] | hp78[0-9])
--		# FIXME: really hppa2.0-hp
--		basic_machine=hppa1.1-hp
--		;;
--	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
--		# FIXME: really hppa2.0-hp
--		basic_machine=hppa1.1-hp
--		;;
--	hp9k8[0-9][13679] | hp8[0-9][13679])
--		basic_machine=hppa1.1-hp
--		;;
--	hp9k8[0-9][0-9] | hp8[0-9][0-9])
--		basic_machine=hppa1.0-hp
--		;;
--	hppa-next)
--		os=-nextstep3
--		;;
--	hppaosf)
--		basic_machine=hppa1.1-hp
--		os=-osf
--		;;
--	hppro)
--		basic_machine=hppa1.1-hp
--		os=-proelf
--		;;
--	i370-ibm* | ibm*)
--		basic_machine=i370-ibm
--		;;
--	i*86v32)
--		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
--		os=-sysv32
--		;;
--	i*86v4*)
--		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
--		os=-sysv4
--		;;
--	i*86v)
--		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
--		os=-sysv
--		;;
--	i*86sol2)
--		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
--		os=-solaris2
--		;;
--	i386mach)
--		basic_machine=i386-mach
--		os=-mach
--		;;
--	i386-vsta | vsta)
--		basic_machine=i386-unknown
--		os=-vsta
--		;;
--	iris | iris4d)
--		basic_machine=mips-sgi
--		case $os in
--		    -irix*)
--			;;
--		    *)
--			os=-irix4
--			;;
--		esac
--		;;
--	isi68 | isi)
--		basic_machine=m68k-isi
--		os=-sysv
--		;;
--	m68knommu)
--		basic_machine=m68k-unknown
--		os=-linux
--		;;
--	m68knommu-*)
--		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
--		os=-linux
--		;;
--	m88k-omron*)
--		basic_machine=m88k-omron
--		;;
--	magnum | m3230)
--		basic_machine=mips-mips
--		os=-sysv
--		;;
--	merlin)
--		basic_machine=ns32k-utek
--		os=-sysv
--		;;
--	microblaze*)
--		basic_machine=microblaze-xilinx
--		;;
--	mingw64)
--		basic_machine=x86_64-pc
--		os=-mingw64
--		;;
--	mingw32)
--		basic_machine=i386-pc
--		os=-mingw32
--		;;
--	mingw32ce)
--		basic_machine=arm-unknown
--		os=-mingw32ce
--		;;
--	miniframe)
--		basic_machine=m68000-convergent
--		;;
--	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
--		basic_machine=m68k-atari
--		os=-mint
--		;;
--	mips3*-*)
--		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
--		;;
--	mips3*)
--		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
--		;;
--	monitor)
--		basic_machine=m68k-rom68k
--		os=-coff
--		;;
--	morphos)
--		basic_machine=powerpc-unknown
--		os=-morphos
--		;;
--	msdos)
--		basic_machine=i386-pc
--		os=-msdos
--		;;
--	ms1-*)
--		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
--		;;
--	msys)
--		basic_machine=i386-pc
--		os=-msys
--		;;
--	mvs)
--		basic_machine=i370-ibm
--		os=-mvs
--		;;
--	nacl)
--		basic_machine=le32-unknown
--		os=-nacl
--		;;
--	ncr3000)
--		basic_machine=i486-ncr
--		os=-sysv4
--		;;
--	netbsd386)
--		basic_machine=i386-unknown
--		os=-netbsd
--		;;
--	netwinder)
--		basic_machine=armv4l-rebel
--		os=-linux
--		;;
--	news | news700 | news800 | news900)
--		basic_machine=m68k-sony
--		os=-newsos
--		;;
--	news1000)
--		basic_machine=m68030-sony
--		os=-newsos
--		;;
--	news-3600 | risc-news)
--		basic_machine=mips-sony
--		os=-newsos
--		;;
--	necv70)
--		basic_machine=v70-nec
--		os=-sysv
--		;;
--	next | m*-next )
--		basic_machine=m68k-next
--		case $os in
--		    -nextstep* )
--			;;
--		    -ns2*)
--		      os=-nextstep2
--			;;
--		    *)
--		      os=-nextstep3
--			;;
--		esac
--		;;
--	nh3000)
--		basic_machine=m68k-harris
--		os=-cxux
--		;;
--	nh[45]000)
--		basic_machine=m88k-harris
--		os=-cxux
--		;;
--	nindy960)
--		basic_machine=i960-intel
--		os=-nindy
--		;;
--	mon960)
--		basic_machine=i960-intel
--		os=-mon960
--		;;
--	nonstopux)
--		basic_machine=mips-compaq
--		os=-nonstopux
--		;;
--	np1)
--		basic_machine=np1-gould
--		;;
--	neo-tandem)
--		basic_machine=neo-tandem
--		;;
--	nse-tandem)
--		basic_machine=nse-tandem
--		;;
--	nsr-tandem)
--		basic_machine=nsr-tandem
--		;;
--	op50n-* | op60c-*)
--		basic_machine=hppa1.1-oki
--		os=-proelf
--		;;
--	openrisc | openrisc-*)
--		basic_machine=or32-unknown
--		;;
--	os400)
--		basic_machine=powerpc-ibm
--		os=-os400
--		;;
--	OSE68000 | ose68000)
--		basic_machine=m68000-ericsson
--		os=-ose
--		;;
--	os68k)
--		basic_machine=m68k-none
--		os=-os68k
--		;;
--	pa-hitachi)
--		basic_machine=hppa1.1-hitachi
--		os=-hiuxwe2
--		;;
--	paragon)
--		basic_machine=i860-intel
--		os=-osf
--		;;
--	parisc)
--		basic_machine=hppa-unknown
--		os=-linux
--		;;
--	parisc-*)
--		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
--		os=-linux
--		;;
--	pbd)
--		basic_machine=sparc-tti
--		;;
--	pbb)
--		basic_machine=m68k-tti
--		;;
--	pc532 | pc532-*)
--		basic_machine=ns32k-pc532
--		;;
--	pc98)
--		basic_machine=i386-pc
--		;;
--	pc98-*)
--		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
--		;;
--	pentium | p5 | k5 | k6 | nexgen | viac3)
--		basic_machine=i586-pc
--		;;
--	pentiumpro | p6 | 6x86 | athlon | athlon_*)
--		basic_machine=i686-pc
--		;;
--	pentiumii | pentium2 | pentiumiii | pentium3)
--		basic_machine=i686-pc
--		;;
--	pentium4)
--		basic_machine=i786-pc
--		;;
--	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
--		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
--		;;
--	pentiumpro-* | p6-* | 6x86-* | athlon-*)
--		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
--		;;
--	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
--		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
--		;;
--	pentium4-*)
--		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
--		;;
--	pn)
--		basic_machine=pn-gould
--		;;
--	power)	basic_machine=power-ibm
--		;;
--	ppc | ppcbe)	basic_machine=powerpc-unknown
--		;;
--	ppc-* | ppcbe-*)
--		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
--		;;
--	ppcle | powerpclittle | ppc-le | powerpc-little)
--		basic_machine=powerpcle-unknown
--		;;
--	ppcle-* | powerpclittle-*)
--		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
--		;;
--	ppc64)	basic_machine=powerpc64-unknown
--		;;
--	ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
--		;;
--	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
--		basic_machine=powerpc64le-unknown
--		;;
--	ppc64le-* | powerpc64little-*)
--		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
--		;;
--	ps2)
--		basic_machine=i386-ibm
--		;;
--	pw32)
--		basic_machine=i586-unknown
--		os=-pw32
--		;;
--	rdos | rdos64)
--		basic_machine=x86_64-pc
--		os=-rdos
--		;;
--	rdos32)
--		basic_machine=i386-pc
--		os=-rdos
--		;;
--	rom68k)
--		basic_machine=m68k-rom68k
--		os=-coff
--		;;
--	rm[46]00)
--		basic_machine=mips-siemens
--		;;
--	rtpc | rtpc-*)
--		basic_machine=romp-ibm
--		;;
--	s390 | s390-*)
--		basic_machine=s390-ibm
--		;;
--	s390x | s390x-*)
--		basic_machine=s390x-ibm
--		;;
--	sa29200)
--		basic_machine=a29k-amd
--		os=-udi
--		;;
--	sb1)
--		basic_machine=mipsisa64sb1-unknown
--		;;
--	sb1el)
--		basic_machine=mipsisa64sb1el-unknown
--		;;
--	sde)
--		basic_machine=mipsisa32-sde
--		os=-elf
--		;;
--	sei)
--		basic_machine=mips-sei
--		os=-seiux
--		;;
--	sequent)
--		basic_machine=i386-sequent
--		;;
--	sh)
--		basic_machine=sh-hitachi
--		os=-hms
--		;;
--	sh5el)
--		basic_machine=sh5le-unknown
--		;;
--	sh64)
--		basic_machine=sh64-unknown
--		;;
--	sparclite-wrs | simso-wrs)
--		basic_machine=sparclite-wrs
--		os=-vxworks
--		;;
--	sps7)
--		basic_machine=m68k-bull
--		os=-sysv2
--		;;
--	spur)
--		basic_machine=spur-unknown
--		;;
--	st2000)
--		basic_machine=m68k-tandem
--		;;
--	stratus)
--		basic_machine=i860-stratus
--		os=-sysv4
--		;;
--	strongarm-* | thumb-*)
--		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
--		;;
--	sun2)
--		basic_machine=m68000-sun
--		;;
--	sun2os3)
--		basic_machine=m68000-sun
--		os=-sunos3
--		;;
--	sun2os4)
--		basic_machine=m68000-sun
--		os=-sunos4
--		;;
--	sun3os3)
--		basic_machine=m68k-sun
--		os=-sunos3
--		;;
--	sun3os4)
--		basic_machine=m68k-sun
--		os=-sunos4
--		;;
--	sun4os3)
--		basic_machine=sparc-sun
--		os=-sunos3
--		;;
--	sun4os4)
--		basic_machine=sparc-sun
--		os=-sunos4
--		;;
--	sun4sol2)
--		basic_machine=sparc-sun
--		os=-solaris2
--		;;
--	sun3 | sun3-*)
--		basic_machine=m68k-sun
--		;;
--	sun4)
--		basic_machine=sparc-sun
--		;;
--	sun386 | sun386i | roadrunner)
--		basic_machine=i386-sun
--		;;
--	sv1)
--		basic_machine=sv1-cray
--		os=-unicos
--		;;
--	symmetry)
--		basic_machine=i386-sequent
--		os=-dynix
--		;;
--	t3e)
--		basic_machine=alphaev5-cray
--		os=-unicos
--		;;
--	t90)
--		basic_machine=t90-cray
--		os=-unicos
--		;;
--	tile*)
--		basic_machine=$basic_machine-unknown
--		os=-linux-gnu
--		;;
--	tx39)
--		basic_machine=mipstx39-unknown
--		;;
--	tx39el)
--		basic_machine=mipstx39el-unknown
--		;;
--	toad1)
--		basic_machine=pdp10-xkl
--		os=-tops20
--		;;
--	tower | tower-32)
--		basic_machine=m68k-ncr
--		;;
--	tpf)
--		basic_machine=s390x-ibm
--		os=-tpf
--		;;
--	udi29k)
--		basic_machine=a29k-amd
--		os=-udi
--		;;
--	ultra3)
--		basic_machine=a29k-nyu
--		os=-sym1
--		;;
--	v810 | necv810)
--		basic_machine=v810-nec
--		os=-none
--		;;
--	vaxv)
--		basic_machine=vax-dec
--		os=-sysv
--		;;
--	vms)
--		basic_machine=vax-dec
--		os=-vms
--		;;
--	vpp*|vx|vx-*)
--		basic_machine=f301-fujitsu
--		;;
--	vxworks960)
--		basic_machine=i960-wrs
--		os=-vxworks
--		;;
--	vxworks68)
--		basic_machine=m68k-wrs
--		os=-vxworks
--		;;
--	vxworks29k)
--		basic_machine=a29k-wrs
--		os=-vxworks
--		;;
--	w65*)
--		basic_machine=w65-wdc
--		os=-none
--		;;
--	w89k-*)
--		basic_machine=hppa1.1-winbond
--		os=-proelf
--		;;
--	xbox)
--		basic_machine=i686-pc
--		os=-mingw32
--		;;
--	xps | xps100)
--		basic_machine=xps100-honeywell
--		;;
--	xscale-* | xscalee[bl]-*)
--		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
--		;;
--	ymp)
--		basic_machine=ymp-cray
--		os=-unicos
--		;;
--	z8k-*-coff)
--		basic_machine=z8k-unknown
--		os=-sim
--		;;
--	z80-*-coff)
--		basic_machine=z80-unknown
--		os=-sim
--		;;
--	none)
--		basic_machine=none-none
--		os=-none
--		;;
--
--# Here we handle the default manufacturer of certain CPU types.  It is in
--# some cases the only manufacturer, in others, it is the most popular.
--	w89k)
--		basic_machine=hppa1.1-winbond
--		;;
--	op50n)
--		basic_machine=hppa1.1-oki
--		;;
--	op60c)
--		basic_machine=hppa1.1-oki
--		;;
--	romp)
--		basic_machine=romp-ibm
--		;;
--	mmix)
--		basic_machine=mmix-knuth
--		;;
--	rs6000)
--		basic_machine=rs6000-ibm
--		;;
--	vax)
--		basic_machine=vax-dec
--		;;
--	pdp10)
--		# there are many clones, so DEC is not a safe bet
--		basic_machine=pdp10-unknown
--		;;
--	pdp11)
--		basic_machine=pdp11-dec
--		;;
--	we32k)
--		basic_machine=we32k-att
--		;;
--	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
--		basic_machine=sh-unknown
--		;;
--	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
--		basic_machine=sparc-sun
--		;;
--	cydra)
--		basic_machine=cydra-cydrome
--		;;
--	orion)
--		basic_machine=orion-highlevel
--		;;
--	orion105)
--		basic_machine=clipper-highlevel
--		;;
--	mac | mpw | mac-mpw)
--		basic_machine=m68k-apple
--		;;
--	pmac | pmac-mpw)
--		basic_machine=powerpc-apple
--		;;
--	*-unknown)
--		# Make sure to match an already-canonicalized machine name.
--		;;
--	*)
--		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
--		exit 1
--		;;
--esac
--
--# Here we canonicalize certain aliases for manufacturers.
--case $basic_machine in
--	*-digital*)
--		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
--		;;
--	*-commodore*)
--		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
--		;;
--	*)
--		;;
--esac
--
--# Decode manufacturer-specific aliases for certain operating systems.
--
--if [ x"$os" != x"" ]
--then
--case $os in
--	# First match some system type aliases
--	# that might get confused with valid system types.
--	# -solaris* is a basic system type, with this one exception.
--	-auroraux)
--		os=-auroraux
--		;;
--	-solaris1 | -solaris1.*)
--		os=`echo $os | sed -e 's|solaris1|sunos4|'`
--		;;
--	-solaris)
--		os=-solaris2
--		;;
--	-svr4*)
--		os=-sysv4
--		;;
--	-unixware*)
--		os=-sysv4.2uw
--		;;
--	-gnu/linux*)
--		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
--		;;
--	# First accept the basic system types.
--	# The portable systems comes first.
--	# Each alternative MUST END IN A *, to match a version number.
--	# -sysv* is not here because it comes later, after sysvr4.
--	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
--	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
--	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
--	      | -sym* | -kopensolaris* | -plan9* \
--	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
--	      | -aos* | -aros* \
--	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
--	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
--	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
--	      | -bitrig* | -openbsd* | -solidbsd* \
--	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
--	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
--	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
--	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
--	      | -chorusos* | -chorusrdb* | -cegcc* \
--	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
--	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
--	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
--	      | -uxpv* | -beos* | -mpeix* | -udk* \
--	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
--	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
--	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
--	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
--	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
--	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
--	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
--	# Remember, each alternative MUST END IN *, to match a version number.
--		;;
--	-qnx*)
--		case $basic_machine in
--		    x86-* | i*86-*)
--			;;
--		    *)
--			os=-nto$os
--			;;
--		esac
--		;;
--	-nto-qnx*)
--		;;
--	-nto*)
--		os=`echo $os | sed -e 's|nto|nto-qnx|'`
--		;;
--	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
--	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
--	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
--		;;
--	-mac*)
--		os=`echo $os | sed -e 's|mac|macos|'`
--		;;
--	-linux-dietlibc)
--		os=-linux-dietlibc
--		;;
--	-linux*)
--		os=`echo $os | sed -e 's|linux|linux-gnu|'`
--		;;
--	-sunos5*)
--		os=`echo $os | sed -e 's|sunos5|solaris2|'`
--		;;
--	-sunos6*)
--		os=`echo $os | sed -e 's|sunos6|solaris3|'`
--		;;
--	-opened*)
--		os=-openedition
--		;;
--	-os400*)
--		os=-os400
--		;;
--	-wince*)
--		os=-wince
--		;;
--	-osfrose*)
--		os=-osfrose
--		;;
--	-osf*)
--		os=-osf
--		;;
--	-utek*)
--		os=-bsd
--		;;
--	-dynix*)
--		os=-bsd
--		;;
--	-acis*)
--		os=-aos
--		;;
--	-atheos*)
--		os=-atheos
--		;;
--	-syllable*)
--		os=-syllable
--		;;
--	-386bsd)
--		os=-bsd
--		;;
--	-ctix* | -uts*)
--		os=-sysv
--		;;
--	-nova*)
--		os=-rtmk-nova
--		;;
--	-ns2 )
--		os=-nextstep2
--		;;
--	-nsk*)
--		os=-nsk
--		;;
--	# Preserve the version number of sinix5.
--	-sinix5.*)
--		os=`echo $os | sed -e 's|sinix|sysv|'`
--		;;
--	-sinix*)
--		os=-sysv4
--		;;
--	-tpf*)
--		os=-tpf
--		;;
--	-triton*)
--		os=-sysv3
--		;;
--	-oss*)
--		os=-sysv3
--		;;
--	-svr4)
--		os=-sysv4
--		;;
--	-svr3)
--		os=-sysv3
--		;;
--	-sysvr4)
--		os=-sysv4
--		;;
--	# This must come after -sysvr4.
--	-sysv*)
--		;;
--	-ose*)
--		os=-ose
--		;;
--	-es1800*)
--		os=-ose
--		;;
--	-xenix)
--		os=-xenix
--		;;
--	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
--		os=-mint
--		;;
--	-aros*)
--		os=-aros
--		;;
--	-zvmoe)
--		os=-zvmoe
--		;;
--	-dicos*)
--		os=-dicos
--		;;
--	-nacl*)
--		;;
--	-none)
--		;;
--	*)
--		# Get rid of the `-' at the beginning of $os.
--		os=`echo $os | sed 's/[^-]*-//'`
--		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
--		exit 1
--		;;
--esac
--else
--
--# Here we handle the default operating systems that come with various machines.
--# The value should be what the vendor currently ships out the door with their
--# machine or put another way, the most popular os provided with the machine.
--
--# Note that if you're going to try to match "-MANUFACTURER" here (say,
--# "-sun"), then you have to tell the case statement up towards the top
--# that MANUFACTURER isn't an operating system.  Otherwise, code above
--# will signal an error saying that MANUFACTURER isn't an operating
--# system, and we'll never get to this point.
--
--case $basic_machine in
--	score-*)
--		os=-elf
--		;;
--	spu-*)
--		os=-elf
--		;;
--	*-acorn)
--		os=-riscix1.2
--		;;
--	arm*-rebel)
--		os=-linux
--		;;
--	arm*-semi)
--		os=-aout
--		;;
--	c4x-* | tic4x-*)
--		os=-coff
--		;;
--	hexagon-*)
--		os=-elf
--		;;
--	tic54x-*)
--		os=-coff
--		;;
--	tic55x-*)
--		os=-coff
--		;;
--	tic6x-*)
--		os=-coff
--		;;
--	# This must come before the *-dec entry.
--	pdp10-*)
--		os=-tops20
--		;;
--	pdp11-*)
--		os=-none
--		;;
--	*-dec | vax-*)
--		os=-ultrix4.2
--		;;
--	m68*-apollo)
--		os=-domain
--		;;
--	i386-sun)
--		os=-sunos4.0.2
--		;;
--	m68000-sun)
--		os=-sunos3
--		;;
--	m68*-cisco)
--		os=-aout
--		;;
--	mep-*)
--		os=-elf
--		;;
--	mips*-cisco)
--		os=-elf
--		;;
--	mips*-*)
--		os=-elf
--		;;
--	or1k-*)
--		os=-elf
--		;;
--	or32-*)
--		os=-coff
--		;;
--	*-tti)	# must be before sparc entry or we get the wrong os.
--		os=-sysv3
--		;;
--	sparc-* | *-sun)
--		os=-sunos4.1.1
--		;;
--	*-be)
--		os=-beos
--		;;
--	*-haiku)
--		os=-haiku
--		;;
--	*-ibm)
--		os=-aix
--		;;
--	*-knuth)
--		os=-mmixware
--		;;
--	*-wec)
--		os=-proelf
--		;;
--	*-winbond)
--		os=-proelf
--		;;
--	*-oki)
--		os=-proelf
--		;;
--	*-hp)
--		os=-hpux
--		;;
--	*-hitachi)
--		os=-hiux
--		;;
--	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
--		os=-sysv
--		;;
--	*-cbm)
--		os=-amigaos
--		;;
--	*-dg)
--		os=-dgux
--		;;
--	*-dolphin)
--		os=-sysv3
--		;;
--	m68k-ccur)
--		os=-rtu
--		;;
--	m88k-omron*)
--		os=-luna
--		;;
--	*-next )
--		os=-nextstep
--		;;
--	*-sequent)
--		os=-ptx
--		;;
--	*-crds)
--		os=-unos
--		;;
--	*-ns)
--		os=-genix
--		;;
--	i370-*)
--		os=-mvs
--		;;
--	*-next)
--		os=-nextstep3
--		;;
--	*-gould)
--		os=-sysv
--		;;
--	*-highlevel)
--		os=-bsd
--		;;
--	*-encore)
--		os=-bsd
--		;;
--	*-sgi)
--		os=-irix
--		;;
--	*-siemens)
--		os=-sysv4
--		;;
--	*-masscomp)
--		os=-rtu
--		;;
--	f30[01]-fujitsu | f700-fujitsu)
--		os=-uxpv
--		;;
--	*-rom68k)
--		os=-coff
--		;;
--	*-*bug)
--		os=-coff
--		;;
--	*-apple)
--		os=-macos
--		;;
--	*-atari*)
--		os=-mint
--		;;
--	*)
--		os=-none
--		;;
--esac
--fi
--
--# Here we handle the case where we know the os, and the CPU type, but not the
--# manufacturer.  We pick the logical manufacturer.
--vendor=unknown
--case $basic_machine in
--	*-unknown)
--		case $os in
--			-riscix*)
--				vendor=acorn
--				;;
--			-sunos*)
--				vendor=sun
--				;;
--			-cnk*|-aix*)
--				vendor=ibm
--				;;
--			-beos*)
--				vendor=be
--				;;
--			-hpux*)
--				vendor=hp
--				;;
--			-mpeix*)
--				vendor=hp
--				;;
--			-hiux*)
--				vendor=hitachi
--				;;
--			-unos*)
--				vendor=crds
--				;;
--			-dgux*)
--				vendor=dg
--				;;
--			-luna*)
--				vendor=omron
--				;;
--			-genix*)
--				vendor=ns
--				;;
--			-mvs* | -opened*)
--				vendor=ibm
--				;;
--			-os400*)
--				vendor=ibm
--				;;
--			-ptx*)
--				vendor=sequent
--				;;
--			-tpf*)
--				vendor=ibm
--				;;
--			-vxsim* | -vxworks* | -windiss*)
--				vendor=wrs
--				;;
--			-aux*)
--				vendor=apple
--				;;
--			-hms*)
--				vendor=hitachi
--				;;
--			-mpw* | -macos*)
--				vendor=apple
--				;;
--			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
--				vendor=atari
--				;;
--			-vos*)
--				vendor=stratus
--				;;
--		esac
--		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
--		;;
--esac
--
--echo $basic_machine$os
--exit
--
--# Local variables:
--# eval: (add-hook 'write-file-hooks 'time-stamp)
--# time-stamp-start: "timestamp='"
--# time-stamp-format: "%:y-%02m-%02d"
--# time-stamp-end: "'"
--# End:
-+echo arm-linux-androideabi
diff --git a/recipes/python2/patches/fix-configure-darwin.patch b/recipes/python2/patches/fix-configure-darwin.patch
deleted file mode 100644
index 93a1fe3..0000000
--- a/recipes/python2/patches/fix-configure-darwin.patch
+++ /dev/null
@@ -1,40 +0,0 @@
---- Python-2.7.2.orig/configure	2012-07-09 23:48:02.000000000 +0200
-+++ Python-2.7.2/configure	2012-07-09 23:47:34.000000000 +0200
-@@ -4927,7 +4927,7 @@
- 	  RUNSHARED=LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}
- 	  INSTSONAME="$LDLIBRARY".$SOVERSION
-           ;;
--    Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*)
-+    Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|Darwin*)
- 	  LDLIBRARY='libpython$(VERSION).so'
- 	  BLDLIBRARY='-L. -lpython$(VERSION)'
- 	  RUNSHARED=LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}
-@@ -4960,7 +4960,7 @@
- 	  BLDLIBRARY='-L. -lpython$(VERSION)'
- 	  RUNSHARED=DLL_PATH=`pwd`:${DLL_PATH:-/atheos/sys/libs:/atheos/autolnk/lib}
- 	  ;;
--    Darwin*)
-+    DDarwin*)
-     	LDLIBRARY='libpython$(VERSION).dylib'
- 	BLDLIBRARY='-L. -lpython$(VERSION)'
- 	RUNSHARED='DYLD_LIBRARY_PATH=`pwd`:${DYLD_LIBRARY_PATH}'
-@@ -7625,6 +7625,9 @@
- 			LDSHARED='ld -b'
- 		fi ;;
- 	OSF*) LDSHARED="ld -shared -expect_unresolved \"*\"";;
-+	Darwin*|Linux*|GNU*|QNX*)
-+		LDSHARED='$(CC) -shared'
-+		LDCXXSHARED='$(CXX) -shared';;
- 	Darwin/1.3*)
- 		LDSHARED='$(CC) -bundle'
- 		LDCXXSHARED='$(CXX) -bundle'
-@@ -7680,9 +7683,6 @@
- 			fi
- 		fi
- 		;;
--	Linux*|GNU*|QNX*)
--		LDSHARED='$(CC) -shared'
--		LDCXXSHARED='$(CXX) -shared';;
- 	BSD/OS*/4*)
- 		LDSHARED="gcc -shared"
- 		LDCXXSHARED="g++ -shared";;
diff --git a/recipes/python2/patches/fix-distutils-darwin.patch b/recipes/python2/patches/fix-distutils-darwin.patch
deleted file mode 100644
index 4083634..0000000
--- a/recipes/python2/patches/fix-distutils-darwin.patch
+++ /dev/null
@@ -1,24 +0,0 @@
---- Python-2.7.2.orig/Lib/distutils/command/build_ext.py	2011-06-11 17:46:24.000000000 +0200
-+++ Python-2.7.2/Lib/distutils/command/build_ext.py	2012-08-01 18:32:13.000000000 +0200
-@@ -236,7 +236,7 @@
-         # Python's library directory must be appended to library_dirs
-         sysconfig.get_config_var('Py_ENABLE_SHARED')
-         if ((sys.platform.startswith('linux') or sys.platform.startswith('gnu')
--             or sys.platform.startswith('sunos'))
-+             or sys.platform.startswith('sunos') or sys.platform.startswith('darwin'))
-             and sysconfig.get_config_var('Py_ENABLE_SHARED')):
-             if sys.executable.startswith(os.path.join(sys.exec_prefix, "bin")):
-                 # building third party extensions
-@@ -750,9 +750,9 @@
-             # extensions, it is a reference to the original list
-             return ext.libraries + [pythonlib, "m"] + extra
- 
--        elif sys.platform == 'darwin':
--            # Don't use the default code below
--            return ext.libraries
-+        #elif sys.platform == 'darwin':
-+        #    # Don't use the default code below
-+        #    return ext.libraries
-         elif sys.platform[:3] == 'aix':
-             # Don't use the default code below
-             return ext.libraries
diff --git a/recipes/python2/patches/fix-dlfcn.patch b/recipes/python2/patches/fix-dlfcn.patch
deleted file mode 100644
index 7a685ca..0000000
--- a/recipes/python2/patches/fix-dlfcn.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-diff -Naur Python-2.7.2.orig/Lib/plat-linux2/DLFCN.py Python-2.7.2/Lib/plat-linux2/DLFCN.py
---- Python-2.7.2.orig/Lib/plat-linux2/DLFCN.py	2011-06-11 17:46:24.000000000 +0200
-+++ Python-2.7.2/Lib/plat-linux2/DLFCN.py	2013-07-29 16:34:45.318131844 +0200
-@@ -74,10 +74,17 @@
- # Included from gnu/stubs.h
- 
- # Included from bits/dlfcn.h
-+# PATCHED FOR ANDROID (the only supported symbols are):
-+# enum {
-+#  RTLD_NOW  = 0,
-+#  RTLD_LAZY = 1,
-+#  RTLD_LOCAL  = 0,
-+#  RTLD_GLOBAL = 2,
-+# };
- RTLD_LAZY = 0x00001
--RTLD_NOW = 0x00002
--RTLD_BINDING_MASK = 0x3
--RTLD_NOLOAD = 0x00004
--RTLD_GLOBAL = 0x00100
-+RTLD_NOW = 0x00000
-+RTLD_BINDING_MASK = 0x0
-+RTLD_NOLOAD = 0x00000
-+RTLD_GLOBAL = 0x00002
- RTLD_LOCAL = 0
--RTLD_NODELETE = 0x01000
-+RTLD_NODELETE = 0x00000
diff --git a/recipes/python2/patches/fix-dynamic-lookup.patch b/recipes/python2/patches/fix-dynamic-lookup.patch
deleted file mode 100644
index cd88fb1..0000000
--- a/recipes/python2/patches/fix-dynamic-lookup.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- Python-2.7.13/Makefile.pre.in	2016-12-17 21:05:06.000000000 +0100
-+++ Python-2.7.13/Makefile.pre.in.dyn	2017-08-10 22:09:59.311219406 +0100
-@@ -568,7 +568,7 @@
- 	fi
- 
- libpython$(VERSION).dylib: $(LIBRARY_OBJS)
--	 $(CC) -dynamiclib -Wl,-single_module $(LDFLAGS) -undefined dynamic_lookup -Wl,-install_name,$(prefix)/lib/libpython$(VERSION).dylib -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
-+	 $(CC) -dynamiclib -Wl,-single_module $(LDFLAGS) -Wl,-install_name,$(prefix)/lib/libpython$(VERSION).dylib -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
- 
- 
- libpython$(VERSION).sl: $(LIBRARY_OBJS)
diff --git a/recipes/python2/patches/fix-filesystemdefaultencoding.patch b/recipes/python2/patches/fix-filesystemdefaultencoding.patch
deleted file mode 100644
index cacd72c..0000000
--- a/recipes/python2/patches/fix-filesystemdefaultencoding.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- Python-2.7.13/Python/bltinmodule.c	2016-12-17 21:05:07.000000000 +0100
-+++ Python-2.7.13-modified/Python/bltinmodule.c	2017-08-10 22:14:26.490843018 +0100
-@@ -22,7 +22,7 @@
- #elif defined(__APPLE__)
- const char *Py_FileSystemDefaultEncoding = "utf-8";
- #else
--const char *Py_FileSystemDefaultEncoding = NULL; /* use default */
-+const char *Py_FileSystemDefaultEncoding = "utf-8"; /* use default */
- #endif
- 
- /* Forward */
diff --git a/recipes/python2/patches/fix-gethostbyaddr.patch b/recipes/python2/patches/fix-gethostbyaddr.patch
deleted file mode 100644
index 7b04250..0000000
--- a/recipes/python2/patches/fix-gethostbyaddr.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- Python-2.7.2/Modules/socketmodule.c.orig	2012-01-06 01:40:09.915694810 +0100
-+++ Python-2.7.2/Modules/socketmodule.c	2012-01-06 01:40:36.967694486 +0100
-@@ -146,6 +146,9 @@
-    On the other hand, not all Linux versions agree, so there the settings
-    computed by the configure script are needed! */
- 
-+/* Android hack, same reason are what is described above */
-+#undef HAVE_GETHOSTBYNAME_R
-+
- #ifndef linux
- # undef HAVE_GETHOSTBYNAME_R_3_ARG
- # undef HAVE_GETHOSTBYNAME_R_5_ARG
diff --git a/recipes/python2/patches/fix-locale-2.7.13.patch b/recipes/python2/patches/fix-locale-2.7.13.patch
deleted file mode 100644
index 4ae273b..0000000
--- a/recipes/python2/patches/fix-locale-2.7.13.patch
+++ /dev/null
@@ -1,77 +0,0 @@
---- Python-2.7.9.orig/Modules/posixmodule.c	2010-11-26 18:35:50.000000000 +0100
-+++ Python-2.7.9/Modules/posixmodule.c	2011-04-20 17:52:12.000000000 +0200
-@@ -3775,13 +3775,6 @@
-     slave_fd = open(slave_name, O_RDWR | O_NOCTTY); /* open slave */
-     if (slave_fd < 0)
-         return posix_error();
--#if !defined(__CYGWIN__) && !defined(HAVE_DEV_PTC)
--    ioctl(slave_fd, I_PUSH, "ptem"); /* push ptem */
--    ioctl(slave_fd, I_PUSH, "ldterm"); /* push ldterm */
--#ifndef __hpux
--    ioctl(slave_fd, I_PUSH, "ttcompat"); /* push ttcompat */
--#endif /* __hpux */
--#endif /* HAVE_CYGWIN */
- #endif /* HAVE_OPENPTY */
- 
-     return Py_BuildValue("(ii)", master_fd, slave_fd);
---- Python-2.7.9.orig/Objects/stringlib/formatter.h	2010-08-01 12:45:15.000000000 +0200
-+++ Python-2.7.9/Objects/stringlib/formatter.h	2011-04-20 17:52:12.000000000 +0200
-@@ -639,13 +639,7 @@
- get_locale_info(int type, LocaleInfo *locale_info)
- {
-     switch (type) {
--    case LT_CURRENT_LOCALE: {
--        struct lconv *locale_data = localeconv();
--        locale_info->decimal_point = locale_data->decimal_point;
--        locale_info->thousands_sep = locale_data->thousands_sep;
--        locale_info->grouping = locale_data->grouping;
--        break;
--    }
-+    case LT_CURRENT_LOCALE:
-     case LT_DEFAULT_LOCALE:
-         locale_info->decimal_point = ".";
-         locale_info->thousands_sep = ",";
---- Python-2.7.9.orig/Objects/stringlib/localeutil.h	2009-04-22 15:29:05.000000000 +0200
-+++ Python-2.7.9/Objects/stringlib/localeutil.h	2011-04-20 17:52:12.000000000 +0200
-@@ -202,9 +202,8 @@
-                                   Py_ssize_t n_digits,
-                                   Py_ssize_t min_width)
- {
--        struct lconv *locale_data = localeconv();
--        const char *grouping = locale_data->grouping;
--        const char *thousands_sep = locale_data->thousands_sep;
-+        const char *grouping = "\3\0";
-+        const char *thousands_sep = ",";
- 
-         return _Py_InsertThousandsGrouping(buffer, n_buffer, digits, n_digits,
-                                            min_width, grouping, thousands_sep);
---- Python-2.7.9.orig/Python/pystrtod.c	2010-05-09 16:46:46.000000000 +0200
-+++ Python-2.7.9/Python/pystrtod.c	2011-04-20 17:52:12.000000000 +0200
-@@ -126,7 +126,6 @@
- {
-     char *fail_pos;
-     double val = -1.0;
--    struct lconv *locale_data;
-     const char *decimal_point;
-     size_t decimal_point_len;
-     const char *p, *decimal_point_pos;
-@@ -138,8 +137,7 @@
- 
-     fail_pos = NULL;
- 
--    locale_data = localeconv();
--    decimal_point = locale_data->decimal_point;
-+    decimal_point = ".";
-     decimal_point_len = strlen(decimal_point);
- 
-     assert(decimal_point_len != 0);
-@@ -375,8 +373,7 @@
- Py_LOCAL_INLINE(void)
- change_decimal_from_locale_to_dot(char* buffer)
- {
--    struct lconv *locale_data = localeconv();
--    const char *decimal_point = locale_data->decimal_point;
-+    const char *decimal_point = ".";
- 
-     if (decimal_point[0] != '.' || decimal_point[1] != 0) {
-         size_t decimal_point_len = strlen(decimal_point);
diff --git a/recipes/python2/patches/fix-platform-2.7.13.patch b/recipes/python2/patches/fix-platform-2.7.13.patch
deleted file mode 100644
index d0093c6..0000000
--- a/recipes/python2/patches/fix-platform-2.7.13.patch
+++ /dev/null
@@ -1,32 +0,0 @@
---- Python-2.7.9/Python/getplatform.c.orig	2014-12-10 16:59:59.000000000 +0100
-+++ Python-2.7.9/Python/getplatform.c	2015-05-03 19:17:58.071596232 +0200
-@@ -1,12 +1,25 @@
- 
- #include "Python.h"
- 
--#ifndef PLATFORM
--#define PLATFORM "unknown"
--#endif
-+#include <sys/utsname.h>
-+#include <string.h>
- 
- const char *
- Py_GetPlatform(void)
- {
--	return PLATFORM;
-+	struct utsname u;
-+	int i;
-+	if ( uname(&u) < 0 )
-+	return "unknown";
-+
-+	char xx[37];
-+	memset(xx, 0, 37);
-+	strcat (xx, u.sysname);
-+	strcat (xx, "-");
-+	strcat (xx, u.machine);
-+
-+	for (i=0; xx[i]; i++)
-+	xx[i]=tolower(xx[i]);
-+
-+	return xx;
- }
diff --git a/recipes/python2/patches/fix-platform-processor.patch b/recipes/python2/patches/fix-platform-processor.patch
deleted file mode 100644
index 33b8f89..0000000
--- a/recipes/python2/patches/fix-platform-processor.patch
+++ /dev/null
@@ -1,22 +0,0 @@
---- Python-2.7.13/Lib/platform.py	2016-12-17 21:05:06.000000000 +0100
-+++ Python-2.7.13-modified/Lib/platform.py	2017-08-13 00:46:39.161864994 +0100
-@@ -1311,7 +1311,18 @@
-         e.g.  NetBSD does this.
- 
-     """
--    return uname()[5]
-+    # Attempt to obtain the processor name from /proc/cpuinfo on Android
-+    processor_name = uname()[5]
-+    if (processor_name.strip() == ""):
-+        cpuinfo = '/proc/cpuinfo'
-+        if (os.path.exists(cpuinfo)):
-+            lines = tuple(open(cpuinfo, 'r'))
-+            for line in lines:
-+                if (line.startswith('model name') and line.index(':') > -1):
-+                    processor_name = line[line.index(':') + 1:].strip()
-+                    break
-+
-+    return processor_name
- 
- ### Various APIs for extracting information from sys.version
- 
diff --git a/recipes/python2/patches/fix-pwdmodule.patch b/recipes/python2/patches/fix-pwdmodule.patch
deleted file mode 100644
index 5a89020..0000000
--- a/recipes/python2/patches/fix-pwdmodule.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- Python-2.7.13/Modules/pwdmodule.c	2016-12-17 21:05:07.000000000 +0100
-+++ Python-2.7.13-modified/Modules/pwdmodule.c	2017-08-10 13:55:19.603089081 +0100
-@@ -75,7 +75,7 @@
- #endif
-     PyStructSequence_SET_ITEM(v, setIndex++, _PyInt_FromUid(p->pw_uid));
-     PyStructSequence_SET_ITEM(v, setIndex++, _PyInt_FromGid(p->pw_gid));
--#ifdef __VMS
-+#if defined(__VMS) || defined(ANDROID)
-     SETS(setIndex++, "");
- #else
-     SETS(setIndex++, p->pw_gecos);
\ No newline at end of file
diff --git a/recipes/python2/patches/fix-termios.patch b/recipes/python2/patches/fix-termios.patch
deleted file mode 100644
index a114e27..0000000
--- a/recipes/python2/patches/fix-termios.patch
+++ /dev/null
@@ -1,29 +0,0 @@
---- Python-2.7.2.orig/Modules/termios.c	2012-06-12 02:49:39.780162534 +0200
-+++ Python-2.7.2/Modules/termios.c	2012-06-12 02:51:52.092157828 +0200
-@@ -227,6 +227,7 @@
-     return Py_None;
- }
- 
-+#if 0 // No tcdrain defined for Android.
- PyDoc_STRVAR(termios_tcdrain__doc__,
- "tcdrain(fd) -> None\n\
- \n\
-@@ -246,6 +247,7 @@
-     Py_INCREF(Py_None);
-     return Py_None;
- }
-+#endif
- 
- PyDoc_STRVAR(termios_tcflush__doc__,
- "tcflush(fd, queue) -> None\n\
-@@ -301,8 +303,10 @@
-      METH_VARARGS, termios_tcsetattr__doc__},
-     {"tcsendbreak", termios_tcsendbreak,
-      METH_VARARGS, termios_tcsendbreak__doc__},
-+#if 0 // No tcdrain defined for Android.
-     {"tcdrain", termios_tcdrain,
-      METH_VARARGS, termios_tcdrain__doc__},
-+#endif
-     {"tcflush", termios_tcflush,
-      METH_VARARGS, termios_tcflush__doc__},
-     {"tcflow", termios_tcflow,
diff --git a/recipes/python2/patches/modules-locales-2.7.13.patch b/recipes/python2/patches/modules-locales-2.7.13.patch
deleted file mode 100644
index b3f1d00..0000000
--- a/recipes/python2/patches/modules-locales-2.7.13.patch
+++ /dev/null
@@ -1,27 +0,0 @@
---- Python-2.7.9/Modules/_localemodule.c.orig	2013-05-12 05:32:50.000000000 +0200
-+++ Python-2.7.9/Modules/_localemodule.c	2015-05-02 21:33:42.241092717 +0200
-@@ -20,6 +20,8 @@ This software comes with no warranty. Us
- #include <errno.h>
- #endif
- 
-+#define ANDROID
-+
- #ifdef HAVE_LANGINFO_H
- #include <langinfo.h>
- #endif
-@@ -205,6 +207,7 @@ PyDoc_STRVAR(localeconv__doc__,
- static PyObject*
- PyLocale_localeconv(PyObject* self)
- {
-+    #ifndef ANDROID
-     PyObject* result;
-     struct lconv *l;
-     PyObject *x;
-@@ -265,6 +268,7 @@ PyLocale_localeconv(PyObject* self)
-   failed:
-     Py_XDECREF(result);
-     Py_XDECREF(x);
-+    #endif // ANDROID
-     return NULL;
- }
- 
diff --git a/recipes/python3crystax/__init__.py b/recipes/python3crystax/__init__.py
new file mode 100644
index 0000000..9cc6814
--- /dev/null
+++ b/recipes/python3crystax/__init__.py
@@ -0,0 +1,258 @@
+from pythonforandroid.recipe import TargetPythonRecipe
+from pythonforandroid.toolchain import shprint, current_directory, ArchARM
+from pythonforandroid.logger import info, error
+from pythonforandroid.util import ensure_dir, temp_directory
+from os.path import exists, join
+import os
+import glob
+import sh
+from sh import Command
+
+# This is the content of opensslconf.h taken from
+# ndkdir/build/tools/build-target-openssl.sh
+OPENSSLCONF = """#if defined(__ARM_ARCH_5TE__)
+#include "opensslconf_armeabi.h"
+#elif defined(__ARM_ARCH_7A__) && !defined(__ARM_PCS_VFP)
+#include "opensslconf_armeabi_v7a.h"
+#elif defined(__ARM_ARCH_7A__) && defined(__ARM_PCS_VFP)
+#include "opensslconf_armeabi_v7a_hard.h"
+#elif defined(__aarch64__)
+#include "opensslconf_arm64_v8a.h"
+#elif defined(__i386__)
+#include "opensslconf_x86.h"
+#elif defined(__x86_64__)
+#include "opensslconf_x86_64.h"
+#elif defined(__mips__) && !defined(__mips64)
+#include "opensslconf_mips.h"
+#elif defined(__mips__) && defined(__mips64)
+#include "opensslconf_mips64.h"
+#else
+#error "Unsupported ABI"
+#endif
+"""
+LATEST_FULL_VERSION = {
+    '3.5': '3.5.1',
+    '3.6': '3.6.6',
+    '3.7': '3.7.0'
+}
+
+def realpath(fname):
+    """
+    Own implementation of os.realpath which may be broken in some python versions
+    Returns: the absolute path o
+
+    """
+
+    if not os.path.islink(fname):
+        return os.path.abspath(fname)
+
+    abs_path = os.path.abspath(fname).split(os.sep)[:-1]
+    rel_path = os.readlink(fname)
+
+    if os.path.abspath(rel_path) == rel_path:
+        return rel_path
+
+    rel_path = rel_path.split(os.sep)
+    for folder in rel_path:
+        if folder == '..':
+            abs_path.pop()
+        else:
+            abs_path.append(folder)
+    return os.sep.join(abs_path)
+
+class Python3Recipe(TargetPythonRecipe):
+    version = '3.6'
+    url = ''
+    name = 'python3crystax'
+
+    depends = ['hostpython3crystax']
+    conflicts = ['python2', 'python3']
+
+    from_crystax = True
+
+    def download_if_necessary(self):
+        if 'openssl' in self.ctx.recipe_build_order or self.version == '3.6':
+            full_version = LATEST_FULL_VERSION[self.version]
+            Python3Recipe.url = 'https://www.python.org/ftp/python/{0}.{1}.{2}/Python-{0}.{1}.{2}.tgz'.format(*full_version.split('.'))
+            super(Python3Recipe, self).download_if_necessary()
+
+    def get_dir_name(self):
+        name = super(Python3Recipe, self).get_dir_name()
+        name += '-version{}'.format(self.version)
+        return name
+
+    def copy_include_dir(self, source, target):
+        ensure_dir(target)
+        for fname in os.listdir(source):
+            sh.ln('-sf', realpath(join(source, fname)), join(target, fname))
+
+    def _patch_dev_defaults(self, fp, target_ver):
+        for line in fp:
+            if 'OPENSSL_VERSIONS=' in line:
+                versions = line.split('"')[1].split(' ')
+                if versions[0] == target_ver:
+                    raise ValueError('Patch not needed')
+
+                if target_ver in versions:
+                    versions.remove(target_ver)
+
+                versions.insert(0, target_ver)
+
+                yield 'OPENSSL_VERSIONS="{}"\n'.format(' '.join(versions))
+            else:
+                yield line
+
+    def patch_dev_defaults(self, ssl_recipe):
+        def_fname = join(self.ctx.ndk_dir, 'build', 'tools', 'dev-defaults.sh')
+        try:
+            with open(def_fname, 'r') as fp:
+                s = ''.join(self._patch_dev_defaults(fp,
+                                                       str(ssl_recipe.version)))
+            with open(def_fname, 'w') as fp:
+                fp.write(s)
+
+        except ValueError:
+            pass
+
+    def check_for_sslso(self, ssl_recipe, arch):
+        # type: (Recipe, str)
+        dynlib_dir = join(self.ctx.ndk_dir, 'sources', 'python', self.version,
+                          'libs', arch.arch, 'modules')
+
+        if os.path.exists(join(dynlib_dir, '_ssl.so')):
+            return 10, 'Shared object exists in ndk'
+
+        # find out why _ssl.so is missing
+
+        source_dir = join(self.ctx.ndk_dir, 'sources', 'openssl', ssl_recipe.version)
+        if not os.path.exists(source_dir):
+            return 0, 'Openssl version not present'
+
+        # these two path checks are lifted straight from:
+        # crystax-ndk/build/tools/build-target-python.sh
+        if not os.path.exists(join(source_dir, 'Android.mk')):
+            return 1.1, 'Android.mk is missing in openssl source'
+
+        include_dir = join(source_dir, 'include','openssl')
+        if not os.path.exists(join(include_dir,  'opensslconf.h')):
+            return 1.2, 'Openssl include dir missing'
+
+        under_scored_arch = arch.arch.replace('-', '_')
+        if not os.path.lexists(join(include_dir,
+                                   'opensslconf_{}.h'.format(under_scored_arch))):
+            return 1.3, 'Opensslconf arch header missing from include'
+
+
+
+        # lastly a check to see whether shared objects for the correct arch
+        # is present in the ndk
+        if not os.path.exists(join(source_dir, 'libs', arch.arch)):
+                return 2, 'Openssl libs for this arch is missing in ndk'
+
+        return 5, 'Ready to recompile python'
+
+    def find_Android_mk(self):
+        openssl_dir = join(self.ctx.ndk_dir, 'sources', 'openssl')
+        for version in os.listdir(openssl_dir):
+            mk_path = join(openssl_dir, version, 'Android.mk')
+            if os.path.exists(mk_path):
+                return mk_path
+
+    def prebuild_arch(self, arch):
+        super(Python3Recipe, self).prebuild_arch(arch)
+        if self.version == '3.6':
+            Python3Recipe.patches = ['patch_python3.6.patch']
+            build_dir = self.get_build_dir(arch.arch)
+            shprint(sh.ln, '-sf',
+                           realpath(join(build_dir, 'Lib/site-packages/README.txt')),
+                           join(build_dir, 'Lib/site-packages/README'))
+            python_build_files = ['android.mk', 'config.c', 'interpreter.c']
+            ndk_build_tools_python_dir = join(self.ctx.ndk_dir, 'build', 'tools', 'build-target-python')
+            for python_build_file in python_build_files:
+                shprint(sh.cp, join(ndk_build_tools_python_dir, python_build_file+'.3.5'),
+                               join(ndk_build_tools_python_dir, python_build_file+'.3.6'))
+            ndk_sources_python_dir = join(self.ctx.ndk_dir, 'sources', 'python')
+            if not os.path.exists(join(ndk_sources_python_dir, '3.6')):
+                os.mkdir(join(ndk_sources_python_dir, '3.6'))
+            sh.sed('s#3.5#3.6#',
+                   join(ndk_sources_python_dir, '3.5/Android.mk'),
+                   _out=join(ndk_sources_python_dir, '3.6/Android.mk'))
+
+    def build_arch(self, arch):
+       # If openssl is needed we may have to recompile cPython to get the
+        # ssl.py module working properly
+        if self.from_crystax and 'openssl' in self.ctx.recipe_build_order:
+            info('Openssl and crystax-python combination may require '
+                 'recompilation of python...')
+            ssl_recipe = self.get_recipe('openssl', self.ctx)
+            stage, msg = self.check_for_sslso(ssl_recipe, arch)
+            stage = 0 if stage < 5 else stage
+            info(msg)
+            openssl_build_dir = ssl_recipe.get_build_dir(arch.arch)
+            openssl_ndk_dir = join(self.ctx.ndk_dir, 'sources', 'openssl',
+                                   ssl_recipe.version)
+
+            if stage < 2:
+                info('Copying openssl headers and Android.mk to ndk')
+                ensure_dir(openssl_ndk_dir)
+                if stage < 1.2:
+                    # copy include folder and Android.mk to ndk
+                    mk_path = self.find_Android_mk()
+                    if mk_path is None:
+                        raise IOError('Android.mk file could not be found in '
+                                      'any versions in ndk->sources->openssl')
+                    shprint(sh.cp, mk_path, openssl_ndk_dir)
+
+                include_dir = join(openssl_build_dir, 'include')
+                if stage < 1.3:
+                    ndk_include_dir = join(openssl_ndk_dir, 'include', 'openssl')
+                    self.copy_include_dir(join(include_dir, 'openssl'), ndk_include_dir)
+
+                    target_conf = join(openssl_ndk_dir, 'include', 'openssl',
+                                   'opensslconf.h')
+                    shprint(sh.rm, '-f', target_conf)
+                    # overwrite opensslconf.h
+                    with open(target_conf, 'w') as fp:
+                        fp.write(OPENSSLCONF)
+
+                if stage < 1.4:
+                    # move current conf to arch specific conf in ndk
+                    under_scored_arch = arch.arch.replace('-', '_')
+                    shprint(sh.ln, '-sf',
+                            realpath(join(include_dir, 'openssl', 'opensslconf.h')),
+                            join(openssl_ndk_dir, 'include', 'openssl',
+                                 'opensslconf_{}.h'.format(under_scored_arch))
+                            )
+
+            if stage < 3:
+                info('Copying openssl libs to ndk')
+                arch_ndk_lib = join(openssl_ndk_dir, 'libs', arch.arch)
+                ensure_dir(arch_ndk_lib)
+                shprint(sh.ln, '-sf',
+                               realpath(join(openssl_build_dir, 'libcrypto{}.so'.format(ssl_recipe.version))),
+                               join(openssl_build_dir, 'libcrypto.so'))
+                shprint(sh.ln, '-sf',
+                               realpath(join(openssl_build_dir, 'libssl{}.so'.format(ssl_recipe.version))),
+                               join(openssl_build_dir, 'libssl.so'))
+                libs = ['libcrypto.a', 'libcrypto.so', 'libssl.a', 'libssl.so']
+                cmd = [join(openssl_build_dir, lib) for lib in libs] + [arch_ndk_lib]
+                shprint(sh.cp, '-f', *cmd)
+
+            if stage < 10:
+                info('Recompiling python-crystax')
+                self.patch_dev_defaults(ssl_recipe)
+                build_script = join(self.ctx.ndk_dir, 'build', 'tools',
+                                    'build-target-python.sh')
+
+                shprint(Command(build_script),
+                        '--ndk-dir={}'.format(self.ctx.ndk_dir),
+                        '--abis={}'.format(arch.arch),
+                        '-j5', '--verbose',
+                        self.get_build_dir(arch.arch))
+
+        info('Extracting CrystaX python3 from NDK package')
+        dirn = self.ctx.get_python_install_dir()
+        ensure_dir(dirn)
+        self.ctx.hostpython = 'python{}'.format(self.version)
+
+recipe = Python3Recipe()
diff --git a/recipes/python3crystax/patch_python3.6.patch b/recipes/python3crystax/patch_python3.6.patch
new file mode 100644
index 0000000..4402d1b
--- /dev/null
+++ b/recipes/python3crystax/patch_python3.6.patch
@@ -0,0 +1,89 @@
+diff --git a/Modules/expat/xmlparse.c b/Modules/expat/xmlparse.c
+--- a/Modules/expat/xmlparse.c
++++ b/Modules/expat/xmlparse.c
+@@ -84,6 +84,8 @@
+ # define LOAD_LIBRARY_SEARCH_SYSTEM32  0x00000800
+ #endif
+ 
++#define XML_POOR_ENTROPY 1
++
+ #if !defined(HAVE_GETRANDOM) && !defined(HAVE_SYSCALL_GETRANDOM) \
+     && !defined(HAVE_ARC4RANDOM_BUF) && !defined(HAVE_ARC4RANDOM) \
+     && !defined(XML_DEV_URANDOM) \
+diff --git a/Modules/getpath.c b/Modules/getpath.c
+--- a/Modules/getpath.c
++++ b/Modules/getpath.c
+@@ -101,8 +101,35 @@
+ #endif
+ 
+ 
+-#if !defined(PREFIX) || !defined(EXEC_PREFIX) || !defined(VERSION) || !defined(VPATH)
+-#error "PREFIX, EXEC_PREFIX, VERSION, and VPATH must be constant defined"
++   /* These variables were set this way in old versions of Python, but
++      changed somewhere between 3.5.0 and 3.5.3. Here we just force
++      the old way again. A better solution would be to work out where
++      they should be defined, and make the CrystaX build scripts do
++      so. */
++
++/* #if !defined(PREFIX) || !defined(EXEC_PREFIX) || !defined(VERSION) || !defined(VPATH) */
++/* #error "PREFIX, EXEC_PREFIX, VERSION, and VPATH must be constant defined" */
++/* #endif */
++
++#ifndef VERSION
++#define VERSION "2.1"
++#endif
++
++#ifndef VPATH
++#define VPATH "."
++#endif
++
++#ifndef PREFIX
++#  define PREFIX "/usr/local"
++#endif
++
++#ifndef EXEC_PREFIX
++#define EXEC_PREFIX PREFIX
++#endif
++
++#ifndef PYTHONPATH
++#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
++              EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
+ #endif
+ 
+ #ifndef LANDMARK
+diff --git a/Modules/timemodule.c b/Modules/timemodule.c
+--- a/Modules/timemodule.c
++++ b/Modules/timemodule.c
+@@ -358,18 +358,20 @@ time_gmtime(PyObject *self, PyObject *args)
+ #endif
+ }
+ 
+-#ifndef HAVE_TIMEGM
+-static time_t
+-timegm(struct tm *p)
+-{
+-    /* XXX: the following implementation will not work for tm_year < 1970.
+-       but it is likely that platforms that don't have timegm do not support
+-       negative timestamps anyways. */
+-    return p->tm_sec + p->tm_min*60 + p->tm_hour*3600 + p->tm_yday*86400 +
+-        (p->tm_year-70)*31536000 + ((p->tm_year-69)/4)*86400 -
+-        ((p->tm_year-1)/100)*86400 + ((p->tm_year+299)/400)*86400;
+-}
+-#endif
++/* In the Android build, HAVE_TIMEGM apparently should be defined but isn't. A better fix would be to work out why and fix that. */
++
++/* #ifndef HAVE_TIMEGM */
++/* static time_t */
++/* timegm(struct tm *p) */
++/* { */
++/*     /\* XXX: the following implementation will not work for tm_year < 1970. */
++/*        but it is likely that platforms that don't have timegm do not support */
++/*        negative timestamps anyways. *\/ */
++/*     return p->tm_sec + p->tm_min*60 + p->tm_hour*3600 + p->tm_yday*86400 + */
++/*         (p->tm_year-70)*31536000 + ((p->tm_year-69)/4)*86400 - */
++/*         ((p->tm_year-1)/100)*86400 + ((p->tm_year+299)/400)*86400; */
++/* } */
++/* #endif */
+ 
+ PyDoc_STRVAR(gmtime_doc,
+ "gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n\
diff --git a/recipes/requests/__init__.py b/recipes/requests/__init__.py
new file mode 100644
index 0000000..f7a0290
--- /dev/null
+++ b/recipes/requests/__init__.py
@@ -0,0 +1,12 @@
+from pythonforandroid.recipe import PythonRecipe
+
+
+class RequestsRecipe(PythonRecipe):
+    version = '2.13.0'
+    url = 'https://github.com/kennethreitz/requests/archive/v{version}.tar.gz'
+    depends = [('hostpython2', 'hostpython3crystax'), 'setuptools']
+    site_packages_name = 'requests'
+    call_hostpython_via_targetpython = False
+
+
+recipe = RequestsRecipe()
\ No newline at end of file
diff --git a/recipes/setuptools/__init__.py b/recipes/setuptools/__init__.py
index c67d434..21e89b1 100644
--- a/recipes/setuptools/__init__.py
+++ b/recipes/setuptools/__init__.py
@@ -1,23 +1,14 @@
-
-from pythonforandroid.toolchain import (
-    PythonRecipe,
-    Recipe,
-    current_directory,
-    info,
-    shprint,
-)
-from os.path import join
-import sh
+from pythonforandroid.recipe import PythonRecipe
 
 
 class SetuptoolsRecipe(PythonRecipe):
-    version = '18.5'
-    url = 'https://pypi.python.org/packages/source/s/setuptools/setuptools-{version}.tar.gz'
+    version = '40.0.0'
+    url = 'https://pypi.python.org/packages/source/s/setuptools/setuptools-{version}.zip'
 
-    depends = ['python2']
+    depends = [('python2', 'python3crystax')]
 
     call_hostpython_via_targetpython = False
     install_in_hostpython = True
 
 
-recipe = SetuptoolsRecipe()
+recipe = SetuptoolsRecipe()
\ No newline at end of file
diff --git a/recipes/six/__init__.py b/recipes/six/__init__.py
index e03eeb0..92b266f 100644
--- a/recipes/six/__init__.py
+++ b/recipes/six/__init__.py
@@ -6,6 +6,5 @@ class SixRecipe(PythonRecipe):
     version = '1.9.0'
     url = 'https://pypi.python.org/packages/source/s/six/six-{version}.tar.gz'
     depends = [('python2', 'python3crystax')]
-    call_hostpython_via_targetpython = False
 
 recipe = SixRecipe()
diff --git a/recipes/twisted/__init__.py b/recipes/twisted/__init__.py
index 753a107..852291a 100644
--- a/recipes/twisted/__init__.py
+++ b/recipes/twisted/__init__.py
@@ -12,10 +12,10 @@ import sh
 
 
 class TwistedRecipe(CythonRecipe):
-    version = '16.6.0'
+    version = '18.7.0'
     url = 'https://github.com/twisted/twisted/archive/twisted-{version}.tar.gz'
 
-    depends = ['setuptools', 'zope_interface']
+    depends = ['setuptools', 'zope_interface', 'incremental', 'constantly']
 
     call_hostpython_via_targetpython = False
     install_in_hostpython = True
@@ -29,10 +29,10 @@ class TwistedRecipe(CythonRecipe):
         env = super(TwistedRecipe, self).get_recipe_env(arch)
 
         # TODO: Move this and others to base Recipe class for Cython and CompiledComponent recipes
-        target_python = Recipe.get_recipe('python2', self.ctx).get_build_dir(arch.arch)
+        target_python = Recipe.get_recipe('python3crystax', self.ctx).get_build_dir(arch.arch)
         env['PYTHON_ROOT'] = join(target_python, 'python-install')
-        env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python2.7'
-        env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + ' -lpython2.7'
+        env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python3.6'
+        env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + ' -lpython3.6m'
 
         # We add BUILDLIB_PATH to PYTHONPATH so twisted can find _io.so
         env['PYTHONPATH'] = ':'.join([
diff --git a/recipes/unqlite/__init__.py b/recipes/unqlite/__init__.py
deleted file mode 100644
index a47be77..0000000
--- a/recipes/unqlite/__init__.py
+++ /dev/null
@@ -1,32 +0,0 @@
-import glob
-from pythonforandroid.toolchain import (
-    CythonRecipe,
-    Recipe,
-    current_directory,
-    info,
-    shprint,
-)
-from os.path import join
-import sh
-
-
-class UnqliteRecipe(CythonRecipe):
-    version = '0.6.0'
-    url = 'https://pypi.python.org/packages/cb/4e/e1f64a3d0f6462167805940b4c72f47bafc1129e363fc4c0f79a1cdc5dd1/unqlite-{version}.tar.gz'
-    depends = ['python2', 'setuptools']
-    call_hostpython_via_targetpython = False
-
-    patches = ['setup.patch']
-    
-    def get_recipe_env(self, arch):
-        env = super(UnqliteRecipe, self).get_recipe_env(arch)
-
-        target_python = Recipe.get_recipe('python2', self.ctx).get_build_dir(arch.arch)
-        env['PYTHON_ROOT'] = join(target_python, 'python-install')
-        env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python2.7'
-        env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + ' -lpython2.7'
-        
-        return env
-    
-
-recipe = UnqliteRecipe()
diff --git a/recipes/unqlite/setup.patch b/recipes/unqlite/setup.patch
deleted file mode 100644
index 69c865d..0000000
--- a/recipes/unqlite/setup.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- a/setup.py	2016-08-22 19:45:52.000000000 +0100
-+++ b/setup.py	2017-09-16 01:35:36.675202502 +0100
-@@ -1,11 +1,7 @@
- import glob
--from distutils.core import setup, Extension
--
--try:
--    from Cython.Build import cythonize
--except ImportError:
--    raise RuntimeError('Cython must be installed to build unqlite-python.')
--
-+from setuptools import setup
-+from setuptools.extension import Extension
-+from setuptools.command.build_ext import build_ext
- 
- python_source = 'unqlite.pyx'
- library_source = glob.glob('src/*.c')
-@@ -45,5 +41,7 @@
-         'Topic :: Database :: Database Engines/Servers',
-         'Topic :: Software Development :: Embedded Systems',
-         'Topic :: Software Development :: Libraries :: Python Modules'],
--    ext_modules=cythonize(unqlite_extension)
-+    cmdclass = {'build_ext': build_ext},
-+    ext_modules=[unqlite_extension]
- )
-+
diff --git a/recipes/zope_interface/__init__.py b/recipes/zope_interface/__init__.py
new file mode 100644
index 0000000..3091f2a
--- /dev/null
+++ b/recipes/zope_interface/__init__.py
@@ -0,0 +1,21 @@
+from pythonforandroid.recipe import PythonRecipe
+from pythonforandroid.toolchain import current_directory
+import sh
+
+
+class ZopeInterfaceRecipe(PythonRecipe):
+    name = 'zope_interface'
+    version = '4.2.0'
+    url = 'https://pypi.python.org/packages/source/z/zope.interface/zope.interface-{version}.tar.gz'
+    site_packages_name = 'zope.interface'
+
+    depends = [('python2', 'python3crystax')]
+    patches = ['no_tests.patch']
+
+    def prebuild_arch(self, arch):
+        super(ZopeInterfaceRecipe, self).prebuild_arch(arch)
+        with current_directory(self.get_build_dir(arch.arch)):
+            sh.rm('-rf', 'src/zope/interface/tests', 'src/zope/interface/common/tests')
+
+
+recipe = ZopeInterfaceRecipe()
diff --git a/recipes/zope_interface/no_tests.patch b/recipes/zope_interface/no_tests.patch
new file mode 100644
index 0000000..289c850
--- /dev/null
+++ b/recipes/zope_interface/no_tests.patch
@@ -0,0 +1,13 @@
+--- a/setup.py	2016-06-10 14:56:35.000000000 +0100
++++ b/setup.py	2018-09-29 09:28:25.676203522 +0100
+@@ -139,9 +139,8 @@
+         "Topic :: Software Development :: Libraries :: Python Modules",
+       ],
+ 
+-      packages = ['zope', 'zope.interface', 'zope.interface.tests'],
++      packages = ['zope', 'zope.interface'],
+       package_dir = {'': 'src'},
+       cmdclass = {'build_ext': optional_build_ext,
+                   },
+-      test_suite = 'zope.interface.tests',
+       **extra)
diff --git a/recipes/zope_interface/setuptools.patch b/recipes/zope_interface/setuptools.patch
new file mode 100644
index 0000000..957027c
--- /dev/null
+++ b/recipes/zope_interface/setuptools.patch
@@ -0,0 +1,10 @@
+--- a/setup.py	2016-12-14 00:02:45.000000000 +0100
++++ b/setup.py	2018-09-29 00:14:20.235641125 +0100
+@@ -131,7 +131,6 @@
+       include_package_data=True,
+       zip_safe=False,
+       tests_require=tests_require,
+-      install_requires=['setuptools'],
+       extras_require={
+           'docs': ['Sphinx', 'repoze.sphinx.autointerface'],
+           'test': tests_require,
diff --git a/scripts/build-target-python.sh b/scripts/build-target-python.sh
new file mode 100755
index 0000000..04fe3e0
--- /dev/null
+++ b/scripts/build-target-python.sh
@@ -0,0 +1,921 @@
+#!/bin/bash
+
+# Copyright (c) 2011-2015 CrystaX.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without modification, are
+# permitted provided that the following conditions are met:
+#
+#    1. Redistributions of source code must retain the above copyright notice, this list of
+#       conditions and the following disclaimer.
+#
+#    2. Redistributions in binary form must reproduce the above copyright notice, this list
+#       of conditions and the following disclaimer in the documentation and/or other materials
+#       provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY CrystaX ''AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CrystaX OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# The views and conclusions contained in the software and documentation are those of the
+# authors and should not be interpreted as representing official policies, either expressed
+# or implied, of CrystaX.
+
+# include common function and variable definitions
+. `dirname $0`/prebuilt-common.sh
+
+PROGRAM_PARAMETERS="<src-dir>"
+
+PROGRAM_DESCRIPTION=\
+"Rebuild python libraries for the CrystaX NDK.
+
+This requires a temporary NDK installation containing
+toolchain binaries for all target architectures.
+
+By default, this will try with the current NDK directory, unless
+you use the --ndk-dir=<path> option.
+
+The output will be placed in appropriate sub-directories of
+<ndk>/$PYTHON_SUBDIR, but you can override this with the --out-dir=<path>
+option.
+"
+
+PACKAGE_DIR=
+register_var_option "--package-dir=<path>" PACKAGE_DIR "Put prebuilt tarballs into <path>"
+
+NDK_DIR=$ANDROID_NDK_ROOT
+register_var_option "--ndk-dir=<path>" NDK_DIR "Specify NDK root path for the build"
+
+BUILD_DIR=
+OPTION_BUILD_DIR=
+register_var_option "--build-dir=<path>" OPTION_BUILD_DIR "Specify temporary build dir"
+
+ABIS=$PREBUILT_ABIS
+register_var_option "--abis=<list>" ABIS "Specify list of target ABIs"
+
+register_jobs_option
+
+extract_parameters "$@"
+
+PYTHON_SRCDIR=$(echo $PARAMETERS | sed 1q)
+if [ -z "$PYTHON_SRCDIR" ]; then
+    echo "ERROR: Please provide the path to the python source tree. See --help"
+    exit 1
+fi
+
+if [ ! -d "$PYTHON_SRCDIR" ]; then
+    echo "ERROR: No such directory: '$PYTHON_SRCDIR'"
+    exit 1
+fi
+
+PYTHON_SRCDIR=$(cd $PYTHON_SRCDIR && pwd)
+
+PYTHON_MAJOR_VERSION=\
+$(cat $PYTHON_SRCDIR/Include/patchlevel.h | sed -n 's/#define[ \t]*PY_MAJOR_VERSION[ \t]*\([0-9]*\).*/\1/p')
+
+PYTHON_MINOR_VERSION=\
+$(cat $PYTHON_SRCDIR/Include/patchlevel.h | sed -n 's/#define[ \t]*PY_MINOR_VERSION[ \t]*\([0-9]*\).*/\1/p')
+
+if [ -z "$PYTHON_MAJOR_VERSION" ]; then
+    echo "ERROR: Can't detect python major version." 1>&2
+    exit 1
+fi
+
+if [ -z "$PYTHON_MINOR_VERSION" ]; then
+    echo "ERROR: Can't detect python minor version." 1>&2
+    exit 1
+fi
+
+PYTHON_ABI="$PYTHON_MAJOR_VERSION"'.'"$PYTHON_MINOR_VERSION"
+PYTHON_DSTDIR=$NDK_DIR/$PYTHON_SUBDIR/$PYTHON_ABI
+mkdir -p $PYTHON_DSTDIR
+fail_panic "Can't create python destination directory: $PYTHON_DSTDIR"
+
+PYTHON_BUILD_UTILS_DIR=$(cd $(dirname $0)/build-target-python && pwd)
+if [ ! -d "$PYTHON_BUILD_UTILS_DIR" ]; then
+    echo "ERROR: No such directory: '$PYTHON_BUILD_UTILS_DIR'"
+    exit 1
+fi
+
+PY_C_CONFIG_FILE="$PYTHON_BUILD_UTILS_DIR/config.c.$PYTHON_ABI"
+if [ ! -f "$PY_C_CONFIG_FILE" ]; then
+    echo "ERROR: Build of python $PYTHON_ABI is not supported, no such file: $PY_C_CONFIG_FILE"
+    exit 1
+fi
+
+PY_C_INTERPRETER_FILE="$PYTHON_BUILD_UTILS_DIR/interpreter.c.$PYTHON_ABI"
+if [ ! -f "$PY_C_INTERPRETER_FILE" ]; then
+    echo "ERROR: Build of python $PYTHON_ABI is not supported, no such file: $PY_C_INTERPRETER_FILE"
+    exit 1
+fi
+
+PY_ANDROID_MK_TEMPLATE_FILE="$PYTHON_BUILD_UTILS_DIR/android.mk.$PYTHON_ABI"
+if [ ! -f "$PY_ANDROID_MK_TEMPLATE_FILE" ]; then
+    echo "ERROR: Build of python $PYTHON_ABI is not supported, no such file: $PY_ANDROID_MK_TEMPLATE_FILE"
+    exit 1
+fi
+
+ABIS=$(commas_to_spaces $ABIS)
+
+if [ -z "$OPTION_BUILD_DIR" ]; then
+    BUILD_DIR=$NDK_TMPDIR/build-python
+else
+    eval BUILD_DIR=$OPTION_BUILD_DIR
+fi
+
+rm -rf "$BUILD_DIR"
+mkdir -p "$BUILD_DIR"
+fail_panic "Can't create build directory: $BUILD_DIR"
+
+OPENSSL_HOME=''
+if [ -n "$DEFAULT_OPENSSL_VERSION" ]; then
+    if [ -f "$NDK_DIR/$OPENSSL_SUBDIR/$DEFAULT_OPENSSL_VERSION/Android.mk" \
+         -a -f "$NDK_DIR/$OPENSSL_SUBDIR/$DEFAULT_OPENSSL_VERSION/include/openssl/opensslconf.h" ]; then
+        OPENSSL_HOME="openssl/$DEFAULT_OPENSSL_VERSION"
+    fi
+fi
+
+# $1: ABI
+# $2: build directory
+build_python_for_abi ()
+{
+    local ABI="$1"
+    local BUILDDIR="$2"
+    local PYBIN_INSTALLDIR=$PYTHON_DSTDIR/libs/$ABI
+    local PYBIN_INSTALLDIR_MODULES="$PYBIN_INSTALLDIR/modules"
+    if [ -n "$OPENSSL_HOME" ]; then
+        log "Building python$PYTHON_ABI for $ABI (with OpenSSL-$DEFAULT_OPENSSL_VERSION)"
+    else
+        log "Building python$PYTHON_ABI for $ABI (without OpenSSL support)"
+    fi
+
+# Step 1: configure
+    local BUILDDIR_CONFIG="$BUILDDIR/config"
+    local BUILDDIR_CORE="$BUILDDIR/core"
+    local OBJDIR_CORE="$BUILDDIR_CORE/obj/local/$ABI"
+
+    run mkdir -p $BUILDDIR_CONFIG
+    fail_panic "Can't create directory: $BUILDDIR_CONFIG"
+    run mkdir -p $BUILDDIR_CORE
+    fail_panic "Can't create directory: $BUILDDIR_CORE"
+
+    local BUILD_ON_PLATFORM=$($PYTHON_SRCDIR/config.guess)
+    if [ -z "$BUILD_ON_PLATFORM" ]; then
+        echo "ERROR: Can't resolve platform being built python on." 1>&2
+        exit 1
+    fi
+
+    local ARCH
+    case $ABI in
+        armeabi*)
+            ARCH=arm
+            ;;
+        arm64*)
+            ARCH=arm64
+            ;;
+        x86|x86_64|mips|mips64)
+            ARCH=$ABI
+            ;;
+        *)
+            echo "ERROR: Unknown ABI: '$ABI'" 1>&2
+            exit 1
+    esac
+
+    local HOST
+    case $ABI in
+        armeabi*)
+            HOST=arm-linux-androideabi
+            ;;
+        arm64*)
+            HOST=aarch64-linux-android
+            ;;
+        x86)
+            HOST=i686-linux-android
+            ;;
+        x86_64)
+            HOST=x86_64-linux-android
+            ;;
+        mips)
+            HOST=mipsel-linux-android
+            ;;
+        mips64)
+            HOST=mips64el-linux-android
+            ;;
+        *)
+            echo "ERROR: Unknown ABI: '$ABI'" 1>&2
+            exit 1
+    esac
+
+    local APILEVEL
+    case $ABI in
+        armeabi*|x86|mips)
+            APILEVEL=21
+            ;;
+        arm64*|x86_64|mips64)
+            APILEVEL=21
+            ;;
+        *)
+            echo "ERROR: Unknown ABI: '$ABI'" 1>&2
+            exit 1
+    esac
+
+    local TOOLCHAIN
+    case $ABI in
+        armeabi*)
+            TOOLCHAIN=arm-linux-androideabi
+            ;;
+        x86)
+            TOOLCHAIN=x86
+            ;;
+        mips)
+            TOOLCHAIN=mipsel-linux-android
+            ;;
+        arm64-v8a)
+            TOOLCHAIN=aarch64-linux-android
+            ;;
+        x86_64)
+            TOOLCHAIN=x86_64
+            ;;
+        mips64)
+            TOOLCHAIN=mips64el-linux-android
+            ;;
+        *)
+            echo "ERROR: Unknown ABI: '$ABI'" 1>&2
+            exit 1
+    esac
+
+    case $ABI in
+        armeabi)
+            CFLAGS="-march=armv5te -mtune=xscale -msoft-float"
+            ;;
+        armeabi-v7a)
+            CFLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp"
+            ;;
+        armeabi-v7a-hard)
+            CFLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mhard-float"
+            ;;
+        *)
+            CFLAGS=""
+    esac
+
+    case $ABI in
+        armeabi*)
+            CFLAGS="$CFLAGS -mthumb"
+    esac
+
+    local CFLAGS="$CFLAGS --sysroot=$NDK_DIR/platforms/android-$APILEVEL/arch-$ARCH"
+
+    local LDFLAGS=""
+    if [ "$ABI" = "armeabi-v7a-hard" ]; then
+        LDFLAGS="$LDFLAGS -Wl,--no-warn-mismatch"
+    fi
+    LDFLAGS="$LDFLAGS -L$NDK_DIR/sources/crystax/libs/$ABI --sysroot=$NDK_DIR/platforms/android-$APILEVEL/arch-$ARCH"
+
+    local TCPREFIX=$NDK_DIR/toolchains/${TOOLCHAIN}-4.9/prebuilt/$HOST_TAG
+
+
+    local CC=$TCPREFIX/bin/${HOST}-gcc
+    local CPP="$CC $CFLAGS -E"
+    local AR=$TCPREFIX/bin/${HOST}-ar
+    local RANLIB=$TCPREFIX/bin/${HOST}-ranlib
+    local READELF=$TCPREFIX/bin/${HOST}-readelf
+    local PYTHON_FOR_BUILD=$NDK_DIR/prebuilt/$HOST_TAG/bin/python
+    local CONFIG_SITE=$PYTHON_TOOLS_DIR/config.site
+
+    local CONFIG_SITE=$BUILDDIR_CONFIG/config.site
+    {
+        echo 'ac_cv_file__dev_ptmx=no'
+        echo 'ac_cv_file__dev_ptc=no'
+        echo 'ac_cv_func_gethostbyname_r=no'
+        if [ "$PYTHON_MAJOR_VERSION" == "3" ]; then
+            echo 'ac_cv_func_faccessat=no'
+        fi
+    } >$CONFIG_SITE
+    fail_panic "Can't create config.site wrapper"
+
+    local CONFIGURE_WRAPPER=$BUILDDIR_CONFIG/configure.sh
+    {
+        echo "#!/bin/bash -e"
+        echo ''
+        echo "export CC=\"$CC\""
+        echo "export CPP=\"$CPP\""
+        echo "export AR=\"$AR\""
+        echo "export CFLAGS=\"$CFLAGS\""
+        echo "export LDFLAGS=\"$LDFLAGS\""
+        echo "export RANLIB=\"$RANLIB\""
+        echo "export READELF=\"$READELF\""
+        echo "export PYTHON_FOR_BUILD=\"$PYTHON_FOR_BUILD\""
+        echo "export CONFIG_SITE=\"$CONFIG_SITE\""
+        echo ''
+        echo 'cd $(dirname $0)'
+        echo ''
+        if [ "$PYTHON_MAJOR_VERSION" = "2" ]; then
+            echo "exec $PYTHON_SRCDIR/configure \\"
+            echo "    --host=$HOST \\"
+            echo "    --build=$BUILD_ON_PLATFORM \\"
+            echo "    --prefix=$BUILDDIR_CONFIG/install \\"
+            echo "    --enable-shared \\"
+            echo "    --with-threads \\"
+            echo "    --enable-ipv6 \\"
+            echo "    --enable-unicode=ucs4 \\"
+            echo "    --without-ensurepip"
+        else
+            echo "exec $PYTHON_SRCDIR/configure \\"
+            echo "    --host=$HOST \\"
+            echo "    --build=$BUILD_ON_PLATFORM \\"
+            echo "    --prefix=$BUILDDIR_CONFIG/install \\"
+            echo "    --enable-shared \\"
+            echo "    --with-threads \\"
+            echo "    --enable-ipv6 \\"
+            echo "    --with-computed-gotos \\"
+            echo "    --without-ensurepip"
+        fi
+    } >$CONFIGURE_WRAPPER
+    fail_panic "Can't create configure wrapper"
+
+    chmod +x $CONFIGURE_WRAPPER
+    fail_panic "Can't chmod +x configure wrapper"
+
+    run $CONFIGURE_WRAPPER
+    fail_panic "Can't configure python$PYTHON_ABI for $ABI"
+
+# Step 2: build python-core
+    run mkdir -p $BUILDDIR_CORE/jni
+    fail_panic "Can't create directory: $BUILDDIR_CORE/jni"
+
+    run cp -p -T $PY_C_CONFIG_FILE "$BUILDDIR_CORE/jni/config.c" && \
+        cp -p -t "$BUILDDIR_CORE/jni" "$PYTHON_BUILD_UTILS_DIR/pyconfig.h"
+    fail_panic "Can't copy config.c pyconfig.h to $BUILDDIR_CORE/jni"
+
+    if [ "$PYTHON_MAJOR_VERSION" = "2" ]; then
+        local PY_C_GETPATH="$PYTHON_BUILD_UTILS_DIR/getpath.c.$PYTHON_ABI"
+        run cp -p -T $PY_C_GETPATH "$BUILDDIR_CORE/jni/getpath.c"
+        fail_panic "Can't copy $PY_C_GETPATH to $BUILDDIR_CORE/jni"
+    fi
+
+    local PYCONFIG_FOR_ABI="$BUILDDIR_CORE/jni/pyconfig_$(echo $ABI | tr '-' '_').h"
+    run cp -p -T $BUILDDIR_CONFIG/pyconfig.h $PYCONFIG_FOR_ABI
+    fail_panic "Can't copy $BUILDDIR_CONFIG/pyconfig.h to $PYCONFIG_FOR_ABI"
+
+    if [ "$PYTHON_MAJOR_VERSION" = "2" ]; then
+        local PYTHON_CORE_MODULE_NAME='python'"$PYTHON_ABI"
+    else
+        local PYTHON_CORE_MODULE_NAME='python'"$PYTHON_ABI"'m'
+        local PYTHON_SOABI='cpython-'"$PYTHON_ABI"'m'
+    fi
+    {
+        echo 'LOCAL_PATH := $(call my-dir)'
+        echo 'include $(CLEAR_VARS)'
+        echo "LOCAL_MODULE := $PYTHON_CORE_MODULE_NAME"
+        echo "MY_PYTHON_SRC_ROOT := $PYTHON_SRCDIR"
+        echo 'LOCAL_C_INCLUDES := $(MY_PYTHON_SRC_ROOT)/Include'
+        if [ "$PYTHON_MAJOR_VERSION" = "2" ]; then
+            echo "LOCAL_CFLAGS := -DPy_BUILD_CORE -DPy_ENABLE_SHARED -DPLATFORM=\\\"linux\\\""
+        else
+            echo "LOCAL_CFLAGS := -DSOABI=\\\"$PYTHON_SOABI\\\" -DPy_BUILD_CORE -DPy_ENABLE_SHARED -DPLATFORM=\\\"linux\\\""
+        fi
+        echo 'LOCAL_LDLIBS := -lz'
+        cat $PY_ANDROID_MK_TEMPLATE_FILE
+        echo 'include $(BUILD_SHARED_LIBRARY)'
+    } >$BUILDDIR_CORE/jni/Android.mk
+    fail_panic "Can't generate $BUILDDIR_CORE/jni/Android.mk"
+
+    run $NDK_DIR/ndk-build -C $BUILDDIR_CORE -j$NUM_JOBS APP_ABI=$ABI V=1
+    fail_panic "Can't build python$PYTHON_ABI-$ABI core"
+
+    if [ "$PYTHON_HEADERS_INSTALLED" != "yes" ]; then
+        log "Install python$PYTHON_ABI headers into $PYTHON_DSTDIR"
+        run rm -Rf $PYTHON_DSTDIR/include
+        run mkdir -p $PYTHON_DSTDIR/include/python && \
+        run cp -p $PYTHON_BUILD_UTILS_DIR/pyconfig.h $PYTHON_SRCDIR/Include/*.h $PYTHON_DSTDIR/include/python
+        fail_panic "Can't install python$PYTHON_ABI headers"
+        PYTHON_HEADERS_INSTALLED=yes
+        export PYTHON_HEADERS_INSTALLED
+    fi
+    log "Install $(basename $PYCONFIG_FOR_ABI) into $PYTHON_DSTDIR"
+    run cp -p $PYCONFIG_FOR_ABI $PYTHON_DSTDIR/include/python
+    fail_panic "Can't install $PYCONFIG_FOR_ABI"
+
+    run mkdir -p $PYBIN_INSTALLDIR
+    fail_panic "Can't create $PYBIN_INSTALLDIR"
+    run mkdir -p $PYBIN_INSTALLDIR_MODULES
+    fail_panic "Can't create directory: $PYBIN_INSTALLDIR_MODULES"
+
+    log "Install python$PYTHON_ABI-$ABI core in $PYBIN_INSTALLDIR"
+    run cp -fpH $OBJDIR_CORE/lib$PYTHON_CORE_MODULE_NAME.so $PYBIN_INSTALLDIR
+    fail_panic "Can't install python$PYTHON_ABI-$ABI core in $PYBIN_INSTALLDIR"
+
+# Step 3: build python-interpreter
+    local BUILDDIR_INTERPRETER="$BUILDDIR/interpreter"
+    local OBJDIR_INTERPRETER="$BUILDDIR_INTERPRETER/obj/local/$ABI"
+
+    run mkdir -p $BUILDDIR_INTERPRETER/jni
+    fail_panic "Can't create directory: $BUILDDIR_INTERPRETER/jni"
+
+    run cp -p -T $PY_C_INTERPRETER_FILE $BUILDDIR_INTERPRETER/jni/interpreter.c
+    fail_panic "Can't copy $PY_C_INTERPRETER_FILE to $BUILDDIR_INTERPRETER/jni"
+
+    {
+         echo 'LOCAL_PATH := $(call my-dir)'
+         echo 'include $(CLEAR_VARS)'
+         echo 'LOCAL_MODULE := python'
+         echo 'LOCAL_SRC_FILES := interpreter.c'
+         echo 'include $(BUILD_EXECUTABLE)'
+    } >$BUILDDIR_INTERPRETER/jni/Android.mk
+    fail_panic "Can't generate $BUILDDIR_INTERPRETER/jni/Android.mk"
+
+    run $NDK_DIR/ndk-build -C $BUILDDIR_INTERPRETER -j$NUM_JOBS APP_ABI=$ABI V=1
+    fail_panic "Can't build python$PYTHON_ABI-$ABI interpreter"
+
+    log "Install python$PYTHON_ABI-$ABI interpreter in $PYBIN_INSTALLDIR"
+    run cp -fpH $OBJDIR_INTERPRETER/python $PYBIN_INSTALLDIR
+    fail_panic "Can't install python$PYTHON_ABI-$ABI interpreter in $PYBIN_INSTALLDIR"
+
+# Step 4: build python stdlib
+    local PYSTDLIB_ZIPFILE="$PYBIN_INSTALLDIR/stdlib.zip"
+    log "Install python$PYTHON_ABI-$ABI stdlib as $PYSTDLIB_ZIPFILE"
+    if [ "$PYTHON_MAJOR_VERSION" = "2" ]; then
+        run $PYTHON_FOR_BUILD $PYTHON_BUILD_UTILS_DIR/build_stdlib.py --py2 --pysrc-root $PYTHON_SRCDIR --output-zip $PYSTDLIB_ZIPFILE
+        fail_panic "Can't install python$PYTHON_ABI-$ABI stdlib"
+    else
+        run $PYTHON_FOR_BUILD $PYTHON_BUILD_UTILS_DIR/build_stdlib.py --pysrc-root $PYTHON_SRCDIR --output-zip $PYSTDLIB_ZIPFILE
+        fail_panic "Can't install python$PYTHON_ABI-$ABI stdlib"
+    fi
+
+# Step 5: site-packages
+    local SITE_README_SRCDIR="$PYTHON_SRCDIR/Lib/site-packages"
+    local SITE_README_DSTDIR="$PYBIN_INSTALLDIR/site-packages"
+    log "Install python$PYTHON_ABI-$ABI site-packages"
+    run mkdir -p $SITE_README_DSTDIR && cp -fpH $SITE_README_SRCDIR/README $SITE_README_DSTDIR
+    fail_panic "Can't install python$PYTHON_ABI-$ABI site-packages"
+
+# Step 6: build python modules
+# _ctypes
+    local BUILDDIR_CTYPES="$BUILDDIR/ctypes"
+    local OBJDIR_CTYPES="$BUILDDIR_CTYPES/obj/local/$ABI"
+    local BUILDDIR_CTYPES_CONFIG="$BUILDDIR_CTYPES/config"
+    run mkdir -p $BUILDDIR_CTYPES_CONFIG
+    fail_panic "Can't create directory: $BUILDDIR_CTYPES_CONFIG"
+
+    local LIBFFI_CONFIGURE_WRAPPER=$BUILDDIR_CTYPES_CONFIG/configure.sh
+    {
+        echo "#!/bin/bash -e"
+        echo ''
+        echo "export CC=\"$CC\""
+        echo "export CFLAGS=\"$CFLAGS\""
+        echo "export LDFLAGS=\"$LDFLAGS\""
+        echo "export CPP=\"$CPP\""
+        echo "export AR=\"$AR\""
+        echo "export RANLIB=\"$RANLIB\""
+        echo ''
+        echo 'cd $(dirname $0)'
+        echo ''
+        echo "exec $PYTHON_SRCDIR/Modules/_ctypes/libffi/configure \\"
+        echo "    --host=$HOST \\"
+        echo "    --build=$BUILD_ON_PLATFORM \\"
+        echo "    --prefix=$BUILDDIR_CTYPES_CONFIG/install \\"
+    } >$LIBFFI_CONFIGURE_WRAPPER
+    fail_panic "Can't create configure wrapper for libffi"
+
+    chmod +x $LIBFFI_CONFIGURE_WRAPPER
+    fail_panic "Can't chmod +x configure wrapper for libffi"
+
+    run $LIBFFI_CONFIGURE_WRAPPER
+    fail_panic "Can't configure libffi for $ABI"
+
+    run mkdir -p "$BUILDDIR_CTYPES/jni"
+    fail_panic "Can't create directory: $BUILDDIR_CTYPES/jni"
+
+    run mkdir -p "$BUILDDIR_CTYPES/jni/include"
+    fail_panic "Can't create directory: $BUILDDIR_CTYPES/jni/include"
+
+    run cp -p $BUILDDIR_CTYPES_CONFIG/fficonfig.h $BUILDDIR_CTYPES_CONFIG/include/*.h $BUILDDIR_CTYPES/jni/include
+    fail_panic "Can't copy configured libffi headers"
+
+    local FFI_SRC_LIST
+    case $ABI in
+        x86)
+            FFI_SRC_LIST="src/x86/ffi.c src/x86/sysv.S src/x86/win32.S"
+            ;;
+        x86_64)
+            FFI_SRC_LIST="src/x86/ffi64.c src/x86/unix64.S"
+            ;;
+        armeabi*)
+            FFI_SRC_LIST="src/arm/ffi.c src/arm/sysv.S"
+            ;;
+        arm64-v8a)
+            FFI_SRC_LIST="src/aarch64/ffi.c src/aarch64/sysv.S"
+            ;;
+        mips)
+            FFI_SRC_LIST="src/mips/ffi.c src/mips/o32.S"
+            ;;
+        mips64)
+            FFI_SRC_LIST="src/mips/ffi.c src/mips/o32.S src/mips/n32.S"
+            ;;
+        *)
+            echo "ERROR: Unknown ABI: '$ABI'" 1>&2
+            exit 1
+    esac
+    FFI_SRC_LIST="$FFI_SRC_LIST src/prep_cif.c"
+    {
+        echo 'LOCAL_PATH := $(call my-dir)'
+        echo 'include $(CLEAR_VARS)'
+        echo 'LOCAL_MODULE := _ctypes'
+        echo 'LOCAL_C_INCLUDES := $(LOCAL_PATH)/include'
+        echo "MY_PYTHON_SRC_ROOT := $PYTHON_SRCDIR"
+        echo 'LOCAL_SRC_FILES := \'
+        for ffi_src in $FFI_SRC_LIST; do
+            echo "  \$(MY_PYTHON_SRC_ROOT)/Modules/_ctypes/libffi/$ffi_src \\"
+        done
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_ctypes/callbacks.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_ctypes/callproc.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_ctypes/cfield.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_ctypes/malloc_closure.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_ctypes/stgdict.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_ctypes/_ctypes.c'
+        echo 'LOCAL_STATIC_LIBRARIES := python_shared'
+        echo 'include $(BUILD_SHARED_LIBRARY)'
+        echo "\$(call import-module,python/$PYTHON_ABI)"
+    } >$BUILDDIR_CTYPES/jni/Android.mk
+    fail_panic "Can't generate $BUILDDIR_CTYPES/jni/Android.mk"
+
+    run $NDK_DIR/ndk-build -C $BUILDDIR_CTYPES -j$NUM_JOBS APP_ABI=$ABI V=1
+    fail_panic "Can't build python$PYTHON_ABI-$ABI module '_ctypes'"
+
+    log "Install python$PYTHON_ABI-$ABI module '_ctypes' in $PYBIN_INSTALLDIR_MODULES"
+    run cp -p -T $OBJDIR_CTYPES/lib_ctypes.so $PYBIN_INSTALLDIR_MODULES/_ctypes.so
+    fail_panic "Can't install python$PYTHON_ABI-$ABI module '_ctypes' in $PYBIN_INSTALLDIR_MODULES"
+
+# _multiprocessing
+    local BUILDDIR_MULTIPROCESSING="$BUILDDIR/multiprocessing"
+    local OBJDIR_MULTIPROCESSING="$BUILDDIR_MULTIPROCESSING/obj/local/$ABI"
+
+    run mkdir -p "$BUILDDIR_MULTIPROCESSING/jni"
+    fail_panic "Can't create directory: $BUILDDIR_MULTIPROCESSING/jni"
+
+    {
+        echo 'LOCAL_PATH := $(call my-dir)'
+        echo 'include $(CLEAR_VARS)'
+        echo 'LOCAL_MODULE := _multiprocessing'
+        echo "MY_PYTHON_SRC_ROOT := $PYTHON_SRCDIR"
+        echo 'LOCAL_SRC_FILES := \'
+        if [ "$PYTHON_MAJOR_VERSION" = "2" ]; then
+            echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_multiprocessing/socket_connection.c \'
+        fi
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_multiprocessing/multiprocessing.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_multiprocessing/semaphore.c'
+        echo 'LOCAL_STATIC_LIBRARIES := python_shared'
+        echo 'include $(BUILD_SHARED_LIBRARY)'
+        echo "\$(call import-module,python/$PYTHON_ABI)"
+    } >$BUILDDIR_MULTIPROCESSING/jni/Android.mk
+    fail_panic "Can't generate $BUILDDIR_MULTIPROCESSING/jni/Android.mk"
+
+    run $NDK_DIR/ndk-build -C $BUILDDIR_MULTIPROCESSING -j$NUM_JOBS APP_ABI=$ABI V=1
+    fail_panic "Can't build python$PYTHON_ABI-$ABI module '_multiprocessing'"
+
+    log "Install python$PYTHON_ABI-$ABI module '_multiprocessing' in $PYBIN_INSTALLDIR_MODULES"
+    run cp -p -T $OBJDIR_MULTIPROCESSING/lib_multiprocessing.so $PYBIN_INSTALLDIR_MODULES/_multiprocessing.so
+    fail_panic "Can't install python$PYTHON_ABI-$ABI module '_multiprocessing' in $PYBIN_INSTALLDIR_MODULES"
+
+# _socket
+    local BUILDDIR_SOCKET="$BUILDDIR/socket"
+    local OBJDIR_SOCKET="$BUILDDIR_SOCKET/obj/local/$ABI"
+
+    run mkdir -p "$BUILDDIR_SOCKET/jni"
+    fail_panic "Can't create directory: $BUILDDIR_SOCKET/jni"
+
+    {
+        echo 'LOCAL_PATH := $(call my-dir)'
+        echo 'include $(CLEAR_VARS)'
+        echo 'LOCAL_MODULE := _socket'
+        echo "MY_PYTHON_SRC_ROOT := $PYTHON_SRCDIR"
+        echo 'LOCAL_SRC_FILES := \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/socketmodule.c'
+        echo 'LOCAL_STATIC_LIBRARIES := python_shared'
+        echo 'include $(BUILD_SHARED_LIBRARY)'
+        echo "\$(call import-module,python/$PYTHON_ABI)"
+    } >$BUILDDIR_SOCKET/jni/Android.mk
+    fail_panic "Can't generate $BUILDDIR_SOCKET/jni/Android.mk"
+
+    run $NDK_DIR/ndk-build -C $BUILDDIR_SOCKET -j$NUM_JOBS APP_ABI=$ABI V=1
+    fail_panic "Can't build python$PYTHON_ABI-$ABI module '_socket'"
+
+    log "Install python$PYTHON_ABI-$ABI module '_socket' in $PYBIN_INSTALLDIR_MODULES"
+    run cp -p -T $OBJDIR_SOCKET/lib_socket.so $PYBIN_INSTALLDIR_MODULES/_socket.so
+    fail_panic "Can't install python$PYTHON_ABI-$ABI module '_socket' in $PYBIN_INSTALLDIR_MODULES"
+
+#_ssl
+    if [ -n "$OPENSSL_HOME" ]; then
+        local BUILDDIR_SSL="$BUILDDIR/ssl"
+        local OBJDIR_SSL="$BUILDDIR_SSL/obj/local/$ABI"
+
+        run mkdir -p "$BUILDDIR_SSL/jni"
+        fail_panic "Can't create directory: $BUILDDIR_SSL/jni"
+
+        {
+            echo 'LOCAL_PATH := $(call my-dir)'
+            echo 'include $(CLEAR_VARS)'
+            echo 'LOCAL_MODULE := _ssl'
+            echo "MY_PYTHON_SRC_ROOT := $PYTHON_SRCDIR"
+            echo 'LOCAL_SRC_FILES := \'
+            echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_ssl.c'
+            echo 'LOCAL_STATIC_LIBRARIES := python_shared openssl_static opencrypto_static'
+            echo 'include $(BUILD_SHARED_LIBRARY)'
+            echo "\$(call import-module,python/$PYTHON_ABI)"
+            echo "\$(call import-module,$OPENSSL_HOME)"
+        } >$BUILDDIR_SSL/jni/Android.mk
+        fail_panic "Can't generate $BUILDDIR_SSL/jni/Android.mk"
+
+        run $NDK_DIR/ndk-build -C $BUILDDIR_SSL -j$NUM_JOBS APP_ABI=$ABI V=1
+        fail_panic "Can't build python$PYTHON_ABI-$ABI module '_ssl'"
+
+        log "Install python$PYTHON_ABI-$ABI module '_ssl' in $PYBIN_INSTALLDIR_MODULES"
+        run cp -p -T $OBJDIR_SSL/lib_ssl.so $PYBIN_INSTALLDIR_MODULES/_ssl.so
+        fail_panic "Can't install python$PYTHON_ABI-$ABI module '_ssl' in $PYBIN_INSTALLDIR_MODULES"
+    fi
+
+# _hashlib
+    if [ -n "$OPENSSL_HOME" ]; then
+        local BUILDDIR_HASHLIB="$BUILDDIR/hashlib"
+        local OBJDIR_HASHLIB="$BUILDDIR_HASHLIB/obj/local/$ABI"
+
+        run mkdir -p "$BUILDDIR_HASHLIB/jni"
+        fail_panic "Can't create directory: $BUILDDIR_HASHLIB/jni"
+
+        {
+            echo 'LOCAL_PATH := $(call my-dir)'
+            echo 'include $(CLEAR_VARS)'
+            echo 'LOCAL_MODULE := _hashlib'
+            echo "MY_PYTHON_SRC_ROOT := $PYTHON_SRCDIR"
+            echo 'LOCAL_SRC_FILES := \'
+            echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_hashopenssl.c'
+            echo 'LOCAL_STATIC_LIBRARIES := python_shared openssl_static opencrypto_static'
+            echo 'include $(BUILD_SHARED_LIBRARY)'
+            echo "\$(call import-module,python/$PYTHON_ABI)"
+            echo "\$(call import-module,$OPENSSL_HOME)"
+        } >$BUILDDIR_HASHLIB/jni/Android.mk
+        fail_panic "Can't generate $BUILDDIR_HASHLIB/jni/Android.mk"
+
+        run $NDK_DIR/ndk-build -C $BUILDDIR_HASHLIB -j$NUM_JOBS APP_ABI=$ABI V=1
+        fail_panic "Can't build python$PYTHON_ABI-$ABI module '_hashlib'"
+
+        log "Install python$PYTHON_ABI-$ABI module '_hashlib' in $PYBIN_INSTALLDIR_MODULES"
+        run cp -p -T $OBJDIR_HASHLIB/lib_hashlib.so $PYBIN_INSTALLDIR_MODULES/_hashlib.so
+        fail_panic "Can't install python$PYTHON_ABI-$ABI module '_hashlib' in $PYBIN_INSTALLDIR_MODULES"
+    fi
+
+# _blake2
+    if [ -n "$OPENSSL_HOME" ]; then
+        local BUILDDIR_BLAKE2="$BUILDDIR/blake2"
+        local OBJDIR_BLAKE2="$BUILDDIR_BLAKE2/obj/local/$ABI"
+
+        run mkdir -p "$BUILDDIR_BLAKE2/jni"
+        fail_panic "Can't create directory: $BUILDDIR_BLAKE2/jni"
+
+        {
+            echo 'LOCAL_PATH := $(call my-dir)'
+            echo 'include $(CLEAR_VARS)'
+            echo 'LOCAL_MODULE := _blake2'
+            echo "MY_PYTHON_SRC_ROOT := $PYTHON_SRCDIR"
+            echo 'LOCAL_SRC_FILES := \'
+            echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_blake2/blake2module.c \'
+            echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_blake2/blake2b_impl.c \'
+            echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_blake2/blake2s_impl.c'
+            echo 'LOCAL_STATIC_LIBRARIES := python_shared'
+            echo 'include $(BUILD_SHARED_LIBRARY)'
+            echo "\$(call import-module,python/$PYTHON_ABI)"
+            echo "\$(call import-module,$OPENSSL_HOME)"
+        } >$BUILDDIR_BLAKE2/jni/Android.mk
+        fail_panic "Can't generate $BUILDDIR_BLAKE2/jni/Android.mk"
+
+        run $NDK_DIR/ndk-build -C $BUILDDIR_BLAKE2 -j$NUM_JOBS APP_ABI=$ABI V=1
+        fail_panic "Can't build python$PYTHON_ABI-$ABI module '_blake2'"
+
+        log "Install python$PYTHON_ABI-$ABI module '_blake2' in $PYBIN_INSTALLDIR_MODULES"
+        run cp -p -T $OBJDIR_BLAKE2/lib_blake2.so $PYBIN_INSTALLDIR_MODULES/_blake2.so
+        fail_panic "Can't install python$PYTHON_ABI-$ABI module '_blake2' in $PYBIN_INSTALLDIR_MODULES"
+    fi
+
+# _sha3
+    if [ -n "$OPENSSL_HOME" ]; then
+        local BUILDDIR_SHA3="$BUILDDIR/sha3"
+        local OBJDIR_SHA3="$BUILDDIR_SHA3/obj/local/$ABI"
+
+        run mkdir -p "$BUILDDIR_SHA3/jni"
+        fail_panic "Can't create directory: $BUILDDIR_SHA3/jni"
+
+        {
+            echo 'LOCAL_PATH := $(call my-dir)'
+            echo 'include $(CLEAR_VARS)'
+            echo 'LOCAL_MODULE := _sha3'
+            echo "MY_PYTHON_SRC_ROOT := $PYTHON_SRCDIR"
+            echo 'LOCAL_SRC_FILES := \'
+            echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_sha3/sha3module.c'
+            echo 'LOCAL_STATIC_LIBRARIES := python_shared'
+            echo 'include $(BUILD_SHARED_LIBRARY)'
+            echo "\$(call import-module,python/$PYTHON_ABI)"
+            echo "\$(call import-module,$OPENSSL_HOME)"
+        } >$BUILDDIR_SHA3/jni/Android.mk
+        fail_panic "Can't generate $BUILDDIR_SHA3/jni/Android.mk"
+
+        run $NDK_DIR/ndk-build -C $BUILDDIR_SHA3 -j$NUM_JOBS APP_ABI=$ABI V=1
+        fail_panic "Can't build python$PYTHON_ABI-$ABI module '_sha3'"
+
+        log "Install python$PYTHON_ABI-$ABI module '_sha3' in $PYBIN_INSTALLDIR_MODULES"
+        run cp -p -T $OBJDIR_SHA3/lib_sha3.so $PYBIN_INSTALLDIR_MODULES/_sha3.so
+        fail_panic "Can't install python$PYTHON_ABI-$ABI module '_sha3' in $PYBIN_INSTALLDIR_MODULES"
+    fi
+
+# _sqlite3
+    local BUILDDIR_SQLITE3="$BUILDDIR/sqlite3"
+    local OBJDIR_SQLITE3="$BUILDDIR_SQLITE3/obj/local/$ABI"
+
+    run mkdir -p "$BUILDDIR_SQLITE3/jni"
+    fail_panic "Can't create directory: $BUILDDIR_SQLITE3/jni"
+
+    {
+        echo 'LOCAL_PATH := $(call my-dir)'
+        echo 'include $(CLEAR_VARS)'
+        echo 'LOCAL_MODULE := _sqlite3'
+        echo 'LOCAL_CFLAGS := -DMODULE_NAME=\"sqlite3\"'
+        echo "MY_PYTHON_SRC_ROOT := $PYTHON_SRCDIR"
+        echo 'LOCAL_SRC_FILES := \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_sqlite/cache.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_sqlite/connection.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_sqlite/cursor.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_sqlite/microprotocols.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_sqlite/module.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_sqlite/prepare_protocol.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_sqlite/row.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_sqlite/statement.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/_sqlite/util.c'
+        echo 'LOCAL_STATIC_LIBRARIES := python_shared sqlite3_static'
+        echo 'include $(BUILD_SHARED_LIBRARY)'
+        echo "\$(call import-module,python/$PYTHON_ABI)"
+        echo '$(call import-module,sqlite/3)'
+    } >$BUILDDIR_SQLITE3/jni/Android.mk
+    fail_panic "Can't generate $BUILDDIR_SQLITE3/jni/Android.mk"
+
+    run $NDK_DIR/ndk-build -C $BUILDDIR_SQLITE3 -j$NUM_JOBS APP_ABI=$ABI V=1
+    fail_panic "Can't build python$PYTHON_ABI-$ABI module '_sqlite3'"
+
+    log "Install python$PYTHON_ABI-$ABI module '_sqlite3' in $PYBIN_INSTALLDIR_MODULES"
+    run cp -p -T $OBJDIR_SQLITE3/lib_sqlite3.so $PYBIN_INSTALLDIR_MODULES/_sqlite3.so
+    fail_panic "Can't install python$PYTHON_ABI-$ABI module '_sqlite3' in $PYBIN_INSTALLDIR_MODULES"
+
+#pyexpat
+    local BUILDDIR_PYEXPAT="$BUILDDIR/pyexpat"
+    local OBJDIR_PYEXPAT="$BUILDDIR_PYEXPAT/obj/local/$ABI"
+
+    run mkdir -p "$BUILDDIR_PYEXPAT/jni"
+    fail_panic "Can't create directory: $BUILDDIR_PYEXPAT/jni"
+
+    {
+        echo 'LOCAL_PATH := $(call my-dir)'
+        echo 'include $(CLEAR_VARS)'
+        echo 'LOCAL_MODULE := pyexpat'
+        echo 'LOCAL_CFLAGS := -DHAVE_EXPAT_CONFIG_H -DXML_STATIC'
+        echo "MY_PYTHON_SRC_ROOT := $PYTHON_SRCDIR"
+        echo "LOCAL_C_INCLUDES := \$(MY_PYTHON_SRC_ROOT)/Modules/expat"
+        echo 'LOCAL_SRC_FILES := \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/expat/xmlparse.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/expat/xmlrole.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/expat/xmltok.c \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/pyexpat.c'
+        echo 'LOCAL_STATIC_LIBRARIES := python_shared'
+        echo 'include $(BUILD_SHARED_LIBRARY)'
+        echo "\$(call import-module,python/$PYTHON_ABI)"
+    } >$BUILDDIR_PYEXPAT/jni/Android.mk
+    fail_panic "Can't generate $BUILDDIR_PYEXPAT/jni/Android.mk"
+
+    run $NDK_DIR/ndk-build -C $BUILDDIR_PYEXPAT -j$NUM_JOBS APP_ABI=$ABI V=1
+    fail_panic "Can't build python$PYTHON_ABI-$ABI module 'pyexpat'"
+
+    log "Install python$PYTHON_ABI-$ABI module 'pyexpat' in $PYBIN_INSTALLDIR_MODULES"
+    run cp -p -T $OBJDIR_PYEXPAT/libpyexpat.so $PYBIN_INSTALLDIR_MODULES/pyexpat.so
+    fail_panic "Can't install python$PYTHON_ABI-$ABI module 'pyexpat' in $PYBIN_INSTALLDIR_MODULES"
+
+# select
+    local BUILDDIR_SELECT="$BUILDDIR/select"
+    local OBJDIR_SELECT="$BUILDDIR_SELECT/obj/local/$ABI"
+
+    run mkdir -p "$BUILDDIR_SELECT/jni"
+    fail_panic "Can't create directory: $BUILDDIR_SELECT/jni"
+
+    {
+        echo 'LOCAL_PATH := $(call my-dir)'
+        echo 'include $(CLEAR_VARS)'
+        echo 'LOCAL_MODULE := select'
+        echo "MY_PYTHON_SRC_ROOT := $PYTHON_SRCDIR"
+        echo 'LOCAL_SRC_FILES := \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/selectmodule.c'
+        echo 'LOCAL_STATIC_LIBRARIES := python_shared'
+        echo 'include $(BUILD_SHARED_LIBRARY)'
+        echo "\$(call import-module,python/$PYTHON_ABI)"
+    } >$BUILDDIR_SELECT/jni/Android.mk
+    fail_panic "Can't generate $BUILDDIR_SELECT/jni/Android.mk"
+
+    run $NDK_DIR/ndk-build -C $BUILDDIR_SELECT -j$NUM_JOBS APP_ABI=$ABI V=1
+    fail_panic "Can't build python$PYTHON_ABI-$ABI module 'select'"
+
+    log "Install python$PYTHON_ABI-$ABI module 'select' in $PYBIN_INSTALLDIR_MODULES"
+    run cp -p -T $OBJDIR_SELECT/libselect.so $PYBIN_INSTALLDIR_MODULES/select.so
+    fail_panic "Can't install python$PYTHON_ABI-$ABI module 'select' in $PYBIN_INSTALLDIR_MODULES"
+
+# unicodedata
+    local BUILDDIR_UNICODEDATA="$BUILDDIR/unicodedata"
+    local OBJDIR_UNICODEDATA="$BUILDDIR_UNICODEDATA/obj/local/$ABI"
+
+    run mkdir -p "$BUILDDIR_UNICODEDATA/jni"
+    fail_panic "Can't create directory: $BUILDDIR_UNICODEDATA/jni"
+
+    {
+        echo 'LOCAL_PATH := $(call my-dir)'
+        echo 'include $(CLEAR_VARS)'
+        echo 'LOCAL_MODULE := unicodedata'
+        echo "MY_PYTHON_SRC_ROOT := $PYTHON_SRCDIR"
+        echo 'LOCAL_SRC_FILES := \'
+        echo '  $(MY_PYTHON_SRC_ROOT)/Modules/unicodedata.c'
+        echo 'LOCAL_STATIC_LIBRARIES := python_shared'
+        echo 'include $(BUILD_SHARED_LIBRARY)'
+        echo "\$(call import-module,python/$PYTHON_ABI)"
+    } >$BUILDDIR_UNICODEDATA/jni/Android.mk
+    fail_panic "Can't generate $BUILDDIR_UNICODEDATA/jni/Android.mk"
+
+    run $NDK_DIR/ndk-build -C $BUILDDIR_UNICODEDATA -j$NUM_JOBS APP_ABI=$ABI V=1
+    fail_panic "Can't build python$PYTHON_ABI-$ABI module 'unicodedata'"
+
+    log "Install python$PYTHON_ABI-$ABI module 'unicodedata' in $PYBIN_INSTALLDIR_MODULES"
+    run cp -p -T $OBJDIR_UNICODEDATA/libunicodedata.so $PYBIN_INSTALLDIR_MODULES/unicodedata.so
+    fail_panic "Can't install python$PYTHON_ABI-$ABI module 'unicodedata' in $PYBIN_INSTALLDIR_MODULES"
+}
+
+if [ -n "$PACKAGE_DIR" ]; then
+    PACKAGE_NAME="python${PYTHON_MAJOR_VERSION}.${PYTHON_MINOR_VERSION}-headers.tar.xz"
+    echo "Look for: $PACKAGE_NAME"
+    try_cached_package "$PACKAGE_DIR" "$PACKAGE_NAME" no_exit
+    if [ $? -eq 0 ]; then
+        PYTHON_HEADERS_NEED_PACKAGE=no
+    else
+        PYTHON_HEADERS_NEED_PACKAGE=yes
+    fi
+fi
+
+BUILT_ABIS=""
+for ABI in $ABIS; do
+    DO_BUILD_PACKAGE="yes"
+    if [ -n "$PACKAGE_DIR" ]; then
+        PACKAGE_NAME="python${PYTHON_MAJOR_VERSION}.${PYTHON_MINOR_VERSION}-libs-${ABI}.tar.xz"
+        echo "Look for: $PACKAGE_NAME"
+        try_cached_package "$PACKAGE_DIR" "$PACKAGE_NAME" no_exit
+        if [ $? -eq 0 ]; then
+            if [ "$PYTHON_HEADERS_NEED_PACKAGE" = "yes" -a -z "$BUILT_ABIS" ]; then
+                BUILT_ABIS="$BUILT_ABIS $ABI"
+            else
+                DO_BUILD_PACKAGE="no"
+            fi
+        else
+            BUILT_ABIS="$BUILT_ABIS $ABI"
+        fi
+    fi
+    if [ "$DO_BUILD_PACKAGE" = "yes" ]; then
+        build_python_for_abi $ABI "$BUILD_DIR/$ABI"
+    fi
+done
+
+if [ -n "$PACKAGE_DIR" ]; then
+    if [ "$PYTHON_HEADERS_NEED_PACKAGE" = "yes" ]; then
+        FILES="$PYTHON_SUBDIR/$PYTHON_ABI/include"
+        PACKAGE_NAME="python${PYTHON_MAJOR_VERSION}.${PYTHON_MINOR_VERSION}-headers.tar.xz"
+        PACKAGE="$PACKAGE_DIR/$PACKAGE_NAME"
+        dump "Packaging: $PACKAGE"
+        pack_archive "$PACKAGE" "$NDK_DIR" "$FILES"
+        fail_panic "Can't package python headers"
+        cache_package "$PACKAGE_DIR" "$PACKAGE_NAME"
+    fi
+
+    for ABI in $BUILT_ABIS; do
+        FILES="$PYTHON_SUBDIR/$PYTHON_ABI/libs/$ABI"
+        PACKAGE_NAME="python${PYTHON_MAJOR_VERSION}.${PYTHON_MINOR_VERSION}-libs-${ABI}.tar.xz"
+        PACKAGE="$PACKAGE_DIR/$PACKAGE_NAME"
+        dump "Packaging: $PACKAGE"
+        pack_archive "$PACKAGE" "$NDK_DIR" "$FILES"
+        fail_panic "Can't package python $ABI libs"
+        cache_package "$PACKAGE_DIR" "$PACKAGE_NAME"
+    done
+fi
+
+if [ -z "$OPTION_BUILD_DIR" ]; then
+    log "Cleaning up..."
+    rm -rf $BUILD_DIR
+else
+    log "Don't forget to cleanup: $BUILD_DIR"
+fi
+
+log "Done!"
diff --git a/src/main/python/lbrynetservice.py b/src/main/python/lbrynetservice.py
index d156f44..f95ef63 100644
--- a/src/main/python/lbrynetservice.py
+++ b/src/main/python/lbrynetservice.py
@@ -20,6 +20,7 @@ lbrynet.androidhelpers.paths.android_app_external_storage_dir = lambda: lbrynet_
 # Retrieve the Anroid keystore
 ks = lbrynet_utils.initKeyStore(service.getApplicationContext());
 
+'''
 import lbrynet.daemon.auth
 from lbrynet.daemon.auth.util import APIKey, API_KEY_NAME
 
@@ -49,10 +50,10 @@ def initialize_api_key_file(key_path):
         keys.update({new_api_key.name: new_api_key})
         save_api_keys(keys, key_path)
 
-
 lbrynet.daemon.auth.util.load_api_keys = load_api_keys
 lbrynet.daemon.auth.util.save_api_keys = save_api_keys
 lbrynet.daemon.auth.util.initialize_api_key_file = initialize_api_key_file
+'''
 
 # Keyring backend
 class LbryAndroidKeyring(keyring.backend.KeyringBackend):
@@ -76,7 +77,6 @@ keyring.set_keyring(LbryAndroidKeyring())
 import logging.handlers
 from lbrynet.core import log_support
 from twisted.internet import defer, reactor
-from jsonrpc.proxy import JSONRPCProxy
 
 from lbrynet import analytics
 from lbrynet import conf
@@ -128,7 +128,8 @@ def start():
     # TODO: specify components, initialise auth
     conf.settings.update({
         'components_to_skip': [PEER_PROTOCOL_SERVER_COMPONENT, REFLECTOR_COMPONENT],
-        'concurrent_announcers': 0
+        'concurrent_announcers': 0,
+        'use_upnp': False
     })
 
     log.info('Final Settings: %s', conf.settings.get_current_settings_dict())