diff -ru Python-3.3.5/Lib/platform.py Python-3.3.5-android/Lib/platform.py --- Python-3.3.5/Lib/platform.py 2014-03-09 09:40:13.000000000 +0100 +++ Python-3.3.5-android/Lib/platform.py 2014-08-04 22:19:36.000000000 +0200 @@ -368,6 +368,63 @@ supported_dists=supported_dists, full_distribution_name=0) +_android_environment_vars = ( + 'ANDROID_PRIVATE', 'ANDROID_ARGUMENT', 'ANDROID_APP_PATH', 'ANDROID_DATA', + 'ANDROID_PROPERTY_WORKSPACE', 'ANDROID_BOOTLOGO') +_android_version_property = 'ro.build.version.release' +_android_buildstr_property = 'ro.build.version.full' + +def android_version(version='', buildstr=''): + """ Attempt to get the Android version number and build string. + + The function checks for the getprop binary to retrieve build info, + and falls back to manually reading /system/build.prop if available. + + Returns a (version, buildstr) tuple which defaults to the args given + as parameters. + """ + if not any(os.getenv(e) for e in _android_environment_vars): + # Probably not on Android... + return version, buildstr + + version_obtained = False + buildstr_obtained = False + + # Try the 'official' API tool first, since /system/build.prop might + # not be the only source for properties. + if os.access('/system/bin/getprop', os.X_OK): + try: + output = subprocess.check_output(['/system/bin/getprop', + _android_version_property]) + version = output.decode('ascii').strip() + version_obtained = True + except (subprocess.CalledProcessError, UnicodeDecodeError): + pass + + try: + output = subprocess.check_output(['/system/bin/getprop', + _android_buildstr_property]) + buildstr = output.decode('ascii').strip() + buildstr_obtained = True + except (subprocess.CalledProcessError, UnicodeDecodeError): + pass + done = version_obtained and buildstr_obtained + + # Fall back to parsing /system/build.prop manually. + if not done and os.path.isfile('/system/build.prop'): + for line in open('/system/build.prop'): + if '=' not in line: + continue + key, val = line.split('=') + key = key.strip() + + if not version_obtained and key == _android_version_property: + version = val.strip() + elif not buildstr_obtained and key == _android_buildstr_property: + buildstr = val.strip() + + return version, buildstr + def popen(cmd, mode='r', bufsize=-1): """ Portable popen() interface. diff -ru Python-3.3.5/Lib/subprocess.py Python-3.3.5-android/Lib/subprocess.py --- Python-3.3.5/Lib/subprocess.py 2014-03-09 09:40:13.000000000 +0100 +++ Python-3.3.5-android/Lib/subprocess.py 2014-08-04 22:19:36.000000000 +0200 @@ -1343,9 +1343,18 @@ args = list(args) if shell: - args = ["/bin/sh", "-c"] + args if executable: - args[0] = executable + main = executable + elif os.path.isfile('/bin/sh'): + main = '/bin/sh' + else: + import platform + if platform.android_version()[0]: + main = '/system/bin/sh' + else: + raise RuntimeError('Could not find system shell') + + args = [main, "-c"] + args if executable is None: executable = args[0] diff -ru Python-3.3.5/Lib/test/test_subprocess.py Python-3.3.5-android/Lib/test/test_subprocess.py --- Python-3.3.5/Lib/test/test_subprocess.py 2014-03-09 09:40:19.000000000 +0100 +++ Python-3.3.5-android/Lib/test/test_subprocess.py 2014-08-04 22:19:36.000000000 +0200 @@ -17,6 +17,7 @@ import shutil import gc import textwrap +import platform try: import resource @@ -1356,7 +1357,10 @@ fd, fname = mkstemp() # reopen in text mode with open(fd, "w", errors="surrogateescape") as fobj: - fobj.write("#!/bin/sh\n") + if platform.android_version()[0]: + fobj.write('#!/system/bin/sh\n') + else: + fobj.write("#!/bin/sh\n") fobj.write("exec '%s' -c 'import sys; sys.exit(47)'\n" % sys.executable) os.chmod(fname, 0o700) @@ -1401,7 +1405,10 @@ fd, fname = mkstemp() # reopen in text mode with open(fd, "w", errors="surrogateescape") as fobj: - fobj.write("#!/bin/sh\n") + if platform.android_version()[0]: + fobj.write('#!/system/bin/sh\n') + else: + fobj.write("#!/bin/sh\n") fobj.write("exec '%s' -c 'import sys; sys.exit(47)'\n" % sys.executable) os.chmod(fname, 0o700) diff -ru Python-3.4.2/Modules/pwdmodule.c Python-3.4.2-android/Modules/pwdmodule.c --- Python-3.4.2/Modules/pwdmodule.c 2015-02-24 23:06:31.000000000 +0100 +++ Python-3.4.2-android/Modules/pwdmodule.c 2015-02-24 23:09:14.000000000 +0100 @@ -72,7 +72,11 @@ SETS(setIndex++, p->pw_passwd); PyStructSequence_SET_ITEM(v, setIndex++, _PyLong_FromUid(p->pw_uid)); PyStructSequence_SET_ITEM(v, setIndex++, _PyLong_FromGid(p->pw_gid)); +#if !defined(__ANDROID__) SETS(setIndex++, p->pw_gecos); +#else + SETS(setIndex++, ""); +#endif SETS(setIndex++, p->pw_dir); SETS(setIndex++, p->pw_shell); diff -ru Python-3.3.5/Modules/socketmodule.c Python-3.3.5-android/Modules/socketmodule.c --- Python-3.3.5/Modules/socketmodule.c 2014-03-09 09:40:28.000000000 +0100 +++ Python-3.3.5-android/Modules/socketmodule.c 2014-08-04 22:19:36.000000000 +0200 @@ -150,7 +150,7 @@ On the other hand, not all Linux versions agree, so there the settings computed by the configure script are needed! */ -#ifndef linux +#if !defined(linux) || __ANDROID__ # undef HAVE_GETHOSTBYNAME_R_3_ARG # undef HAVE_GETHOSTBYNAME_R_5_ARG # undef HAVE_GETHOSTBYNAME_R_6_ARG @@ -169,7 +169,7 @@ # define HAVE_GETHOSTBYNAME_R_3_ARG # elif defined(__sun) || defined(__sgi) # define HAVE_GETHOSTBYNAME_R_5_ARG -# elif defined(linux) +# elif defined(linux) && !__ANDROID__ /* Rely on the configure script */ # else # undef HAVE_GETHOSTBYNAME_R diff -ru Python-3.3.5/Modules/posixmodule.c Python-3.3.5-android/Modules/posixmodule.c --- Python-3.3.5/Modules/posixmodule.c 2014-03-09 08:40:28.000000000 +0000 +++ Python-3.3.5-android/Modules/posixmodule.c 2015-02-24 19:57:05.368843433 +0000 @@ -403,6 +403,11 @@ #endif #endif +/* Android doesn't expose AT_EACCESS - manually define it. */ +#if !defined(AT_EACCESS) && defined(__ANDROID__) +#define AT_EACCESS 0x200 +#endif + #ifdef MS_WINDOWS static int diff -ru Python-3.3.5/Python/pytime.c Python-3.3.5-android/Python/pytime.c --- Python-3.3.5/Python/pytime.c 2015-02-23 11:54:25.000000000 -0500 +++ Python-3.3.5-android/Python/pytime.c 2015-02-23 11:55:19.000000000 -0500 @@ -3,7 +3,7 @@ #include #endif -#if defined(__APPLE__) && defined(HAVE_GETTIMEOFDAY) && defined(HAVE_FTIME) +#if (defined(__APPLE__) || defined(__ANDROID__)) && defined(HAVE_GETTIMEOFDAY) && defined(HAVE_FTIME) /* * _PyTime_gettimeofday falls back to ftime when getttimeofday fails because the latter * might fail on some platforms. This fallback is unwanted on MacOSX because diff -ru Python-3.4.2/configure Python-3.4.2-android/configure --- Python-3.4.2/configure 2015-02-24 23:18:31.000000000 +0100 +++ Python-3.4.2-android/configure 2015-03-01 20:15:02.000000000 +0100 @@ -5406,6 +5406,34 @@ MULTIARCH=$($CC --print-multiarch 2>/dev/null) +# Test if we're running on Android. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if target is Android-based" >&5 +$as_echo_n "checking if target is Android-based... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#if __ANDROID__ +yes +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + with_android=yes + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + with_android=no + + +fi +rm -f conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: checking LIBRARY" >&5 @@ -5650,7 +5678,14 @@ SOVERSION=`echo $SOVERSION|cut -d "." -f 1` ;; esac - INSTSONAME="$LDLIBRARY".$SOVERSION + + if test "$with_android" != yes + then + INSTSONAME="$LDLIBRARY".$SOVERSION + else + INSTSONAME="$LDLIBRARY" + fi + if test "$with_pydebug" != yes then PY3LIBRARY=libpython3.so diff -ru Python-3.4.2/configure.ac Python-3.4.2-android/configure.ac --- Python-3.4.2/configure.ac 2015-02-24 23:18:31.000000000 +0100 +++ Python-3.4.2-android/configure.ac 2015-03-01 20:14:54.000000000 +0100 @@ -796,6 +796,21 @@ MULTIARCH=$($CC --print-multiarch 2>/dev/null) AC_SUBST(MULTIARCH) +# Test if we're running on Android. +AC_MSG_CHECKING(if target is Android-based) +AC_EGREP_CPP(yes, +[ +#if __ANDROID__ +yes +#endif +], [ + AC_MSG_RESULT(yes) + with_android=yes + ], [ + AC_MSG_RESULT(no) + with_android=no + ] +) AC_SUBST(LIBRARY) AC_MSG_CHECKING(LIBRARY) @@ -970,7 +985,14 @@ SOVERSION=`echo $SOVERSION|cut -d "." -f 1` ;; esac - INSTSONAME="$LDLIBRARY".$SOVERSION + + if test "$with_android" != yes + then + INSTSONAME="$LDLIBRARY".$SOVERSION + else + INSTSONAME="$LDLIBRARY" + fi + if test "$with_pydebug" != yes then PY3LIBRARY=libpython3.so diff -ru Python-3.4.2/Makefile.pre.in Python-3.4.2-android/Makefile.pre.in --- Python-3.4.2/Makefile.pre.in 2015-03-04 16:25:36.000000000 +0100 +++ Python-3.4.2-android/Makefile.pre.in 2015-03-04 16:27:27.000000000 +0100 @@ -568,7 +568,7 @@ *\ -s*|s*) quiet="-q";; \ *) quiet="";; \ esac; \ - $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ + $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED) -lpython$(LDVERSION)' OPT='$(OPT)' \ _TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \ $(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build diff -Nru Python-3.4.2/Makefile.pre.in Python-3.4.2-android/Makefile.pre.in --- Python-3.4.2/Makefile.pre.in 2015-06-27 17:04:23.885777456 +0000 +++ Python-3.4.2-android/Makefile.pre.in 2015-06-27 17:05:27.709777315 +0000 @@ -585,11 +585,9 @@ $(RANLIB) $@ libpython$(LDVERSION).so: $(LIBRARY_OBJS) + $(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \ if test $(INSTSONAME) != $(LDLIBRARY); then \ - $(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \ $(LN) -f $(INSTSONAME) $@; \ - else \ - $(BLDSHARED) -o $@ $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \ fi libpython3.so: libpython$(LDVERSION).so