diff -r 000000000000 -r 6474c204b198 build/autoconf/android.m4 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/build/autoconf/android.m4 Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,369 @@ +dnl This Source Code Form is subject to the terms of the Mozilla Public +dnl License, v. 2.0. If a copy of the MPL was not distributed with this +dnl file, You can obtain one at http://mozilla.org/MPL/2.0/. + +AC_DEFUN([MOZ_ANDROID_NDK], +[ + +MOZ_ARG_WITH_STRING(android-ndk, +[ --with-android-ndk=DIR + location where the Android NDK can be found], + android_ndk=$withval) + +MOZ_ARG_WITH_STRING(android-toolchain, +[ --with-android-toolchain=DIR + location of the android toolchain], + android_toolchain=$withval) + +MOZ_ARG_WITH_STRING(android-gnu-compiler-version, +[ --with-android-gnu-compiler-version=VER + gnu compiler version to use], + android_gnu_compiler_version=$withval) + +MOZ_ARG_ENABLE_BOOL(android-libstdcxx, +[ --enable-android-libstdcxx + use GNU libstdc++ instead of STLPort], + MOZ_ANDROID_LIBSTDCXX=1, + MOZ_ANDROID_LIBSTDCXX= ) + +define([MIN_ANDROID_VERSION], [9]) +android_version=MIN_ANDROID_VERSION + +MOZ_ARG_WITH_STRING(android-version, +[ --with-android-version=VER + android platform version, default] MIN_ANDROID_VERSION, + android_version=$withval) + +if test $android_version -lt MIN_ANDROID_VERSION ; then + AC_MSG_ERROR([--with-android-version must be at least MIN_ANDROID_VERSION.]) +fi + +case "$target" in +arm-linux*-android*|*-linuxandroid*) + android_tool_prefix="arm-linux-androideabi" + ;; +i?86-*android*) + android_tool_prefix="i686-linux-android" + ;; +mipsel-*android*) + android_tool_prefix="mipsel-linux-android" + ;; +*) + android_tool_prefix="$target_os" + ;; +esac + +case "$target" in +*-android*|*-linuxandroid*) + if test -z "$android_ndk" ; then + AC_MSG_ERROR([You must specify --with-android-ndk=/path/to/ndk when targeting Android.]) + fi + + if test -z "$android_toolchain" ; then + AC_MSG_CHECKING([for android toolchain directory]) + + kernel_name=`uname -s | tr "[[:upper:]]" "[[:lower:]]"` + + for version in $android_gnu_compiler_version 4.7 4.6 4.4.3 ; do + case "$target_cpu" in + arm) + target_name=arm-linux-androideabi-$version + ;; + i?86) + target_name=x86-$version + ;; + mipsel) + target_name=mipsel-linux-android-$version + ;; + *) + AC_MSG_ERROR([target cpu is not supported]) + ;; + esac + case "$host_cpu" in + i*86) + android_toolchain="$android_ndk"/toolchains/$target_name/prebuilt/$kernel_name-x86 + ;; + x86_64) + android_toolchain="$android_ndk"/toolchains/$target_name/prebuilt/$kernel_name-x86_64 + if ! test -d "$android_toolchain" ; then + android_toolchain="$android_ndk"/toolchains/$target_name/prebuilt/$kernel_name-x86 + fi + ;; + *) + AC_MSG_ERROR([No known toolchain for your host cpu]) + ;; + esac + if test -d "$android_toolchain" ; then + android_gnu_compiler_version=$version + break + elif test -n "$android_gnu_compiler_version" ; then + AC_MSG_ERROR([not found. Your --with-android-gnu-compiler-version may be wrong.]) + fi + done + + if test -z "$android_gnu_compiler_version" ; then + AC_MSG_ERROR([not found. You have to specify --with-android-toolchain=/path/to/ndk/toolchain.]) + else + AC_MSG_RESULT([$android_toolchain]) + fi + NSPR_CONFIGURE_ARGS="$NSPR_CONFIGURE_ARGS --with-android-toolchain=$android_toolchain" + fi + + NSPR_CONFIGURE_ARGS="$NSPR_CONFIGURE_ARGS --with-android-version=$android_version" + + AC_MSG_CHECKING([for android platform directory]) + + case "$target_cpu" in + arm) + target_name=arm + ;; + i?86) + target_name=x86 + ;; + mipsel) + target_name=mips + ;; + esac + + android_platform="$android_ndk"/platforms/android-"$android_version"/arch-"$target_name" + + if test -d "$android_platform" ; then + AC_MSG_RESULT([$android_platform]) + else + AC_MSG_ERROR([not found. Please check your NDK. With the current configuration, it should be in $android_platform]) + fi + + dnl Old NDK support. If minimum requirement is changed to NDK r8b, + dnl please remove this. + case "$target_cpu" in + i?86) + if ! test -e "$android_toolchain"/bin/"$android_tool_prefix"-gcc; then + dnl Old NDK toolchain name + android_tool_prefix="i686-android-linux" + fi + ;; + esac + + dnl set up compilers + TOOLCHAIN_PREFIX="$android_toolchain/bin/$android_tool_prefix-" + AS="$android_toolchain"/bin/"$android_tool_prefix"-as + if test -z "$CC"; then + CC="$android_toolchain"/bin/"$android_tool_prefix"-gcc + fi + if test -z "$CXX"; then + CXX="$android_toolchain"/bin/"$android_tool_prefix"-g++ + fi + if test -z "$CPP"; then + CPP="$android_toolchain"/bin/"$android_tool_prefix"-cpp + fi + LD="$android_toolchain"/bin/"$android_tool_prefix"-ld + AR="$android_toolchain"/bin/"$android_tool_prefix"-ar + RANLIB="$android_toolchain"/bin/"$android_tool_prefix"-ranlib + STRIP="$android_toolchain"/bin/"$android_tool_prefix"-strip + OBJCOPY="$android_toolchain"/bin/"$android_tool_prefix"-objcopy + + CPPFLAGS="-idirafter $android_platform/usr/include $CPPFLAGS" + CFLAGS="-mandroid -fno-short-enums -fno-exceptions $CFLAGS" + CXXFLAGS="-mandroid -fno-short-enums -fno-exceptions -Wno-psabi $CXXFLAGS" + ASFLAGS="-idirafter $android_platform/usr/include -DANDROID $ASFLAGS" + + dnl Add -llog by default, since we use it all over the place. + dnl Add --allow-shlib-undefined, because libGLESv2 links to an + dnl undefined symbol (present on the hardware, just not in the + dnl NDK.) + LDFLAGS="-mandroid -L$android_platform/usr/lib -Wl,-rpath-link=$android_platform/usr/lib --sysroot=$android_platform -llog -Wl,--allow-shlib-undefined $LDFLAGS" + dnl prevent cross compile section from using these flags as host flags + if test -z "$HOST_CPPFLAGS" ; then + HOST_CPPFLAGS=" " + fi + if test -z "$HOST_CFLAGS" ; then + HOST_CFLAGS=" " + fi + if test -z "$HOST_CXXFLAGS" ; then + HOST_CXXFLAGS=" " + fi + if test -z "$HOST_LDFLAGS" ; then + HOST_LDFLAGS=" " + fi + + ANDROID_NDK="${android_ndk}" + ANDROID_TOOLCHAIN="${android_toolchain}" + ANDROID_PLATFORM="${android_platform}" + + AC_DEFINE(ANDROID) + AC_SUBST(ANDROID_NDK) + AC_SUBST(ANDROID_TOOLCHAIN) + AC_SUBST(ANDROID_PLATFORM) + + ;; +esac + +]) + +AC_DEFUN([MOZ_ANDROID_STLPORT], +[ + +if test "$OS_TARGET" = "Android" -a -z "$gonkdir"; then + case "${CPU_ARCH}-${MOZ_ARCH}" in + arm-armv7*) + ANDROID_CPU_ARCH=armeabi-v7a + ;; + arm-*) + ANDROID_CPU_ARCH=armeabi + ;; + x86-*) + ANDROID_CPU_ARCH=x86 + ;; + mips-*) # When target_cpu is mipsel, CPU_ARCH is mips + ANDROID_CPU_ARCH=mips + ;; + esac + + AC_SUBST(ANDROID_CPU_ARCH) + + if test -z "$STLPORT_CPPFLAGS$STLPORT_LDFLAGS$STLPORT_LIBS"; then + if test -n "$MOZ_ANDROID_LIBSTDCXX" ; then + if test -e "$android_ndk/sources/cxx-stl/gnu-libstdc++/$android_gnu_compiler_version/libs/$ANDROID_CPU_ARCH/libgnustl_static.a"; then + # android-ndk-r8b + STLPORT_LIBS="-L$android_ndk/sources/cxx-stl/gnu-libstdc++/$android_gnu_compiler_version/libs/$ANDROID_CPU_ARCH/ -lgnustl_static" + STLPORT_CPPFLAGS="-I$android_ndk/sources/cxx-stl/gnu-libstdc++/$android_gnu_compiler_version/include -I$android_ndk/sources/cxx-stl/gnu-libstdc++/$android_gnu_compiler_version/libs/$ANDROID_CPU_ARCH/include -I$android_ndk/sources/cxx-stl/gnu-libstdc++/$android_gnu_compiler_version/include/backward" + elif test -e "$android_ndk/sources/cxx-stl/gnu-libstdc++/libs/$ANDROID_CPU_ARCH/libgnustl_static.a"; then + # android-ndk-r7, android-ndk-r7b, android-ndk-r8 + STLPORT_LIBS="-L$android_ndk/sources/cxx-stl/gnu-libstdc++/libs/$ANDROID_CPU_ARCH/ -lgnustl_static" + STLPORT_CPPFLAGS="-I$android_ndk/sources/cxx-stl/gnu-libstdc++/include -I$android_ndk/sources/cxx-stl/gnu-libstdc++/libs/$ANDROID_CPU_ARCH/include" + elif test -e "$android_ndk/sources/cxx-stl/gnu-libstdc++/libs/$ANDROID_CPU_ARCH/libstdc++.a"; then + # android-ndk-r5c, android-ndk-r6, android-ndk-r6b + STLPORT_CPPFLAGS="-I$android_ndk/sources/cxx-stl/gnu-libstdc++/include -I$android_ndk/sources/cxx-stl/gnu-libstdc++/libs/$ANDROID_CPU_ARCH/include" + STLPORT_LIBS="-L$android_ndk/sources/cxx-stl/gnu-libstdc++/libs/$ANDROID_CPU_ARCH/ -lstdc++" + else + AC_MSG_ERROR([Couldn't find path to gnu-libstdc++ in the android ndk]) + fi + else + STLPORT_CPPFLAGS="-isystem $_topsrcdir/build/stlport/stlport -isystem $android_ndk/sources/cxx-stl/system/include" + STLPORT_LIBS="$_objdir/build/stlport/libstlport_static.a -static-libstdc++" + fi + fi + CXXFLAGS="$CXXFLAGS $STLPORT_CPPFLAGS" +fi +AC_SUBST([MOZ_ANDROID_LIBSTDCXX]) +AC_SUBST([STLPORT_LIBS]) + +]) + +AC_DEFUN([MOZ_ANDROID_SDK], +[ + +MOZ_ARG_WITH_STRING(android-sdk, +[ --with-android-sdk=DIR + location where the Android SDK can be found (base directory, e.g. .../android/platforms/android-6)], + android_sdk=$withval) + +android_sdk_root=${withval%/platforms/android-*} + +case "$target" in +*-android*|*-linuxandroid*) + if test -z "$android_sdk" ; then + AC_MSG_ERROR([You must specify --with-android-sdk=/path/to/sdk when targeting Android.]) + else + if ! test -e "$android_sdk"/source.properties ; then + AC_MSG_ERROR([The path in --with-android-sdk isn't valid (source.properties hasn't been found).]) + fi + + # Get the api level from "$android_sdk"/source.properties. + ANDROID_TARGET_SDK=`$AWK -F = changequote(<<, >>)'<<$>>1 == "AndroidVersion.ApiLevel" {print <<$>>2}'changequote([, ]) "$android_sdk"/source.properties` + + if test -z "$ANDROID_TARGET_SDK" ; then + AC_MSG_ERROR([Unexpected error: no AndroidVersion.ApiLevel field has been found in source.properties.]) + fi + + AC_DEFINE_UNQUOTED(ANDROID_TARGET_SDK,$ANDROID_TARGET_SDK) + AC_SUBST(ANDROID_TARGET_SDK) + + if ! test "$ANDROID_TARGET_SDK" -eq "$ANDROID_TARGET_SDK" ; then + AC_MSG_ERROR([Unexpected error: the found android api value isn't a number! (found $ANDROID_TARGET_SDK)]) + fi + + if test $ANDROID_TARGET_SDK -lt $1 ; then + AC_MSG_ERROR([The given Android SDK provides API level $ANDROID_TARGET_SDK ($1 or higher required).]) + fi + fi + + android_tools="$android_sdk_root"/tools + android_platform_tools="$android_sdk_root"/platform-tools + if test ! -d "$android_platform_tools" ; then + android_platform_tools="$android_sdk"/tools # SDK Tools < r8 + fi + + dnl The build tools got moved around to different directories in SDK + dnl Tools r22. Try to locate them. This is awful, but, from + dnl http://stackoverflow.com/a/4495368, the following sorts versions + dnl of the form x.y.z.a.b from newest to oldest: + dnl sort -t. -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr -k 5,5nr + dnl We want to favour the newer versions that start with 'android-'; + dnl that's what the sed is about. + dnl We might iterate over directories that aren't build-tools at all; + dnl we use the presence of aapt as a marker. + AC_MSG_CHECKING([for android build-tools directory]) + android_build_tools="" + for suffix in `ls "$android_sdk_root/build-tools" | sed -e "s,android-,999.," | sort -t. -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr -k 5,5nr`; do + tools_directory=`echo "$android_sdk_root/build-tools/$suffix" | sed -e "s,999.,android-,"` + if test -d "$tools_directory" -a -f "$tools_directory/aapt"; then + android_build_tools="$tools_directory" + break + fi + done + if test -z "$android_build_tools" ; then + android_build_tools="$android_platform_tools" # SDK Tools < r22 + fi + + if test -d "$android_build_tools" -a -f "$android_build_tools/aapt"; then + AC_MSG_RESULT([$android_build_tools]) + else + AC_MSG_ERROR([not found. Please check your SDK for the subdirectory of build-tools. With the current configuration, it should be in $android_sdk_root/build_tools]) + fi + + ANDROID_SDK="${android_sdk}" + ANDROID_SDK_ROOT="${android_sdk_root}" + if test -e "${ANDROID_SDK_ROOT}/extras/android/compatibility/v4/android-support-v4.jar" ; then + ANDROID_COMPAT_LIB="${ANDROID_SDK_ROOT}/extras/android/compatibility/v4/android-support-v4.jar" + else + ANDROID_COMPAT_LIB="${ANDROID_SDK_ROOT}/extras/android/support/v4/android-support-v4.jar"; + fi + ANDROID_TOOLS="${android_tools}" + ANDROID_PLATFORM_TOOLS="${android_platform_tools}" + ANDROID_BUILD_TOOLS="${android_build_tools}" + AC_SUBST(ANDROID_SDK_ROOT) + AC_SUBST(ANDROID_SDK) + AC_SUBST(ANDROID_COMPAT_LIB) + if ! test -e $ANDROID_COMPAT_LIB ; then + AC_MSG_ERROR([You must download the Android support library when targeting Android. Run the Android SDK tool and install Android Support Library under Extras. See https://developer.android.com/tools/extras/support-library.html for more info. (looked for $ANDROID_COMPAT_LIB)]) + fi + + dnl Google has a history of moving the Android tools around. We don't + dnl care where they are, so let's try to find them anywhere we can. + ALL_ANDROID_TOOLS_PATHS="$ANDROID_TOOLS:$ANDROID_BUILD_TOOLS:$ANDROID_PLATFORM_TOOLS" + MOZ_PATH_PROG(ZIPALIGN, zipalign, :, [$ALL_ANDROID_TOOLS_PATHS]) + MOZ_PATH_PROG(DX, dx, :, [$ALL_ANDROID_TOOLS_PATHS]) + MOZ_PATH_PROG(AAPT, aapt, :, [$ALL_ANDROID_TOOLS_PATHS]) + MOZ_PATH_PROG(AIDL, aidl, :, [$ALL_ANDROID_TOOLS_PATHS]) + MOZ_PATH_PROG(ADB, adb, :, [$ALL_ANDROID_TOOLS_PATHS]) + + if test -z "$ZIPALIGN" -o "$ZIPALIGN" = ":"; then + AC_MSG_ERROR([The program zipalign was not found. Use --with-android-sdk={android-sdk-dir}.]) + fi + if test -z "$DX" -o "$DX" = ":"; then + AC_MSG_ERROR([The program dx was not found. Use --with-android-sdk={android-sdk-dir}.]) + fi + if test -z "$AAPT" -o "$AAPT" = ":"; then + AC_MSG_ERROR([The program aapt was not found. Use --with-android-sdk={android-sdk-dir}.]) + fi + if test -z "$AIDL" -o "$AIDL" = ":"; then + AC_MSG_ERROR([The program aidl was not found. Use --with-android-sdk={android-sdk-dir}.]) + fi + if test -z "$ADB" -o "$ADB" = ":"; then + AC_MSG_ERROR([The program adb was not found. Use --with-android-sdk={android-sdk-dir}.]) + fi + ;; +esac + +])