# Build apk or other package from gradle module.

# Common parameters:
# - LOCAL_NAME
# - LOCAL_PROJECT_DIR
# - LOCAL_SDK_PATH
# - LOCAL_GRADLE_BIN
# Optional:
# - LOCAL_NDK_PATH
# - LOCAL_CUSTOM_LIBS
# - LOCAL_EXT_FILE

_sdk_dir := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))

include $(_sdk_dir)/path-utilities.mk

####################################
# Check necessary input parameters #
####################################

LOCAL_NAME := $(strip $(LOCAL_NAME))
LOCAL_PROJECT_DIR := $(strip $(LOCAL_PROJECT_DIR))
LOCAL_SDK_PATH := $(strip $(LOCAL_SDK_PATH))
LOCAL_GRADLE_BIN := $(strip $(LOCAL_GRADLE_BIN))
LOCAL_NDK_PATH := $(strip $(LOCAL_NDK_PATH))
LOCAL_CUSTOM_LIBS := $(strip $(LOCAL_CUSTOM_LIBS))
LOCAL_EXT_FILE := $(strip $(LOCAL_EXT_FILE))

ifeq ($(LOCAL_NAME),)
  $(error LOCAL_NAME is not specified)
endif

ifeq ($(LOCAL_PROJECT_DIR),)
  $(error LOCAL_PROJECT_DIR is not specified)
endif

ifeq ($(LOCAL_SDK_PATH),)
  $(error LOCAL_SDK_PATH is not specified)
endif

ifeq ($(LOCAL_GRADLE_BIN),)
  $(info LOCAL_GRADLE_BIN should be set by path to gradlew (default behaviour))
  LOCAL_GRADLE_BIN := gradle
endif

ifeq ($(LOCAL_EXT_FILE),)
  LOCAL_EXT_FILE := apk
endif

############################
# Default build parameters #
############################

_local_output_dir := $(strip $(call get-absolute-path,./out/gradle/$(LOCAL_NAME)))

######################
# Internal functions #
######################

get-lib-destination-path = \
  $(eval path := $(1)) \
  $(if $(filter %.so,$(path)), \
    $(eval _dir := $(dir $(path))) $(notdir $(_dir:%/=%))/$(notdir $(path)), \
    $(notdir $(path)))

copy-libs-to-$(LOCAL_EXT_FILE) = \
  $(eval _libs := $(1)) \
  $(eval _dest_dir := $(2)) \
  $(shell mkdir -p $(_dest_dir)) \
  $(foreach _lib,$(_libs), \
     $(shell mkdir -p $(dir $(_dest_dir)/$(strip $(call get-lib-destination-path,$(_lib)))) && cp $(_lib) $(_dest_dir)/$(strip $(call get-lib-destination-path,$(_lib)))))

###################
# Default targets #
###################

.PHONY: build
build: $(LOCAL_NAME)

.PHONY: $(LOCAL_NAME)
$(LOCAL_NAME): $(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE)

.PHONY: $(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE)
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE): _LOCAL_NAME := $(LOCAL_NAME)
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE): _local_project_dir := $(LOCAL_PROJECT_DIR)
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE): _local_output_dir := $(_local_output_dir)
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE): _local_custom_libs := $(LOCAL_CUSTOM_LIBS)
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE): _local_sdk_path := $(LOCAL_SDK_PATH)
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE): _local_ndk_path := $(LOCAL_NDK_PATH)
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE): _local_gradle_bin := $(LOCAL_GRADLE_BIN)
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE): _local_ext_file := $(LOCAL_EXT_FILE)
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE):
	$(call copy-libs-to-$(_local_ext_file),$(_local_custom_libs),$(_local_project_dir)/app/libs)
	mkdir -p $(_local_output_dir)
	export ANDROID_HOME=$(_local_sdk_path) && export ANDROID_NDK_HOME=$(_local_ndk_path) && \
		cd $(_local_project_dir) && \
		$(_local_gradle_bin) build && \
		find -name "*.$(_local_ext_file)" -type f -exec install --mode 664 -t $(dir $(@)) {} \+

.PHONY: clean
clean: $(LOCAL_NAME)-clean

.PHONY: $(LOCAL_NAME)-clean
$(LOCAL_NAME)-clean: $(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE)-clean

.PHONY: $(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE)-clean
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE)-clean: _local_output_dir := $(_local_output_dir)
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE)-clean: _local_project_dir := $(LOCAL_PROJECT_DIR)
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE)-clean: _local_sdk_path := $(LOCAL_SDK_PATH)
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE)-clean: _local_ndk_path := $(LOCAL_NDK_PATH)
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE)-clean: _local_gradle_bin := $(LOCAL_GRADLE_BIN)
$(_local_output_dir)/$(LOCAL_NAME).$(LOCAL_EXT_FILE)-clean:
	rm -rf $(_local_output_dir)
	export ANDROID_HOME=$(_local_sdk_path) && export ANDROID_NDK_HOME=$(_local_ndk_path) && \
		cd $(_local_project_dir) && \
		$(_local_gradle_bin) clean

##############
# Clear vars #
##############

include $(_sdk_dir)/clear-vars.mk
