add / update recipes and build changes for Python 3.6.6 compatibility (#315)

* add / update recipes and build changes for Python 3.6.6 compatibility
* include Python 3 apt packages in travis build script
* use Python 3.6 in Travis
* Enable _blake2 and _sha3 in Python 3. Remove unnecessary files.
* change zope.interface version
* update cffi version
This commit is contained in:
Akinwale Ariwodola 2018-10-07 15:59:03 +01:00 committed by GitHub
parent f12460e83a
commit e08f6ee73c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
80 changed files with 2063 additions and 3644 deletions

View file

@ -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

11
Vagrantfile vendored
View file

@ -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

View file

@ -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 =

View file

@ -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 =

View file

@ -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 =

View file

@ -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

View file

@ -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[] = {"."};

View file

@ -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:

View file

@ -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

View file

@ -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(

View file

@ -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

View file

@ -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

View file

@ -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):

View file

@ -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()
'''

View file

@ -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', ],

View file

@ -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()

View file

@ -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():

View file

@ -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()

View file

@ -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),

View file

@ -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={

View file

@ -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:

View file

@ -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')

View file

@ -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,

View file

@ -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()

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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()

View file

@ -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()

14
recipes/idna/__init__.py Normal file
View file

@ -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()

View file

@ -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

View file

@ -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()

View file

@ -0,0 +1,3 @@
APP_OPTIM := release
APP_ABI := all # or armeabi
APP_MODULES := libffi

View file

@ -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()

View file

@ -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

View file

@ -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)

View file

@ -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)):

View file

@ -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()

View file

@ -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

View file

@ -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

View file

@ -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) */

View file

@ -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()

View file

@ -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()

View file

@ -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

View file

@ -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()

View file

@ -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)

View file

@ -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()

View file

@ -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

View file

@ -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
-
## ################################################################
##

View file

@ -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):

View file

@ -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 {}

View file

@ -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,

View file

@ -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;

View file

@ -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

File diff suppressed because it is too large Load diff

View file

@ -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";;

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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 */

View file

@ -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

View file

@ -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);

View file

@ -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;
}

View file

@ -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

View file

@ -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);

View file

@ -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,

View file

@ -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;
}

View file

@ -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()

View file

@ -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\

View file

@ -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()

View file

@ -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()

View file

@ -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()

View file

@ -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([

View file

@ -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()

View file

@ -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]
)
+

View file

@ -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()

View file

@ -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)

View file

@ -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,

921
scripts/build-target-python.sh Executable file
View file

@ -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!"

View file

@ -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())