LOCAL_PATH:= $(call my-dir)

common_src := \
	BacktraceImpl.cpp \
	BacktraceMap.cpp \
	BacktraceThread.cpp \
	thread_utils.c \

common_cflags := \
	-Wall \
	-Wno-unused-parameter \
	-Werror \

common_conlyflags := \
	-std=gnu99 \

common_cppflags := \
	-std=gnu++11 \

common_shared_libs := \
	libcutils \
	libgccdemangle \
	liblog \

# To enable using libunwind on each arch, add it to this list.
libunwind_architectures := arm arm64 x86

ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),$(libunwind_architectures)))

#----------------------------------------------------------------------------
# The native libbacktrace library with libunwind.
#----------------------------------------------------------------------------
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
	$(common_src) \
	UnwindCurrent.cpp \
	UnwindMap.cpp \
	UnwindPtrace.cpp \

LOCAL_CFLAGS := \
	$(common_cflags) \

LOCAL_CONLYFLAGS += \
	$(common_conlyflags) \

LOCAL_CPPFLAGS += \
	$(common_cppflags) \

LOCAL_MODULE := libbacktrace
LOCAL_MODULE_TAGS := optional

LOCAL_C_INCLUDES := \
	$(common_c_includes) \
	external/libunwind/include \

LOCAL_SHARED_LIBRARIES := \
	$(common_shared_libs) \
	libunwind \
	libunwind-ptrace \

LOCAL_ADDITIONAL_DEPENDENCIES := \
	$(LOCAL_PATH)/Android.mk

include external/stlport/libstlport.mk

include $(BUILD_SHARED_LIBRARY)

else

#----------------------------------------------------------------------------
# The native libbacktrace library with libcorkscrew.
#----------------------------------------------------------------------------
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
	$(common_src) \
	Corkscrew.cpp \

LOCAL_CFLAGS := \
	$(common_cflags) \

LOCAL_CONLYFLAGS += \
	$(common_conlyflags) \

LOCAL_CPPFLAGS += \
	$(common_cppflags) \

LOCAL_MODULE := libbacktrace
LOCAL_MODULE_TAGS := optional

LOCAL_C_INCLUDES := \
	$(common_c_includes) \
	system/core/libcorkscrew \

LOCAL_SHARED_LIBRARIES := \
	$(common_shared_libs) \
	libcorkscrew \
	libdl \

LOCAL_ADDITIONAL_DEPENDENCIES := \
	$(LOCAL_PATH)/Android.mk

include external/stlport/libstlport.mk

include $(BUILD_SHARED_LIBRARY)

endif

#----------------------------------------------------------------------------
# libbacktrace test library, all optimizations turned off
#----------------------------------------------------------------------------
include $(CLEAR_VARS)

LOCAL_MODULE := libbacktrace_test
LOCAL_MODULE_FLAGS := debug

LOCAL_SRC_FILES := \
	backtrace_testlib.c

LOCAL_CFLAGS += \
	-std=gnu99 \
	-O0 \

LOCAL_ADDITIONAL_DEPENDENCIES := \
	$(LOCAL_PATH)/Android.mk

include $(BUILD_SHARED_LIBRARY)

#----------------------------------------------------------------------------
# libbacktrace test executable
#----------------------------------------------------------------------------
include $(CLEAR_VARS)

LOCAL_MODULE := backtrace_test
LOCAL_MODULE_FLAGS := debug

LOCAL_SRC_FILES := \
	backtrace_test.cpp \
	thread_utils.c \

LOCAL_CFLAGS += \
	$(common_cflags) \
	-fno-builtin \
	-fstack-protector-all \
	-O0 \
	-g \
	-DGTEST_OS_LINUX_ANDROID \
	-DGTEST_HAS_STD_STRING \

ifeq ($(TARGET_ARCH),arm64)
  $(info TODO: $(LOCAL_PATH)/Android.mk -fstack-protector not yet available for the AArch64 toolchain)
  LOCAL_CFLAGS += -fno-stack-protector
endif # arm64

LOCAL_CONLYFLAGS += \
	$(common_conlyflags) \

LOCAL_CPPFLAGS += \
	$(common_cppflags) \

LOCAL_SHARED_LIBRARIES += \
	libcutils \
	libbacktrace_test \
	libbacktrace \

LOCAL_LDLIBS := \
	-lpthread \

LOCAL_ADDITIONAL_DEPENDENCIES := \
	$(LOCAL_PATH)/Android.mk

include $(BUILD_NATIVE_TEST)

#----------------------------------------------------------------------------
# Only x86 host versions of libbacktrace supported.
#----------------------------------------------------------------------------
ifeq ($(HOST_ARCH),x86)

#----------------------------------------------------------------------------
# The host libbacktrace library using libcorkscrew
#----------------------------------------------------------------------------
include $(CLEAR_VARS)


LOCAL_CFLAGS += \
	$(common_cflags) \

LOCAL_CONLYFLAGS += \
	$(common_conlyflags) \

LOCAL_C_INCLUDES := \
	$(common_c_includes) \

LOCAL_SHARED_LIBRARIES := \
	libgccdemangle \
	liblog \

LOCAL_MODULE := libbacktrace
LOCAL_MODULE_TAGS := optional

LOCAL_ADDITIONAL_DEPENDENCIES := \
	$(LOCAL_PATH)/Android.mk

ifeq ($(HOST_OS),linux)
LOCAL_SRC_FILES += \
	$(common_src) \
	Corkscrew.cpp \

LOCAL_C_INCLUDES += \
	system/core/libcorkscrew \

LOCAL_SHARED_LIBRARIES := \
	libcorkscrew \

LOCAL_CPPFLAGS += \
	$(common_cppflags) \

LOCAL_LDLIBS += \
	-ldl \
	-lrt \

else
LOCAL_SRC_FILES += \
	BacktraceMap.cpp \

endif

include $(BUILD_HOST_SHARED_LIBRARY)

#----------------------------------------------------------------------------
# The host test is only supported on linux.
#----------------------------------------------------------------------------
ifeq ($(HOST_OS),linux)

#----------------------------------------------------------------------------
# libbacktrace host test library, all optimizations turned off
#----------------------------------------------------------------------------
include $(CLEAR_VARS)

LOCAL_MODULE := libbacktrace_test
LOCAL_MODULE_FLAGS := debug

LOCAL_SRC_FILES := \
	backtrace_testlib.c

LOCAL_CFLAGS += \
	-std=gnu99 \
	-O0 \

LOCAL_ADDITIONAL_DEPENDENCIES := \
	$(LOCAL_PATH)/Android.mk

include $(BUILD_HOST_SHARED_LIBRARY)

#----------------------------------------------------------------------------
# libbacktrace host test executable
#----------------------------------------------------------------------------
include $(CLEAR_VARS)

LOCAL_MODULE := backtrace_test
LOCAL_MODULE_FLAGS := debug

LOCAL_SRC_FILES := \
	backtrace_test.cpp \
	thread_utils.c \

LOCAL_CFLAGS += \
	$(common_cflags) \
	-fno-builtin \
	-fstack-protector-all \
	-O0 \
	-g \
	-DGTEST_HAS_STD_STRING \

LOCAL_SHARED_LIBRARIES := \
	libbacktrace_test \
	libbacktrace \

LOCAL_LDLIBS := \
	-lpthread \

LOCAL_ADDITIONAL_DEPENDENCIES := \
	$(LOCAL_PATH)/Android.mk

include $(BUILD_HOST_NATIVE_TEST)

endif # HOST_OS == linux

endif # HOST_ARCH == x86