THRIFT-3424 Add CMake android build option
Client: Build
Patch: Nobuaki Sukegawa

This closes #696
diff --git a/build/cmake/DefineOptions.cmake b/build/cmake/DefineOptions.cmake
index 0aad240..8f7659e 100644
--- a/build/cmake/DefineOptions.cmake
+++ b/build/cmake/DefineOptions.cmake
@@ -20,11 +20,17 @@
 
 include(CMakeDependentOption)
 
+set(THRIFT_COMPILER "" CACHE FILEPATH "External Thrift compiler to use during build")
+
 # Additional components
 option(BUILD_COMPILER "Build Thrift compiler" ON)
-option(BUILD_TESTING "Build with unit tests" ON)
-option(BUILD_EXAMPLES "Build examples" ON)
-option(BUILD_TUTORIALS "Build Thrift tutorials" ON)
+
+if(BUILD_COMPILER OR EXISTS ${THRIFT_COMPILER})
+    set(HAVE_COMPILER ON)
+endif()
+CMAKE_DEPENDENT_OPTION(BUILD_TESTING "Build with unit tests" ON "HAVE_COMPILER" OFF)
+CMAKE_DEPENDENT_OPTION(BUILD_EXAMPLES "Build examples" ON "HAVE_COMPILER" OFF)
+CMAKE_DEPENDENT_OPTION(BUILD_TUTORIALS "Build Thrift tutorials" ON "HAVE_COMPILER" OFF)
 option(BUILD_LIBRARIES "Build Thrift libraries" ON)
 
 # Libraries to build
@@ -74,10 +80,16 @@
                        "BUILD_LIBRARIES;WITH_C_GLIB;GLIB_FOUND" OFF)
 # Java
 option(WITH_JAVA "Build Java Thrift library" ON)
-find_package(Java QUIET)
-find_package(Ant QUIET)
-CMAKE_DEPENDENT_OPTION(BUILD_JAVA "Build Java library" ON
-                       "BUILD_LIBRARIES;WITH_JAVA;JAVA_FOUND;ANT_FOUND" OFF)
+if(ANDROID)
+    find_package(Gradle QUIET)
+    CMAKE_DEPENDENT_OPTION(BUILD_JAVA "Build Java library" ON
+                           "BUILD_LIBRARIES;WITH_JAVA;GRADLE_FOUND" OFF)
+else()
+    find_package(Java REQUIRED)
+    find_package(Ant QUIET)
+    CMAKE_DEPENDENT_OPTION(BUILD_JAVA "Build Java library" ON
+                           "BUILD_LIBRARIES;WITH_JAVA;JAVA_FOUND;ANT_FOUND" OFF)
+endif()
 
 # Python
 option(WITH_PYTHON "Build Python Thrift library" ON)
@@ -120,7 +132,9 @@
 message(STATUS "Build configuration Summary")
 message(STATUS "  Build Thrift compiler:              ${BUILD_COMPILER}")
 message(STATUS "  Build with unit tests:              ${BUILD_TESTING}")
+MESSAGE_DEP(HAVE_COMPILER "Disabled because BUILD_THRIFT=OFF and no valid THRIFT_COMPILER is given")
 message(STATUS "  Build examples:                     ${BUILD_EXAMPLES}")
+MESSAGE_DEP(HAVE_COMPILER "Disabled because BUILD_THRIFT=OFF and no valid THRIFT_COMPILER is given")
 message(STATUS "  Build Thrift libraries:             ${BUILD_LIBRARIES}")
 message(STATUS " Language libraries:")
 message(STATUS "  Build C++ library:                  ${BUILD_CPP}")
@@ -131,8 +145,12 @@
 MESSAGE_DEP(GLIB_FOUND "GLib missing")
 message(STATUS "  Build Java library:                 ${BUILD_JAVA}")
 MESSAGE_DEP(WITH_JAVA "Disabled by via WITH_JAVA=OFF")
-MESSAGE_DEP(JAVA_FOUND "Java Runtime missing")
-MESSAGE_DEP(ANT_FOUND "Ant missing")
+if(ANDROID)
+    MESSAGE_DEP(GRADLE_FOUND "Gradle missing")
+else()
+    MESSAGE_DEP(JAVA_FOUND "Java Runtime missing")
+    MESSAGE_DEP(ANT_FOUND "Ant missing")
+endif()
 message(STATUS "  Build Python library:               ${BUILD_PYTHON}")
 MESSAGE_DEP(WITH_PYTHON "Disabled by via WITH_PYTHON=OFF")
 MESSAGE_DEP(PYTHONLIBS_FOUND "Python libraries missing")
diff --git a/build/cmake/FindAnt.cmake b/build/cmake/FindAnt.cmake
index 16b9afd..8b0371d 100644
--- a/build/cmake/FindAnt.cmake
+++ b/build/cmake/FindAnt.cmake
@@ -18,8 +18,8 @@
 #
 
 
-#  Ant_FOUND - system has Ant
-#  Ant_EXECUTBALE - the Ant executable
+#  ANT_FOUND - system has Ant
+#  Ant_EXECUTABLE - the Ant executable
 #
 # It will search the environment variable ANT_HOME if it is set
 
diff --git a/build/cmake/FindGradle.cmake b/build/cmake/FindGradle.cmake
new file mode 100644
index 0000000..8845d69
--- /dev/null
+++ b/build/cmake/FindGradle.cmake
@@ -0,0 +1,30 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+
+#  GRADLE_FOUND - system has Gradle
+#  GRADLE_EXECUTABLE - the Gradle executable
+#
+# It will search the environment variable ANT_HOME if it is set
+
+include(FindPackageHandleStandardArgs)
+
+find_program(GRADLE_EXECUTABLE NAMES gradle PATHS $ENV{GRADLE_HOME}/bin NO_CMAKE_FIND_ROOT_PATH)
+find_package_handle_standard_args(Gradle DEFAULT_MSG GRADLE_EXECUTABLE)
+mark_as_advanced(GRADLE_EXECUTABLE)
diff --git a/build/cmake/android-toolchain.cmake b/build/cmake/android-toolchain.cmake
new file mode 100644
index 0000000..15f3d00
--- /dev/null
+++ b/build/cmake/android-toolchain.cmake
@@ -0,0 +1,26 @@
+set(ANDROID_NDK "/opt/android-ndk" CACHE)
+set(ANDROID_PLATFORM "android-15" CACHE)
+set(ANDROID_ARCH "arch-arm" CACHE)
+set(ANDROID_TOOL_ARCH "android-arm" CACHE)
+set(ANDROID_CPU "armeabi-v7a" CACHE)
+set(ANDROID_GCC_VERSION 4.9 CACHE)
+set(HOST_ARCH linux-x86_64 CACHE)
+
+set(CMAKE_SYSTEM_NAME Android)
+set(ANDROID_SYSROOT "${ANDROID_NDK}/platforms/${ANDROID_PLATFORM}/${ANDROID_ARCH}")
+set(ANDROID_TRIPLET arm-linux-androideabi)
+set(ANDROID_STL "${ANDROID_NDK}/sources/cxx-stl/gnu-libstd++/${ANDROID_GCC_VERSION}")
+
+set(_COMPILER_ROOT ${ANDROID_NDK}/prebuilt/${ANDROID_TRIPLET}-${ANDROID_GCC_VERSION}/prebuilt/${HOST_ARCH})
+set(CMAKE_C_COMPILER ${_COMPILER_ROOT}/bin/${ANDROID_TRIPLET}-gcc)
+set(CMAKE_CXCX_COMPILER ${_COMPILER_ROOT}/bin/${ANDROID_TRIPLET}-g++)
+
+include_directories(
+    ${ANDROID_STL}/include
+    ${ANDROID_STL}/libs/${ANDROID_CPU}/include)
+
+set(CMAKE_FIND_ROOT_PATH ${ANDROID_SYSROOT})
+
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)