New submission from Cyd Haselton:

This is a (hopefully) complete list of patches and modifications required to 
natively build Python 3.4.2 on an Android device where
patches == listed issues in this bug tracker
modifications (mods) == unsubmitted patches and/or edits made to source

CAVEATS
Build was completed on a tablet running Android 4.4.2 and within the KBOX 
environment; an app that simulates a Linux filesystem by using a ported version 
of fakechroot.  Details of the environment can be found here: 
http://kevinboone.net/kbox2_how_it_works.html. NOTE: During the Python build it 
was necessary to patch this environment with a modified version of fakechroot; 
the KBOX version currently available as of 2.21.2015 may not contain the 
modified fakechroot.

CONFIGURE && POST-CONFIGURE && MAKE
The configure command was run with the following parameters
--enable-shared
--without-ensurepip
--prefix=/usr/python

After running configure. changes were made to pyconfig.h to account for various 
platform limitations and to Setup to ensure that a) all modules specified were 
built as shared and b) modules that used symbols from libpython were explicitly 
linked to said library. See attached pyconfig.h and Setup.

Make fails when the newly built python binary tries to execute and run 
setup.py. This is resolved by copying the shared library from the build 
directory to /lib in the KBOX environment.  Otherwise make && make install runs 
without errors provided patches/mods are applied. I did not run make test or 
the equivalent for this build.

PATCHES/MODS
The attached patches from the following issues must be applied:
http://bugs.python.org/issue20305
http://bugs.python.org/issue16353 (NOTE: use patch with 'defpath' not 
'confstr', which is not supported in Android)
http://bugs.python.org/issue21668

The following modifications to source must be made:
The instructions under 'Code Changes' at this link: 
https://code.google.com/p/python-for-android/wiki/CrossCompilingPython
The attached patch, contributed by Ryan Gonzales (patch.diff)
The changes listed below by file (apologies for formatting)
        
/* patch for strdup segfault issue in readline.c */
 #define RESTORE_LOCALE(sl) { if (sl) { setlocale(LC_CTYPE, sl); free(sl); } }
 
 char *_locale = setlocale(LC_CTYPE, NULL); 
 char *saved_locale; 
 if(!_locale) 
 _locale = ""; 
 saved_locale = strdup(_locale);
 
 
 char *saved_locale = setlocale(LC_CTYPE, NULL);
    if (saved_locale != NULL) {
        saved_locale = strdup(saved_locale);
        if (!saved_locale)
            Py_FatalError("not enough memory to save locale");
    }
    

/* fix for Lib/ctypes/__init.py__ */
 30 DEFAULT_MODE ==  RTLD_GLOBAL
 
 /* patch for python.c */
/* here line for oldloc is commented out */
     24     int i, res;
     25     /* char *oldloc; */
     26 #ifdef __FreeBSD__

/* here oldloc lines commented out */
     46
     47   /*  oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
     48    * if (!oldloc) {
     49    *     fprintf(stderr, "out of memory\n");
     50    *     return 1;
     51    *
     52    * }
     53    */

 /* patch for pythonrun.c 307, --309-310, ++311-313 --1009-1012 ++1013-1014 */
 
    305     return get_codec_name(codeset);
    306 #else
    307    char* m;
    308    PyErr_SetNone(PyExc_NotImplementedError);
    309    /*  return NULL; */
    310    /* char* m; */
    311    m = malloc(6);
    312    strcpy(m, "ascii");
    313    return m;
    314 #endif
    315 }
    
   1002 static int
   1003 initfsencoding(PyInterpreterState *interp)
   1004 {
   1005     PyObject *codec;
   1006
   1007     if (Py_FileSystemDefaultEncoding == NULL)
   1008     {
   1009         /* Py_FileSystemDefaultEncoding = get_locale_encoding();
   1010          * if (Py_FileSystemDefaultEncoding == NULL)
   1011          *   Py_FatalError("Py_Initialize: Unable to get the locale 
encoding
   1011 ");
   1012          */
   1013            Py_FileSystemDefaultEncoding = malloc(6);
   1014            strcpy(Py_FileSystemDefaultEncoding, "ascii");
   1015         Py_HasFileSystemDefaultEncoding = 0;
   1016         interp->fscodec_initialized = 1;
   1017         return 0;
   1018     }
   1019
   
/* changes to Lib/plat-linux/DLFCN.py */
     76 # Included from bits/dlfcn.h
     77 # Changed for Android
     78 RTLD_LAZY = 1
     79 RTLD_NOW = 0
     80 #RTLD_BINDING_MASK = 0x3
     81 #RTLD_NOLOAD = 0x00004
     82 RTLD_GLOBAL = 2
     83 RTLD_LOCAL = 0
     84 #RTLD_NODELETE = 0x01000
     85
     86 # Also from Android's dlfcn.h
     87 RTLD_DEFAULT ((void*) 0xffffffff)
     88 RTLD_NEXT     ((void*) 0xfffffffe)
     89

----------
components: Build
files: patch.diff
keywords: patch
messages: 236389
nosy: chaselton
priority: normal
severity: normal
status: open
title: Steps for Android Native Build of Python 3.4.2
versions: Python 3.4
Added file: http://bugs.python.org/file38201/patch.diff

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue23496>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to