]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-116622: Android sysconfig updates (#118352)
authorMalcolm Smith <smith@chaquo.com>
Wed, 1 May 2024 16:47:54 +0000 (17:47 +0100)
committerGitHub <noreply@github.com>
Wed, 1 May 2024 16:47:54 +0000 (16:47 +0000)
Android/android-env.sh
Lib/sysconfig/__init__.py
Lib/test/test_sysconfig.py
Misc/NEWS.d/next/Library/2024-04-27-20-34-56.gh-issue-116622.YlQgXv.rst [new file with mode: 0644]
configure
configure.ac

index 3ce3e035cfb8fe3e8aefbbb02e31acfe6ea5dd56..545d559d93ab36c25128b2b71cf89d8d8d7ce873 100644 (file)
@@ -61,6 +61,12 @@ done
 export CFLAGS=""
 export LDFLAGS="-Wl,--build-id=sha1 -Wl,--no-rosegment"
 
+# Unlike Linux, Android does not implicitly use a dlopened library to resolve
+# relocations in subsequently-loaded libraries, even if RTLD_GLOBAL is used
+# (https://github.com/android/ndk/issues/1244). So any library that fails to
+# build with this flag, would also fail to load at runtime.
+LDFLAGS="$LDFLAGS -Wl,--no-undefined"
+
 # Many packages get away with omitting -lm on Linux, but Android is stricter.
 LDFLAGS="$LDFLAGS -lm"
 
index 70bdecf2138fd95a3230e511e0f680fc0784d674..98a14e5d3a3187b70207357e070650a3c86acddb 100644 (file)
@@ -601,10 +601,22 @@ def get_platform():
     machine = machine.replace('/', '-')
 
     if osname[:5] == "linux":
-        # At least on Linux/Intel, 'machine' is the processor --
-        # i386, etc.
-        # XXX what about Alpha, SPARC, etc?
-        return  f"{osname}-{machine}"
+        if sys.platform == "android":
+            osname = "android"
+            release = get_config_var("ANDROID_API_LEVEL")
+
+            # Wheel tags use the ABI names from Android's own tools.
+            machine = {
+                "x86_64": "x86_64",
+                "i686": "x86",
+                "aarch64": "arm64_v8a",
+                "armv7l": "armeabi_v7a",
+            }[machine]
+        else:
+            # At least on Linux/Intel, 'machine' is the processor --
+            # i386, etc.
+            # XXX what about Alpha, SPARC, etc?
+            return  f"{osname}-{machine}"
     elif osname[:5] == "sunos":
         if release[0] >= "5":           # SunOS 5 == Solaris 2
             osname = "solaris"
index 61c6a5a42502e724fa492df09edb9db31de92414..9233304c6a5327649d8756377ce8e3b533c2e566 100644 (file)
@@ -232,6 +232,11 @@ class TestSysConfig(unittest.TestCase):
         self.assertTrue(cvars)
 
     def test_get_platform(self):
+        # Check the actual platform returns something reasonable.
+        actual_platform = get_platform()
+        self.assertIsInstance(actual_platform, str)
+        self.assertTrue(actual_platform)
+
         # windows XP, 32bits
         os.name = 'nt'
         sys.version = ('2.4.4 (#71, Oct 18 2006, 08:34:43) '
@@ -347,6 +352,21 @@ class TestSysConfig(unittest.TestCase):
 
         self.assertEqual(get_platform(), 'linux-i686')
 
+        # Android
+        os.name = 'posix'
+        sys.platform = 'android'
+        get_config_vars()['ANDROID_API_LEVEL'] = 9
+        for machine, abi in {
+            'x86_64': 'x86_64',
+            'i686': 'x86',
+            'aarch64': 'arm64_v8a',
+            'armv7l': 'armeabi_v7a',
+        }.items():
+            with self.subTest(machine):
+                self._set_uname(('Linux', 'localhost', '3.18.91+',
+                                '#1 Tue Jan 9 20:35:43 UTC 2018', machine))
+                self.assertEqual(get_platform(), f'android-9-{abi}')
+
         # XXX more platforms to tests here
 
     @unittest.skipIf(is_wasi, "Incompatible with WASI mapdir and OOT builds")
diff --git a/Misc/NEWS.d/next/Library/2024-04-27-20-34-56.gh-issue-116622.YlQgXv.rst b/Misc/NEWS.d/next/Library/2024-04-27-20-34-56.gh-issue-116622.YlQgXv.rst
new file mode 100644 (file)
index 0000000..c7c57b6
--- /dev/null
@@ -0,0 +1,2 @@
+On Android, :any:`sysconfig.get_platform` now returns the format specified
+by :pep:`738`.
index 01c00d2198548f5d9f590d5db6a8fc138dcda38e..24e7396e389fd1ee49d9d9ca59c9d498565b2e99 100755 (executable)
--- a/configure
+++ b/configure
@@ -7018,8 +7018,13 @@ case $host/$ac_cv_cc_name in #(
     PY_SUPPORT_TIER=3 ;; #(
     aarch64-apple-ios*/clang) :
     PY_SUPPORT_TIER=3 ;; #(
+    aarch64-*-linux-android/clang) :
+    PY_SUPPORT_TIER=3 ;; #(
+    x86_64-*-linux-android/clang) :
+    PY_SUPPORT_TIER=3 ;; #(
   *) :
-      PY_SUPPORT_TIER=0
+
+  PY_SUPPORT_TIER=0
  ;;
 esac
 
index ae65efeac55366a9663688df49908d70f33bcc2e..0f1177872d9137263b32d19f4c4c26e0f2f715fd 100644 (file)
@@ -1148,6 +1148,9 @@ AS_CASE([$host/$ac_cv_cc_name],
   [x86_64-*-freebsd*/clang],         [PY_SUPPORT_TIER=3], dnl FreeBSD on AMD64
   [aarch64-apple-ios*-simulator/clang],   [PY_SUPPORT_TIER=3], dnl iOS Simulator on arm64
   [aarch64-apple-ios*/clang],             [PY_SUPPORT_TIER=3], dnl iOS on ARM64
+  [aarch64-*-linux-android/clang],   [PY_SUPPORT_TIER=3], dnl Android on ARM64
+  [x86_64-*-linux-android/clang],    [PY_SUPPORT_TIER=3], dnl Android on AMD64
+
   [PY_SUPPORT_TIER=0]
 )