Skip to content

Commit

Permalink
pythongh-71052: Fix several Android build issues (python#115955)
Browse files Browse the repository at this point in the history
This change is part of the work on PEP-738: Adding Android as a 
supported platform.

* Remove the "1.0" suffix from libpython's filename on Android, which 
  would prevent Gradle from packaging it into an app. 
* Simplify the build command in the Makefile so that libpython always 
  gets given an SONAME with the `-Wl-h` argument, even if the SONAME is
  identical to the actual filename.
* Disable a number of functions on Android which can be compiled and 
  linked against, but always fail at runtime. As a result, the native
  _multiprocessing module is no longer built for Android.
* pythongh-115390 (bee7bb3) added some pre-determined results to the 
  configure script for things that can't be autodetected when
  cross-compiling; this change adds Android to these where appropriate.
* Add a couple more pre-determined results for Android, and making them 
  cover iOS as well. This means the --enable-ipv6 configure option will 
  no longer be required on either platform.
  • Loading branch information
mhsmith authored and diegorusso committed Apr 17, 2024
1 parent 589e05b commit 8f69612
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 21 deletions.
2 changes: 2 additions & 0 deletions Lib/ctypes/__init__.py
Expand Up @@ -468,6 +468,8 @@ def LoadLibrary(self, name):

if _os.name == "nt":
pythonapi = PyDLL("python dll", None, _sys.dllhandle)
elif hasattr(_sys, "getandroidapilevel"):
pythonapi = PyDLL("libpython%d.%d.so" % _sys.version_info[:2])
elif _sys.platform == "cygwin":
pythonapi = PyDLL("libpython%d.%d.dll" % _sys.version_info[:2])
else:
Expand Down
6 changes: 2 additions & 4 deletions Makefile.pre.in
Expand Up @@ -859,11 +859,9 @@ $(LIBRARY): $(LIBRARY_OBJS)
$(AR) $(ARFLAGS) $@ $(LIBRARY_OBJS)

libpython$(LDVERSION).so: $(LIBRARY_OBJS) $(DTRACE_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM); \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM)
if test $(INSTSONAME) != $@; then \
$(LN) -f $(INSTSONAME) $@; \
else \
$(BLDSHARED) -o $@ $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM); \
fi

libpython3.so: libpython$(LDVERSION).so
Expand Down
@@ -0,0 +1 @@
Fix several Android build issues
2 changes: 1 addition & 1 deletion Modules/_multiprocessing/multiprocessing.c
Expand Up @@ -181,7 +181,7 @@ static PyMethodDef module_methods[] = {
_MULTIPROCESSING_RECV_METHODDEF
_MULTIPROCESSING_SEND_METHODDEF
#endif
#if !defined(POSIX_SEMAPHORES_NOT_ENABLED) && !defined(__ANDROID__)
#if !defined(POSIX_SEMAPHORES_NOT_ENABLED)
_MULTIPROCESSING_SEM_UNLINK_METHODDEF
#endif
{NULL}
Expand Down
47 changes: 40 additions & 7 deletions configure

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

50 changes: 41 additions & 9 deletions configure.ac
Expand Up @@ -1443,7 +1443,13 @@ if test $enable_shared = "yes"; then
LDLIBRARY='libpython$(LDVERSION).so'
BLDLIBRARY='-L. -lpython$(LDVERSION)'
RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
INSTSONAME="$LDLIBRARY".$SOVERSION

# The Android Gradle plugin will only package libraries whose names end
# with ".so".
if test "$ac_sys_system" != "Linux-android"; then
INSTSONAME="$LDLIBRARY".$SOVERSION
fi

if test "$with_pydebug" != yes
then
PY3LIBRARY=libpython3.so
Expand Down Expand Up @@ -3675,7 +3681,14 @@ int main(void)
}]])],
[ac_cv_aligned_required=no],
[ac_cv_aligned_required=yes],
[ac_cv_aligned_required=yes])
[
# "yes" changes the hash function to FNV, which causes problems with Numba
# (https://github.com/numba/numba/blob/0.59.0/numba/cpython/hashing.py#L470).
if test "$ac_sys_system" = "Linux-android"; then
ac_cv_aligned_required=no
else
ac_cv_aligned_required=yes
fi])
])
if test "$ac_cv_aligned_required" = yes ; then
AC_DEFINE([HAVE_ALIGNED_REQUIRED], [1],
Expand Down Expand Up @@ -4872,6 +4885,22 @@ else
AC_MSG_RESULT([$MACHDEP_OBJS])
fi

if test "$ac_sys_system" = "Linux-android"; then
# When these functions are used in an unprivileged process, they crash rather
# than returning an error.
privileged_funcs="chroot initgroups setegid seteuid setgid setregid setresgid
setresuid setreuid setuid"

# These functions are unimplemented and always return an error.
unimplemented_funcs="sem_open sem_unlink"

for name in $privileged_funcs $unimplemented_funcs; do
AS_VAR_PUSHDEF([func_var], [ac_cv_func_$name])
AS_VAR_SET([func_var], [no])
AS_VAR_POPDEF([func_var])
done
fi

# checks for library functions
AC_CHECK_FUNCS([ \
accept4 alarm bind_textdomain_codeset chmod chown clock closefrom close_range confstr \
Expand Down Expand Up @@ -5216,10 +5245,11 @@ AC_CHECK_FUNCS([clock_getres], [], [
])
])

# On iOS, clock_settime can be linked (so it is found by
# configure), but it raises a runtime error if used because apps can't change
# the clock. Force the symbol off.
if test "$ac_sys_system" != "iOS" ; then
# On Android and iOS, clock_settime can be linked (so it is found by
# configure), but when used in an unprivileged process, it crashes rather than
# returning an error. Force the symbol off.
if test "$ac_sys_system" != "Linux-android" && test "$ac_sys_system" != "iOS"
then
AC_CHECK_FUNCS([clock_settime], [], [
AC_CHECK_LIB([rt], [clock_settime], [
AC_DEFINE([HAVE_CLOCK_SETTIME], [1])
Expand Down Expand Up @@ -5371,7 +5401,9 @@ int main(void)
[ac_cv_buggy_getaddrinfo=no],
[ac_cv_buggy_getaddrinfo=yes],
[
if test "${enable_ipv6+set}" = set; then
if test "$ac_sys_system" = "Linux-android" || test "$ac_sys_system" = "iOS"; then
ac_cv_buggy_getaddrinfo="no"
elif test "${enable_ipv6+set}" = set; then
ac_cv_buggy_getaddrinfo="no -- configured with --(en|dis)able-ipv6"
else
ac_cv_buggy_getaddrinfo=yes
Expand Down Expand Up @@ -6589,9 +6621,9 @@ CPPFLAGS=$ac_save_cppflags
AC_MSG_NOTICE([checking for device files])

dnl NOTE: Inform user how to proceed with files when cross compiling.
dnl iOS cross-compile builds are predictable; they won't ever
dnl Some cross-compile builds are predictable; they won't ever
dnl have /dev/ptmx or /dev/ptc, so we can set them explicitly.
if test "$ac_sys_system" = "iOS" ; then
if test "$ac_sys_system" = "Linux-android" || test "$ac_sys_system" = "iOS"; then
ac_cv_file__dev_ptmx=no
ac_cv_file__dev_ptc=no
else
Expand Down

0 comments on commit 8f69612

Please sign in to comment.