Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Habersack <grendel@twistedcode.net>2017-10-03 21:17:26 +0300
committerGitHub <noreply@github.com>2017-10-03 21:17:26 +0300
commitef7a4c06206976de7ef2e974267407347ddb75a4 (patch)
tree5a86b9ae0d98cc09c0dcd640d1b07fcc03f54650 /configure.ac
parent4f673eac7495cf6ce6520bcbf6901a4ba60e6bb5 (diff)
Prepare Mono for Android NDK with unified headers (#5680)
Up until NDK release 14 Android SDK included a separate set of C header files for each supported platform. NDK 14 introduced a new set of those headers (they are NOT the same as the old ones) which unifies support for all of the platforms so that bug fixes are available for all the API levels without having to backport etc. With NDK 15 the unified headers become the default ones (including when creating standalone toolchains) and with NDK 16 (in beta currently) the old per-platform headers are removed. Unfortunately, the new headers introduce breaking changes which made it impossible to build Mono with NDK configured to use them. This commit makes a handful of changes to Mono which make it build with unified headers.
Diffstat (limited to 'configure.ac')
-rw-r--r--configure.ac67
1 files changed, 67 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index bad8ecc8e3c..9299a874b30 100644
--- a/configure.ac
+++ b/configure.ac
@@ -554,6 +554,73 @@ AC_CHECK_FUNCS(_finite, , AC_MSG_CHECKING(for _finite in math.h)
# for Linux statfs support
AC_CHECK_HEADERS(linux/magic.h)
+# For Android NDK unified headers
+if test x$platform_android = xyes; then
+ AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
+ AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
+
+ # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
+ # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
+ # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
+ # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
+ # doesn't contain the required definitions (NDK 14)
+ if test x$have_android_signal_inlines = xyes; then
+ AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([#include <android/legacy_signal_inlines.h>],[
+ int i;
+ for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
+ }
+ ])],[
+ AC_MSG_RESULT(yes)
+ android_sigrtminmax_work=yes
+ ],[
+ AC_MSG_RESULT(no)
+ android_sigrtminmax_work=no
+ ]
+ )
+
+ if test x$android_sigrtminmax_work = xno; then
+ AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
+ fi
+ fi
+
+ # Attempt to detect whether we're using Android NDK unified headers
+ AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
+ AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
+
+ android_unified_headers=no
+ if test x$have_android_api_level = xyes; then
+ if test x$have_android_versioning = xyes; then
+ AC_MSG_CHECKING([whether using Android NDK unified headers])
+
+ # Both macros are defined only in the NDK unified headers
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([
+ #include <android/api-level.h>
+ #include <android/versioning.h>
+ ],[
+ #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
+ return 0
+ #else
+ #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
+ #endif
+ ])],[
+ AC_MSG_RESULT(yes)
+ android_unified_headers=yes
+ ],[
+ AC_MSG_RESULT(no)
+ android_unified_headers=no
+ ]
+ )
+ fi
+ fi
+
+ if test x$android_unified_headers = xyes; then
+ AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
+ fi
+fi # Android
+
# not 64 bit clean in cross-compile
if test "x$enable_wasm" = "xyes"; then
AC_DEFINE(SIZEOF_VOID_P,4)