blob: 034cc550c03b7a22f89f961940f0cecdecfc6c44 [file] [log] [blame]
# 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