Skip to content

Commit

Permalink
gh-116622: Android sysconfig updates (#118352)
Browse files Browse the repository at this point in the history
  • Loading branch information
mhsmith authored May 1, 2024
1 parent 6d12f44 commit 7595511
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 5 deletions.
6 changes: 6 additions & 0 deletions Android/android-env.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
20 changes: 16 additions & 4 deletions Lib/sysconfig/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
20 changes: 20 additions & 0 deletions Lib/test/test_sysconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,11 @@ def test_get_config_vars(self):
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) '
Expand Down Expand Up @@ -347,6 +352,21 @@ def test_get_platform(self):

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")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
On Android, :any:`sysconfig.get_platform` now returns the format specified
by :pep:`738`.
7 changes: 6 additions & 1 deletion configure

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

3 changes: 3 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -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]
)

Expand Down

0 comments on commit 7595511

Please sign in to comment.