diff a/configure.ac b/configure.ac --- a/configure.ac +++ b/configure.ac @@ -899,6 +906,25 @@ # checks for UNIX variants that set C preprocessor variables AC_USE_SYSTEM_EXTENSIONS +AC_MSG_CHECKING([for the Android API level]) +cat >> conftest.c < +__ANDROID_API__ +#else +#error not Android +#endif +EOF + +if $CPP $CPPFLAGS conftest.c >conftest.out 2>/dev/null; then + ANDROID_API_LEVEL=`grep -v '^#' conftest.out | grep -v '^ *$'` + AC_MSG_RESULT([$ANDROID_API_LEVEL]) + AC_DEFINE_UNQUOTED(ANDROID_API_LEVEL, $ANDROID_API_LEVEL, [The Android API level.]) +else + AC_MSG_RESULT([not Android]) +fi +rm -f conftest.c conftest.out + # Check for unsupported systems case $ac_sys_system/$ac_sys_release in atheos*|Linux*/1*) diff a/configure b/configure --- a/configure +++ b/configure @@ -5648,6 +5655,32 @@ +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the Android API level" >&5 +$as_echo_n "checking for the Android API level... " >&6; } +cat >> conftest.c < +__ANDROID_API__ +#else +#error not Android +#endif +EOF + +if $CPP $CPPFLAGS conftest.c >conftest.out 2>/dev/null; then + ANDROID_API_LEVEL=`grep -v '^#' conftest.out | grep -v '^ *$'` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ANDROID_API_LEVEL" >&5 +$as_echo "$ANDROID_API_LEVEL" >&6; } + +cat >>confdefs.h <<_ACEOF +#define ANDROID_API_LEVEL $ANDROID_API_LEVEL +_ACEOF + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not Android" >&5 +$as_echo "not Android" >&6; } +fi +rm -f conftest.c conftest.out + # Check for unsupported systems case $ac_sys_system/$ac_sys_release in atheos*|Linux*/1*) diff a/pyconfig.h.in b/pyconfig.h.in --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -12,6 +12,9 @@ support for AIX C++ shared extension modules. */ #undef AIX_GENUINE_CPLUSPLUS +/* The Android API level. */ +#undef ANDROID_API_LEVEL + /* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM mixed-endian order (byte order 45670123) */ #undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 diff a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -405,6 +405,14 @@ suffix = sysconfig.get_config_var('EXT_SUFFIX') self.assertTrue(suffix.endswith('-darwin.so'), suffix) + @unittest.skipIf(sysconfig.get_config_var('ANDROID_API_LEVEL') == 0, + "not an android platform") + def test_is_android(self): + # Use an heuristic, the shell on Android is at /system/bin/sh. + proc = subprocess.run(['/system/bin/sh', '-c', 'echo OK'], + stdout=subprocess.PIPE) + self.assertIn(b'OK', proc.stdout) + class MakefileTests(unittest.TestCase): @unittest.skipIf(sys.platform.startswith('win'), diff a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -120,6 +120,9 @@ Build ----- +- Issue #27442: Expose the Android API level that python was built against, in + sysconfig.get_config_vars() as 'ANDROID_API_LEVEL'. + - Issue #26930: Update Windows builds to use OpenSSL 1.0.2h. - Issue #23968: Rename the platform directory from plat-$(MACHDEP) to