gh-116622: Android sysconfig updates (#118352)

This commit is contained in:
Malcolm Smith 2024-05-01 17:47:54 +01:00 committed by GitHub
parent 6d12f4469c
commit 75955110a6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 53 additions and 5 deletions

View 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"

View 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"

View 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")

View File

@ -0,0 +1,2 @@
On Android, :any:`sysconfig.get_platform` now returns the format specified
by :pep:`738`.

7
configure generated vendored
View File

@ -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

View 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]
)