Skip to content

Commit

Permalink
Fix python2's build and clean up the recipe
Browse files Browse the repository at this point in the history
Actions taken:

  - I found that a lot of basic python modules get not compiled. Here we solve that issue by creating a patch (fix-missing-extensions.patch) adapted from the one applied to the python3's master branch. This new patch replaces the "fix-modules-initialization" (which worked but not compiled the necessary modules into .so files). Now all the needed modules should be present.

    * Note: **Should be mentioned that the ctypes module builds without a problem for python2 (no need to link with custom libffi as we do in python 3 in pr kivy#1465)**

  - I reviewed all the patches to move all the unneeded into a sub folder (maybe we can need some of them...)

    * Note: all the patches where made to be applied into the old python2's build system, and only those which allows the native build to succeed and the ones which fix python initialization should be needed with the new build system

  - Rename patches to be clear and to remove some upper cases and versions (we will not have many more future versions for python2 and I think that removing this versions make the code more readable)
  • Loading branch information
opacam committed Nov 19, 2018
1 parent 23bf987 commit 824d964
Show file tree
Hide file tree
Showing 24 changed files with 143 additions and 121 deletions.
37 changes: 6 additions & 31 deletions pythonforandroid/recipes/python2/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
from pythonforandroid.python import GuestPythonRecipe
from pythonforandroid.patching import (
is_darwin, is_api_gt, check_all, is_api_lt, is_ndk)


class Python2Recipe(GuestPythonRecipe):
Expand All @@ -24,32 +22,12 @@ class Python2Recipe(GuestPythonRecipe):

patches = [
# new 2.7.15 patches
# ('patches/Python-2.7.15-fix-api-minor-than-21.patch',
# is_api_lt(21)), # todo: this should be tested
'patches/fix-modules-initialization.patch',
'patches/Python_{version}-ctypes-libffi-fix-configure.patch',
'patches/ffi-config.sub-{version}.patch',
'patches/fix-locale-{version}.patch',
'patches/modules-locales-{version}.patch',
'patches/fix-platform-{version}.patch',
# migrated patches from 2.7.2
'patches/fix-gethostbyaddr.patch',
'patches/fix-filesystemdefaultencoding.patch',
'patches/fix-termios.patch',
'patches/custom-loader.patch',
'patches/fix-remove-corefoundation.patch',
'patches/fix-dynamic-lookup.patch',
'patches/fix-dlfcn.patch',
'patches/ctypes-find-library.patch',
'patches/Python-{version}-ctypes-disable-wchar.patch',
'patches/disable-modules.patch',
'patches/verbose-compilation.patch',
# migrated special patches from 2.7.2
('patches/fix-configure-darwin.patch', is_darwin),
('patches/fix-distutils-darwin.patch', is_darwin),
('patches/fix-ftime-removal.patch', is_api_gt(19)),
('patches/disable-openpty.patch', check_all(
is_api_lt(21), is_ndk('crystax')))
# ('patches/fix-api-minor-than-21.patch',
# is_api_lt(21)), # Todo: this should be tested
'patches/fix-missing-extensions.patch',
'patches/fix-filesystem-default-encoding.patch',
'patches/fix-locale.patch',
'patches/fix-init-site.patch',
]

configure_args = ('--host={android_host}',
Expand All @@ -62,10 +40,7 @@ class Python2Recipe(GuestPythonRecipe):
'ac_cv_file__dev_ptc=no',
'--without-ensurepip',
'ac_cv_little_endian_double=yes',

# why python3 works without it?
'ac_cv_header_langinfo_h=no',

'--prefix={prefix}',
'--exec-prefix={exec_prefix}')

Expand Down
17 changes: 17 additions & 0 deletions pythonforandroid/recipes/python2/patches/fix-init-site.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
--- 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;
120 changes: 120 additions & 0 deletions pythonforandroid/recipes/python2/patches/fix-missing-extensions.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
diff -Naurp Python-2.7.15/Modules/Setup.dist.orig Python-2.7.15/Modules/Setup.dist
--- Python-2.7.15/Modules/Setup.dist.orig 2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Modules/Setup.dist 2018-11-17 20:40:20.153518694 +0100
@@ -464,7 +464,7 @@
# 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
+zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz

# Interface to the Expat XML parser
#
diff -Naurp Python-2.7.15.orig/Makefile.pre.in Python-2.7.15/Makefile.pre.in
--- Python-2.7.15.orig/Makefile.pre.in 2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Makefile.pre.in 2018-11-18 00:43:58.777379280 +0100
@@ -20,6 +20,7 @@

# === Variables set by makesetup ===

+MODNAMES= _MODNAMES_
MODOBJS= _MODOBJS_
MODLIBS= _MODLIBS_

diff -Naurp Python-2.7.15.orig/Modules/_ctypes/libffi/src/arm/sysv.S Python-2.7.15/Modules/_ctypes/libffi/src/arm/sysv.S
--- Python-2.7.15.orig/Modules/_ctypes/libffi/src/arm/sysv.S 2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Modules/_ctypes/libffi/src/arm/sysv.S 2018-11-17 22:28:50.925456603 +0100
@@ -396,7 +396,7 @@ LSYM(Lbase_args):
beq LSYM(Lepilogue_vfp)

cmp r3, #FFI_TYPE_SINT64
- stmeqia r2, {r0, r1}
+ stmiaeq r2, {r0, r1}
beq LSYM(Lepilogue_vfp)

cmp r3, #FFI_TYPE_FLOAT
diff -Naurp Python-2.7.15.orig/Modules/makesetup Python-2.7.15/Modules/makesetup
--- Python-2.7.15.orig/Modules/makesetup 2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Modules/makesetup 2018-11-18 00:43:10.289379743 +0100
@@ -110,6 +110,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
# Rules appended by makedepend
" >$rulesf
DEFS=
+ NAMES=
MODS=
SHAREDMODS=
OBJS=
@@ -181,7 +182,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
*.*) echo 1>&2 "bad word $arg in $line"
exit 1;;
-u) skip=libs; libs="$libs -u";;
- [a-zA-Z_]*) mods="$mods $arg";;
+ [a-zA-Z_]*) NAMES="$NAMES $arg"; mods="$mods $arg";;
*) echo 1>&2 "bad word $arg in $line"
exit 1;;
esac
@@ -284,6 +285,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
echo "1i\\" >$sedf
str="# Generated automatically from $makepre by makesetup."
echo "$str" >>$sedf
+ echo "s%_MODNAMES_%$NAMES%" >>$sedf
echo "s%_MODOBJS_%$OBJS%" >>$sedf
echo "s%_MODLIBS_%$LIBS%" >>$sedf
echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf
diff -Naurp Python-2.7.15.orig/setup.py Python-2.7.15/setup.py
--- Python-2.7.15.orig/setup.py 2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/setup.py 2018-11-18 00:40:50.021381080 +0100
@@ -217,7 +217,11 @@ class PyBuildExt(build_ext):
# Python header files
headers = [sysconfig.get_config_h_filename()]
headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
- for ext in self.extensions[:]:
+ # The sysconfig variable built by makesetup, listing the already
+ # built modules as configured by the Setup files.
+ modnames = sysconfig.get_config_var('MODNAMES').split()
+ removed_modules = []
+ for ext in self.extensions:
ext.sources = [ find_module_file(filename, moddirlist)
for filename in ext.sources ]
if ext.depends is not None:
@@ -231,10 +235,10 @@ class PyBuildExt(build_ext):
# platform specific include directories
ext.include_dirs.extend(incdirlist)

- # If a module has already been built statically,
- # don't build it here
- if ext.name in sys.builtin_module_names:
- self.extensions.remove(ext)
+ # If a module has already been built by the Makefile,
+ # don't build it here.
+ if ext.name in modnames:
+ removed_modules.append(ext)

# Parse Modules/Setup and Modules/Setup.local to figure out which
# modules are turned on in the file.
@@ -249,8 +253,9 @@ class PyBuildExt(build_ext):
input.close()

for ext in self.extensions[:]:
- if ext.name in remove_modules:
- self.extensions.remove(ext)
+ if removed_modules:
+ self.extensions = [x for x in self.extensions if x not in
+ removed_modules]

# When you run "make CC=altcc" or something similar, you really want
# those environment variables passed into the setup.py phase. Here's
@@ -290,6 +295,13 @@ class PyBuildExt(build_ext):
" detect_modules() for the module's name.")
print

+ if removed_modules:
+ print("The following modules found by detect_modules() in"
+ " setup.py, have been")
+ print("built by the Makefile instead, as configured by the"
+ " Setup files:")
+ print_three_column([ext.name for ext in removed_modules])
+
if self.failed:
failed = self.failed[:]
print

This file was deleted.

0 comments on commit 824d964

Please sign in to comment.