# Copyright 2012 the V8 project authors. All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
#       copyright notice, this list of conditions and the following
#       disclaimer in the documentation and/or other materials provided
#       with the distribution.
#     * Neither the name of Google Inc. nor the names of its
#       contributors may be used to endorse or promote products derived
#       from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Those definitions should be consistent with the main Makefile
ANDROID_ARCHES = android_ia32 android_x64 android_arm android_arm64 \
		 android_mipsel android_x87
MODES = release debug

# Generates all combinations of ANDROID ARCHES and MODES,
# e.g. "android_ia32.release" or "android_arm.release"
ANDROID_BUILDS = $(foreach mode,$(MODES), \
                   $(addsuffix .$(mode),$(ANDROID_ARCHES)))

HOST_OS = $(shell uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')
ANDROID_NDK_HOST_ARCH ?= $(shell uname -m | sed -e 's/i[3456]86/x86/')
ifeq ($(HOST_OS), linux)
  TOOLCHAIN_DIR = linux-$(ANDROID_NDK_HOST_ARCH)
else ifeq ($(HOST_OS), mac)
  TOOLCHAIN_DIR = darwin-$(ANDROID_NDK_HOST_ARCH)
else
  $(error Host platform "${HOST_OS}" is not supported)
endif

ifeq ($(ARCH), android_arm)
  DEFINES  = target_arch=arm v8_target_arch=arm android_target_arch=arm android_target_platform=14
  DEFINES += arm_neon=0 arm_version=7
  TOOLCHAIN_ARCH = arm-linux-androideabi
  TOOLCHAIN_PREFIX = $(TOOLCHAIN_ARCH)
  TOOLCHAIN_VER = 4.8
else ifeq ($(ARCH), android_arm64)
  DEFINES  = target_arch=arm64 v8_target_arch=arm64 android_target_arch=arm64 android_target_platform=21
  TOOLCHAIN_ARCH = aarch64-linux-android
  TOOLCHAIN_PREFIX = $(TOOLCHAIN_ARCH)
  TOOLCHAIN_VER = 4.9
else ifeq ($(ARCH), android_mipsel)
  DEFINES  = target_arch=mipsel v8_target_arch=mipsel android_target_platform=14
  DEFINES += android_target_arch=mips mips_arch_variant=mips32r2
  TOOLCHAIN_ARCH = mipsel-linux-android
  TOOLCHAIN_PREFIX = $(TOOLCHAIN_ARCH)
  TOOLCHAIN_VER = 4.8
else ifeq ($(ARCH), android_ia32)
  DEFINES = target_arch=ia32 v8_target_arch=ia32 android_target_arch=x86 android_target_platform=14
  TOOLCHAIN_ARCH = x86
  TOOLCHAIN_PREFIX = i686-linux-android
  TOOLCHAIN_VER = 4.8
else ifeq ($(ARCH), android_x64)
  DEFINES = target_arch=x64 v8_target_arch=x64 android_target_arch=x86_64 android_target_platform=21
  TOOLCHAIN_ARCH = x86_64
  TOOLCHAIN_PREFIX = x86_64-linux-android
  TOOLCHAIN_VER = 4.9
else ifeq ($(ARCH), android_x87)
  DEFINES = target_arch=x87 v8_target_arch=x87 android_target_arch=x86 android_target_platform=14
  TOOLCHAIN_ARCH = x86
  TOOLCHAIN_PREFIX = i686-linux-android
  TOOLCHAIN_VER = 4.8
else
  $(error Target architecture "${ARCH}" is not supported)
endif

TOOLCHAIN_PATH = \
    ${ANDROID_NDK_ROOT}/toolchains/${TOOLCHAIN_ARCH}-${TOOLCHAIN_VER}/prebuilt
ANDROID_TOOLCHAIN ?= ${TOOLCHAIN_PATH}/${TOOLCHAIN_DIR}

ifeq ($(wildcard $(ANDROID_TOOLCHAIN)),)
  $(error Cannot find Android toolchain in "${ANDROID_TOOLCHAIN}".  Please \
          check that ANDROID_NDK_ROOT and ANDROID_NDK_HOST_ARCH are set    \
          correctly)
endif

# For mksnapshot host generation.
DEFINES += host_os=${HOST_OS}
DEFINES += OS=android

.SECONDEXPANSION:
$(ANDROID_BUILDS): $(OUTDIR)/Makefile.$$@
	@$(MAKE) -C "$(OUTDIR)" -f Makefile.$@ \
	          CXX="$(ANDROID_TOOLCHAIN)/bin/${TOOLCHAIN_PREFIX}-g++" \
	          AR="$(ANDROID_TOOLCHAIN)/bin/${TOOLCHAIN_PREFIX}-ar" \
	          RANLIB="$(ANDROID_TOOLCHAIN)/bin/${TOOLCHAIN_PREFIX}-ranlib" \
	          CC="$(ANDROID_TOOLCHAIN)/bin/${TOOLCHAIN_PREFIX}-gcc" \
	          LD="$(ANDROID_TOOLCHAIN)/bin/${TOOLCHAIN_PREFIX}-ld" \
	          LINK="$(ANDROID_TOOLCHAIN)/bin/${TOOLCHAIN_PREFIX}-g++" \
	          BUILDTYPE=$(shell echo $(subst .,,$(suffix $@)) | \
	                      python -c "print raw_input().capitalize()") \
	          builddir="$(shell pwd)/$(OUTDIR)/$@"

# Android GYP file generation targets.
ANDROID_MAKEFILES = $(addprefix $(OUTDIR)/Makefile.,$(ANDROID_BUILDS))
$(ANDROID_MAKEFILES):
	GYP_GENERATORS=make-android \
	GYP_DEFINES="${DEFINES}" \
	CC="${ANDROID_TOOLCHAIN}/bin/${TOOLCHAIN_PREFIX}-gcc" \
	CXX="${ANDROID_TOOLCHAIN}/bin/${TOOLCHAIN_PREFIX}-g++" \
	PYTHONPATH="$(shell pwd)/tools/generate_shim_headers:$(shell pwd)/build:$(PYTHONPATH)" \
	build/gyp/gyp --generator-output="${OUTDIR}" build/all.gyp \
	              -Ibuild/standalone.gypi --depth=. -Ibuild/android.gypi \
	              -S$(suffix $(basename $@))$(suffix $@) ${GYPFLAGS}
