# Copyright (C) 2008 The Android Open Source Project
#
# Licensed 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.
#

BUILD_SYSTEM_ROOT := $(_BUILD_CORE_DIR)

# We use the GNU Make Standard Library
include $(BUILD_SYSTEM_ROOT)/gmsl/gmsl

include $(_BUILD_CORE_DIR)/core/definitions-tests.mk
include $(_BUILD_CORE_DIR)/core/definitions-init.mk
include $(_BUILD_CORE_DIR)/core/definitions-utils.mk
include $(_BUILD_CORE_DIR)/core/definitions-host.mk
include $(_BUILD_CORE_DIR)/core/definitions-graph.mk
include $(_BUILD_CORE_DIR)/core/definitions-modules.mk
include $(_BUILD_CORE_DIR)/core/definitions-files.mk
#include $(_BUILD_CORE_DIR)/core/definitions-build.mk

# Replace all extensions in files from $1 matching any of
# $(LOCAL_CXX_EXTENSION_PATTERNS) with .o
local-cxx-src-to-obj = $(strip \
    $(eval _local_cxx_src := $1)\
    $(foreach pattern,$(LOCAL_CXX_EXTENSION_PATTERNS),\
        $(eval _local_cxx_src := $$(_local_cxx_src:$(pattern)=%.o)))\
    $(_local_cxx_src))

# Return the directory containing the intermediate files for a given
# kind of executable
# $1 = bitness (32 or 64)
# $2 = module name
intermediates-dir-for = $(BUILD_OBJS_DIR)/build/intermediates$(1)/$(2)

# Return the name of a given build-related variable that can be defined either
# for the build host or build target. I.e. if LOCAL_HOST_BUILD is not defined,
# return $(BUILD_TARGET_$1), or $(BUILD_HOST_$1) instead.
# $1: Variable name suffix (e.g. CC, LD, etc...)
local-build-var = $(if $(strip $(LOCAL_HOST_BUILD)),$(BUILD_HOST_$1),$(BUILD_TARGET_$1))

# If LOCAL_XXX is not defined, set it to the value of BUILD_TARGET_XXX or
# BUILD_HOST_XXX depending on the definition of LOCAL_HOST_BUILD.
local-build-define = $(if $(strip $(LOCAL_$1)),,$(eval LOCAL_$1 := $$(call local-build-var,$1)))

# Return the directory containing the intermediate files for the current
# module. LOCAL_MODULE must be defined before calling this.
local-intermediates-dir = $(call intermediates-dir-for,$(BUILD_TARGET_BITS),$(LOCAL_MODULE))

# Return the directory containing the source files generated by the 'protoc' tool.
# See LOCAL_PROTO_SOURCES for details.
generated-proto-sources-dir = $(call intermediates-dir-for,$(BUILD_TARGET_BITS),proto-sources)

# Location of intermediate static libraries during build.
local-library-path = $(call intermediates-dir-for,$(BUILD_TARGET_BITS),$(1))/$(1).a

# Location of unstripped executables during build.
local-executable-path = $(call intermediates-dir-for,$(BUILD_TARGET_BITS),$(1))/$(1)$(call local-build-var,EXEEXT)

# Location of unstripped shared libraries during build.
local-shared-library-path = $(call intermediates-dir-for,$(BUILD_TARGET_BITS),$(1))/$(1)$(call local-build-var,DLLEXT)

# Location of final (potentially stripped) executables.
local-executable-install-path = $(BUILD_OBJS_DIR)/$(if $(LOCAL_INSTALL_DIR),$(LOCAL_INSTALL_DIR)/)$(1)$(call local-build-var,EXEEXT)

# Location of final (potentially stripped) shared libraries.
local-shared-library-install-path = $(BUILD_OBJS_DIR)/$(if $(LOCAL_INSTALL_DIR),$(LOCAL_INSTALL_DIR),lib$(BUILD_TARGET_SUFFIX))/$(1)$(call local-build-var,DLLEXT)

# Location of final symbol file based on final executable/shared library path
local-symbol-install-path = $(subst $(BUILD_OBJS_DIR),$(_BUILD_SYMBOLS_DIR),$(1)).sym

# Location of final debug info file based on final executable/shared library path
local-debug-info-install-path = $(subst $(BUILD_OBJS_DIR),$(_BUILD_DEBUG_INFO_DIR),$(1))$(if $(findstring darwin,$(BUILD_TARGET_OS)),.dSYM)

ldlibs_start_whole := -Wl,--whole-archive
ldlibs_end_whole := -Wl,--no-whole-archive
ldlibs_force_load := -Wl,-force_load,

# Return the list of local static libraries
local-static-libraries-ldlibs-darwin = $(strip \
   $(foreach lib,$(LOCAL_WHOLE_STATIC_LIBRARIES),\
       $(ldlibs_force_load)$(call local-library-path,$(lib)))\
   $(foreach lib,$(LOCAL_STATIC_LIBRARIES),\
       $(call local-library-path,$(lib))))

local-static-libraries-ldlibs-linux = $(strip \
    $(if $(LOCAL_WHOLE_STATIC_LIBRARIES), \
        $(ldlibs_start_whole) \
        $(foreach lib,$(LOCAL_WHOLE_STATIC_LIBRARIES),$(call local-library-path,$(lib))) \
        $(ldlibs_end_whole) \
    ) \
    $(foreach lib,$(LOCAL_STATIC_LIBRARIES),$(call local-library-path,$(lib))) \
    )

local-static-libraries-ldlibs-windows =  $(local-static-libraries-ldlibs-linux)

local-static-libraries-ldlibs = $(local-static-libraries-ldlibs-$(BUILD_TARGET_OS))

# Expand to a shell statement that changes the runtime library search path.
# Note that this is only used for Qt-related stuff, and on Windows, the
# Windows libraries are placed under bin/ instead of lib/ so there is no
# point in changing the PATH variable.
set-host-library-search-path = $(call set-host-library-search-path-$(BUILD_TARGET_OS),$1)
set-host-library-search-path-linux = LD_LIBRARY_PATH=$1
set-host-library-search-path-darwin = DYLD_LIBRARY_PATH=$1
set-host-library-search-path-windows =

# Toolchain control support.
# It's possible to switch between the regular toolchain and the host one
# in certain cases.

# Compile a C source file
#
define  compile-c-source
SRC:=$(1)
OBJ:=$$(LOCAL_OBJS_DIR)/$$(SRC:%.c=%.o)
LOCAL_OBJECTS += $$(OBJ)
_BUILD_DEPENDENCY_DIRS += $$(dir $$(OBJ))
$$(OBJ): PRIVATE_CFLAGS := $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
$$(OBJ): PRIVATE_CC     := $$(LOCAL_CC)
$$(OBJ): PRIVATE_OBJ    := $$(OBJ)
$$(OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE)
$$(OBJ): PRIVATE_SRC    := $$(LOCAL_PATH)/$$(SRC)
$$(OBJ): PRIVATE_SRC0   := $$(SRC)
$$(OBJ): $$(LOCAL_PATH)/$$(SRC)
	@mkdir -p $$(dir $$(PRIVATE_OBJ))
	@echo "Compile: $$(PRIVATE_MODULE) <= $$(PRIVATE_SRC0)"
	$(hide) $$(PRIVATE_CC) $$(PRIVATE_CFLAGS) -c -o $$(PRIVATE_OBJ) -MMD -MP -MF $$(PRIVATE_OBJ).d.tmp $$(PRIVATE_SRC)
	$(hide) $$(_BUILD_CORE_DIR)/core/mkdeps.sh $$(PRIVATE_OBJ) $$(PRIVATE_OBJ).d.tmp $$(PRIVATE_OBJ).d
endef

# Compile a C++ source file
#
define  compile-cxx-source
SRC:=$(1)
OBJ:=$$(LOCAL_OBJS_DIR)/$$(call local-cxx-src-to-obj,$$(SRC))
LOCAL_OBJECTS += $$(OBJ)
_BUILD_DEPENDENCY_DIRS += $$(dir $$(OBJ))
$$(OBJ): PRIVATE_CFLAGS := $$(LOCAL_CFLAGS) $$(LOCAL_CXXFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
$$(OBJ): PRIVATE_CXX    := $$(LOCAL_CXX)
$$(OBJ): PRIVATE_OBJ    := $$(OBJ)
$$(OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE)
$$(OBJ): PRIVATE_SRC    := $$(LOCAL_PATH)/$$(SRC)
$$(OBJ): PRIVATE_SRC0   := $$(SRC)
$$(OBJ): $$(LOCAL_PATH)/$$(SRC)
	@mkdir -p $$(dir $$(PRIVATE_OBJ))
	@echo "Compile: $$(PRIVATE_MODULE) <= $$(PRIVATE_SRC0)"
	$(hide) $$(PRIVATE_CXX) $$(PRIVATE_CFLAGS) -c -o $$(PRIVATE_OBJ) -MMD -MP -MF $$(PRIVATE_OBJ).d.tmp $$(PRIVATE_SRC)
	$(hide) $$(_BUILD_CORE_DIR)/core/mkdeps.sh $$(PRIVATE_OBJ) $$(PRIVATE_OBJ).d.tmp $$(PRIVATE_OBJ).d
endef

# Compile an Objective-C source file
#
define  compile-objc-source
SRC:=$(1)
OBJ:=$$(LOCAL_OBJS_DIR)/$$(notdir $$(SRC:%.m=%.o))
LOCAL_OBJECTS += $$(OBJ)
_BUILD_DEPENDENCY_DIRS += $$(dir $$(OBJ))
$$(OBJ): PRIVATE_CFLAGS := $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
$$(OBJ): PRIVATE_CC     := $$(LOCAL_CC)
$$(OBJ): PRIVATE_OBJ    := $$(OBJ)
$$(OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE)
$$(OBJ): PRIVATE_SRC    := $$(LOCAL_PATH)/$$(SRC)
$$(OBJ): PRIVATE_SRC0   := $$(SRC)
$$(OBJ): $$(LOCAL_PATH)/$$(SRC)
	@mkdir -p $$(dir $$(PRIVATE_OBJ))
	@echo "Compile: $$(PRIVATE_MODULE) <= $$(PRIVATE_SRC0)"
	$(hide) $$(PRIVATE_CC) $$(PRIVATE_CFLAGS) -c -o $$(PRIVATE_OBJ) -MMD -MP -MF $$(PRIVATE_OBJ).d.tmp $$(PRIVATE_SRC)
	$(hide) $$(_BUILD_CORE_DIR)/core/mkdeps.sh $$(PRIVATE_OBJ) $$(PRIVATE_OBJ).d.tmp $$(PRIVATE_OBJ).d
endef

# Compile a generated C source files#
#
define compile-generated-c-source
SRC:=$(1)
OBJ:=$$(LOCAL_OBJS_DIR)/$$(notdir $$(SRC:%.c=%.o))
LOCAL_OBJECTS += $$(OBJ)
_BUILD_DEPENDENCY_DIRS += $$(dir $$(OBJ))
$$(OBJ): PRIVATE_CFLAGS := $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
$$(OBJ): PRIVATE_CC     := $$(LOCAL_CC)
$$(OBJ): PRIVATE_OBJ    := $$(OBJ)
$$(OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE)
$$(OBJ): PRIVATE_SRC    := $$(SRC)
$$(OBJ): PRIVATE_SRC0   := $$(SRC)
$$(OBJ): $$(SRC)
	@mkdir -p $$(dir $$(PRIVATE_OBJ))
	@echo "Compile: $$(PRIVATE_MODULE) <= $$(PRIVATE_SRC0)"
	$(hide) $$(PRIVATE_CC) $$(PRIVATE_CFLAGS) -c -o $$(PRIVATE_OBJ) -MMD -MP -MF $$(PRIVATE_OBJ).d.tmp $$(PRIVATE_SRC)
	$(hide) $$(_BUILD_CORE_DIR)/core/mkdeps.sh $$(PRIVATE_OBJ) $$(PRIVATE_OBJ).d.tmp $$(PRIVATE_OBJ).d
endef

define compile-generated-cxx-source
SRC:=$(1)
OBJ:=$$(LOCAL_OBJS_DIR)/$$(call local-cxx-src-to-obj,$$(notdir $$(SRC)))
LOCAL_OBJECTS += $$(OBJ)
_BUILD_DEPENDENCY_DIRS += $$(dir $$(OBJ))
$$(OBJ): PRIVATE_CFLAGS := $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR)
$$(OBJ): PRIVATE_CXX    := $$(LOCAL_CXX)
$$(OBJ): PRIVATE_OBJ    := $$(OBJ)
$$(OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE)
$$(OBJ): PRIVATE_SRC    := $$(SRC)
$$(OBJ): PRIVATE_SRC0   := $$(SRC)
$$(OBJ): $$(SRC)
	@mkdir -p $$(dir $$(PRIVATE_OBJ))
	@echo "Compile: $$(PRIVATE_MODULE) <= $$(PRIVATE_SRC0)"
	$(hide) $$(PRIVATE_CXX) $$(PRIVATE_CFLAGS) -c -o $$(PRIVATE_OBJ) -MMD -MP -MF $$(PRIVATE_OBJ).d.tmp $$(PRIVATE_SRC)
	$(hide) $$(_BUILD_CORE_DIR)/core/mkdeps.sh $$(PRIVATE_OBJ) $$(PRIVATE_OBJ).d.tmp $$(PRIVATE_OBJ).d
endef

# Install a file
#
define install-target
SRC:=$(1)
DST:=$(2)
$$(DST): PRIVATE_SRC := $$(SRC)
$$(DST): PRIVATE_DST := $$(DST)
$$(DST): PRIVATE_DST_NAME := $$(notdir $$(DST))
$$(DST): PRIVATE_SRC_NAME := $$(SRC)
$$(DST): $$(SRC)
	@mkdir -p $$(dir $$(PRIVATE_DST))
	@echo "Install: $$(PRIVATE_DST_NAME) <= $$(PRIVATE_SRC_NAME)"
	$(hide) cp -f $$(PRIVATE_SRC) $$(PRIVATE_DST)
install: $$(DST)
endef

define  create-dir
$(1):
	mkdir -p $(1)
endef

define transform-generated-source
@echo "Generated: $(PRIVATE_MODULE) <= $<"
@mkdir -p $(dir $@)
$(hide) $(PRIVATE_CUSTOM_TOOL)
endef

# Installs a binary to a new destination
# If required, will strip the binary
define install-binary
_SRC := $(1)
_SRC1 := $$(notdir $$(_SRC))
_DST := $(2)
_BUILD_EXECUTABLES += $$(_DST)
$$(_DST): PRIVATE_DST := $$(_DST)
$$(_DST): PRIVATE_SRC := $$(_SRC)
$$(_DST): PRIVATE_OBJCOPY := $$(BUILD_TARGET_OBJCOPY)
$$(_DST): PRIVATE_OBJCOPY_FLAGS := $(3)
$$(_DST): $$(_SRC)
	@mkdir -p $$(dir $$(PRIVATE_DST))
	@echo "Install: $$(PRIVATE_DST)"
ifeq (true,$$(BUILD_STRIP_BINARIES))
ifeq (darwin,$$(BUILD_TARGET_OS))
	$(hide) strip -S -o $$(PRIVATE_DST) $$(PRIVATE_SRC)
else  # BUILD_TARGET_OS != darwin
	$(hide) $$(PRIVATE_OBJCOPY) $$(PRIVATE_OBJCOPY_FLAGS) $$(PRIVATE_SRC) $$(PRIVATE_DST)
endif  # BUILD_TARGET_OS != darwin
else  # BUILD_STRIP_BINARIES != true
	$(hide) cp -f $$(PRIVATE_SRC) $$(PRIVATE_DST)
endif # BUILD_STRIP_BINARIES != true
endef

# Installs a prebuilt library
# If required, will generates symbols and debug info
define install-prebuilt
_PAIR := $(subst :, ,$(1))
_SRC := $$(word 1, $$(_PAIR))
_DST := $$(word 2, $$(_PAIR))
$(call install-binary,$$(_SRC),$$(_DST),--strip-unneeded)
ifeq (true,$(BUILD_GENERATE_SYMBOLS))
$$(eval $$(call build-install-debug-info,$$(_SRC),$$(_DST)))
$$(eval $$(call build-install-symbol,$$(_SRC),$$(_DST)))
endif
endef

# Installs a prebuilt symlink
# If required, will generate symbols
define install-prebuilt-symlink
_PAIR := $(subst :, ,$(1))
_SRC := $$(word 1, $$(_PAIR))
_DST := $$(word 2, $$(_PAIR))
_BUILD_EXECUTABLES += $$(_DST)
$$(_DST): PRIVATE_DST := $$(_DST)
$$(_DST): PRIVATE_SRC := $$(_SRC)
$$(_DST): $$(_SRC)
	@echo "Installing symlink: $$(PRIVATE_DST)"
	$(hide) cp -fa $$(PRIVATE_SRC) $$(PRIVATE_DST)
ifeq (true,$(BUILD_GENERATE_SYMBOLS))
$$(eval $$(call build-install-symbol,$$(_SRC),$$(_DST)))

# also copy over debug-info link
ifeq (darwin,$(BUILD_TARGET_OS))
_DEBUG_INFO_SRC := $$(_SRC).dSYM
_DEBUG_INFO := $$(call local-debug-info-install-path,$$(_DST))
_BUILD_DEBUG_INFOS += $$(_DEBUG_INFO)
$$(_DEBUG_INFO): PRIVATE_DEBUG_INFO := $$(_DEBUG_INFO)
$$(_DEBUG_INFO): PRIVATE_DEBUG_INFO_SRC := $$(_DEBUG_INFO_SRC)
$$(_DEBUG_INFO): $$(_SRC)
	@echo "Installing symlink debug info: $$(PRIVATE_DEBUG_INFO)"
	$(hide) cp -fa $$(PRIVATE_DEBUG_INFO_SRC) $$(PRIVATE_DEBUG_INFO)
endif # BUILD_TARGET_OS=darwin

endif # BUILD_GENERATE_SYMBOLS
endef

# Builds and installs the debug-info for a binary to a debug destination
define build-install-debug-info
_INTERMEDIATE_MODULE := $(1)
_MODULE := $(2)
_DEBUG_INFO := $$(call local-debug-info-install-path,$$(_MODULE))
_BUILD_DEBUG_INFOS += $$(_DEBUG_INFO)
$$(_DEBUG_INFO): PRIVATE_DEBUG_INFO := $$(_DEBUG_INFO)
$$(_DEBUG_INFO): PRIVATE_INTERMEDIATE_MODULE := $$(_INTERMEDIATE_MODULE)
$$(_DEBUG_INFO): PRIVATE_OBJCOPY := $$(BUILD_TARGET_OBJCOPY)
$$(_DEBUG_INFO): $$(_INTERMEDIATE_MODULE)
	@echo "Build debug info: $$(PRIVATE_DEBUG_INFO)"
	@mkdir -p $$(dir $$(PRIVATE_DEBUG_INFO))
ifeq (darwin,$(BUILD_TARGET_OS))
ifeq (,$$(wildcard $$(_INTERMEDIATE_MODULE).dSYM))
	$(hide) dsymutil --out=$$(PRIVATE_DEBUG_INFO) $$(PRIVATE_INTERMEDIATE_MODULE)
else # dSYM exists
	$(hide) cp -rf $$(PRIVATE_INTERMEDIATE_MODULE).dSYM $$(PRIVATE_DEBUG_INFO)
endif
else # BUILD_TARGET_OS != darwin
	$(hide) cp -f $$(PRIVATE_INTERMEDIATE_MODULE) $$(PRIVATE_DEBUG_INFO)
endif # BUILD_TARGET_OS
endef

# Builds, then installs a symbol from a module target
define build-install-symbol
_INTERMEDIATE_MODULE := $(1)
_MODULE := $(2)
_SYMBOL := $$(call local-symbol-install-path,$$(_MODULE))
_SYMBOL_DEP := $$(_INTERMEDIATE_MODULE)
_BUILD_SYMBOLS += $$(_SYMBOL)

ifeq (darwin,$(BUILD_TARGET_OS))
_DSYM := $$(call local-debug-info-install-path,$$(_MODULE))
_SYMBOL_DEP += $$(_DSYM)
endif

$$(_SYMBOL): PRIVATE_DSYM := $$(_DSYM)
$$(_SYMBOL): PRIVATE_DUMPSYMS := $$(BUILD_TARGET_DUMPSYMS)
$$(_SYMBOL): PRIVATE_MODULE := $$(_INTERMEDIATE_MODULE)
ifeq (darwin,$(BUILD_TARGET_OS))
$$(_SYMBOL): PRIVATE_MODULE_DSYM := $$(_DSYM)
endif
$$(_SYMBOL): PRIVATE_SYMBOL := $$(_SYMBOL)
$$(_SYMBOL): $$(_SYMBOL_DEP)
	@echo "Build Symbol: $$(PRIVATE_SYMBOL)"
	@mkdir -p $$(dir $$(PRIVATE_SYMBOL))
ifeq (darwin,$(BUILD_TARGET_OS))
	$$(PRIVATE_DUMPSYMS) -g $$(PRIVATE_DSYM) $$(PRIVATE_MODULE) > $$(PRIVATE_SYMBOL)
else
	$(hide) $$(PRIVATE_DUMPSYMS) $$(PRIVATE_MODULE) > $$(PRIVATE_SYMBOL)
endif
endef


install-executable = $(eval $(call install-stripped-binary,$1,$2,--strip-all))
install-shared-library = $(eval $(call install-stripped-binary,$1,$2,--strip-unneeded))

# Generate DLL symbol file
#
# NOTE: The file is always named foo.def
#
define generate-symbol-file
SRC:=$(1)
OBJ:=$$(LOCAL_OBJS_DIR)/$$(notdir $$(SRC:%.entries=%.def))
LOCAL_GENERATED_SYMBOL_FILE:=$$(OBJ)
$$(OBJ): PRIVATE_SRC := $$(SRC)
$$(OBJ): PRIVATE_DST := $$(OBJ)
$$(OBJ): PRIVATE_MODE := $$(GEN_ENTRIES_MODE_$(BUILD_TARGET_OS))
$$(OBJ): $$(SRC)
	@mkdir -p $$(dir $$(PRIVATE_DST))
	@echo "Generate symbol file: $$(notdir $$(PRIVATE_DST))"
	$(hide) android/scripts/gen-entries.py --mode=$$(PRIVATE_MODE) --output=$$(PRIVATE_DST) $$(PRIVATE_SRC)
endef

GEN_ENTRIES_MODE_darwin := _symbols
GEN_ENTRIES_MODE_windows := def
GEN_ENTRIES_MODE_linux := sym

EXPORTED_SYMBOL_LIST_windows :=
EXPORTED_SYMBOL_LIST_darwin := -Wl,-exported_symbols_list,
EXPORTED_SYMBOL_LIST_linux := -Wl,--version-script=

symbol-file-linker-flags = $(EXPORTED_SYMBOL_LIST_$(BUILD_TARGET_OS))$1

# Generate and compile source file through the Qt 'moc' tool
# NOTE: This expects QT_MOC_TOOL to be defined.
define compile-qt-moc-source
SRC:=$(1)
MOC_SRC:=$$(LOCAL_OBJS_DIR)/moc_$$(notdir $$(SRC:%.h=%.cpp))
ifeq (,$$(strip $$(QT_MOC_TOOL)))
$$(error QT_MOC_TOOL is not defined when trying to generate $$(MOC_SRC) !!)
endif

# OS X is not happy with the relative include path if the intermediate
# build directory is under a symlink. So we're going to force moc to use the
# absolute path with the path prefix flag (-p).
$$(MOC_SRC): PRIVATE_SRC_DIR := $$(abspath $$(dir $$(LOCAL_PATH)/$$(SRC)))
$$(MOC_SRC): PRIVATE_SRC := $$(LOCAL_PATH)/$$(SRC)
$$(MOC_SRC): PRIVATE_DST := $$(MOC_SRC)
$$(MOC_SRC): $$(PRIVATE_SRC) $$(MOC_TOOL)
	@mkdir -p $$(dir $$(PRIVATE_DST))
	@echo "Qt moc: $$(notdir $$(PRIVATE_DST)) <-- $$(PRIVATE_SRC)"
	$(hide) $$(QT_MOC_TOOL) -o $$(PRIVATE_DST) $$(PRIVATE_SRC) -p $$(PRIVATE_SRC_DIR)

$$(eval $$(call compile-generated-cxx-source,$$(MOC_SRC)))
endef

# Generate and compile a Qt resource source file through the 'rcc' tool.
# NOTE: This expects QT_RCC_TOOL to be defined.
define compile-qt-resources
SRC := $(1)
RCC_SRC := $$(LOCAL_OBJS_DIR)/rcc_$$(notdir $$(SRC:%.qrc=%.cpp))
ifeq (,$$(strip $$(QT_RCC_TOOL)))
$$(error QT_RCC_TOOL is not defined when trying to generate $$(RCC_SRC) !!)
endif
$$(RCC_SRC): PRIVATE_SRC := $$(LOCAL_PATH)/$$(SRC)
$$(RCC_SRC): PRIVATE_DST := $$(RCC_SRC)
$$(RCC_SRC): PRIVATE_NAME := $$(notdir $$(SRC:%.qrc=%))
$$(RCC_SRC): $$(PRIVATE_SRC) $$(QT_RCC_TOOL)
	@mkdir -p $$(dir $$(PRIVATE_DST))
	@echo "Qt rcc: $$(notdir $$(PRIVATE_DST)) <-- $$(PRIVATE_SRC)"
	$(hide) $$(QT_RCC_TOOL) -o $$(PRIVATE_DST) --name $$(PRIVATE_NAME) $$(PRIVATE_SRC)

$$(eval $$(call compile-generated-cxx-source,$$(RCC_SRC)))
endef

# Process a Qt .ui source file through the 'uic' tool to generate a header.
# NOTE: This expects QT_UIC_TOOL and QT_UIC_TOOL_LDPATH to be defined.
define compile-qt-uic-source
SRC := $(1)
UIC_SRC := $$(LOCAL_OBJS_DIR)/ui_$$(notdir $$(SRC:%.ui=%.h))
ifeq (,$$(strip $$(QT_UIC_TOOL)))
$$(error QT_UIC_TOOL is not defined when trying to generate $$(UIC_SRC) !!)
endif
ifeq (,$$(strip $$(QT_UIC_TOOL_LDPATH)))
$$(error QT_UIC_TOOL_LDPATH is not defined when trying to generate $$(UIC_SRC) !!)
endif
$$(UIC_SRC): PRIVATE_SRC := $$(LOCAL_PATH)/$$(SRC)
$$(UIC_SRC): PRIVATE_DST := $$(UIC_SRC)
$$(UIC_SRC): $$(PRIVATE_SRC) $$(QT_UIC_TOOL)
	@mkdir -p $$(dir $$(PRIVATE_DST))
	@echo "Qt uic: $$(notdir $$(PRIVATE_DST)) <-- $$(PRIVATE_SRC)"
	$(hide) $$(call set-host-library-search-path,$$(QT_UIC_TOOL_LDPATH)) $$(QT_UIC_TOOL) -o $$(PRIVATE_DST) $$(PRIVATE_SRC)

LOCAL_GENERATED_SOURCES += $$(UIC_SRC)
endef

# Generate and compile a .proto Protobuf source file through the 'protoc' tool.
# NOTE: This expects PROTOC_TOOL to be defined.
define compile-proto-source
SRC := $(1)
OUT_SRC := $$(generated-proto-sources-dir)/$$(SRC:%.proto=%.pb.cc)
ifeq (,$$(strip $$(PROTOC_TOOL)))
    $$(error PROTOC_TOOL is not defined when trying to generate $$(OUT_SRC) !!)
endif
$$(OUT_SRC): PRIVATE_SRC := $$(LOCAL_PATH)/$$(SRC)
$$(OUT_SRC): PRIVATE_DST_DIR := $$(dir $$(OUT_SRC))
$$(OUT_SRC): PRIVATE_DST := $$(OUT_SRC)
$$(OUT_SRC): PRIVATE_NAME := $$(notdir $$(SRC:%.proto=%))
$$(OUT_SRC): $$(PRIVATE_SRC) $$(PROTOC_TOOL)
	@mkdir -p $$(dir $$(PRIVATE_DST))
	@echo "Protoc: $$(notdir $$(PRIVATE_DST)) <-- $$(PRIVATE_SRC)"
	$(hide) $$(PROTOC_TOOL) -I$$(dir $$(PRIVATE_SRC)) --cpp_out=$$(PRIVATE_DST_DIR) $$(PRIVATE_SRC)

$$(eval $$(call compile-generated-cxx-source,$$(OUT_SRC)))
endef

# Call this function to force a module to link statically to the C++ standard
# library on platforms that support it (i.e. Linux and Windows).
#
# NOTE: On Windows, recent Mingw versions add support for std::thread through
#       the libwinpthread-1 library, which libstdc++ depends on, requiring
#       special link-time flags (instead of the classic -static-libstdc++).
#
#       We detect whether this is the case by inspecting the content of
#       PREBUILT_PATH_PAIRS, which is set by config.make, the auto-generated
#       file that comes from running 'android/configure.sh --mingw'
#
_HAS_WINPTHREAD := $(if $(filter %libwinpthread-1.dll,$(PREBUILT_PATH_PAIRS)),true)

local-link-static-c++lib = $(eval $(ev-local-link-static-c++lib))
define ev-local-link-static-c++lib
ifeq (darwin,$(BUILD_TARGET_OS))
LOCAL_LDLIBS += $(CXX_STD_LIB)
else
ifeq (true,$(_HAS_WINPTHREAD))
LOCAL_LDLIBS += -Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic
else # !libwinpthread
LOCAL_LD := $(call local-build-var,CXX)
LOCAL_LDLIBS += -static-libstdc++
endif  # !_HAS_WINPTHREAD
endif  # BUILD_TARGET_OS != darwin
endef

ifneq (,$(BUILD_SYSTEM_UNIT_TESTS))
$(call -build-run-all-tests)
endif
