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"
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"
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) '
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")
--- /dev/null
+On Android, :any:`sysconfig.get_platform` now returns the format specified
+by :pep:`738`.
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
[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]
)