#
# Copyright (C) 2014 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.
#

LOCAL_PATH := $(call my-dir)

# -------------------------------------------------------------------------

include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
    bits.c \
    breakpoints.c \
    debug.c \
    demangle.c \
    dict.c \
    execute_program.c \
    expr.c \
    fetch.c \
    filter.c \
    glob.c \
    handle_event.c \
    lens.c \
    lens_default.c \
    lens_enum.c \
    libltrace.c \
    library.c \
    ltrace-elf.c \
    main.c \
    memstream.c \
    options.c \
    output.c \
    param.c \
    printf.c \
    proc.c \
    prototype.c \
    read_config_file.c \
    summary.c \
    type.c \
    value.c \
    value_dict.c \
    vect.c \
    zero.c \
    sysdeps/linux-gnu/breakpoint.c \
    sysdeps/linux-gnu/events.c \
    sysdeps/linux-gnu/hooks.c \
    sysdeps/linux-gnu/proc.c \
    sysdeps/linux-gnu/trace.c \

LOCAL_C_INCLUDES := \
    $(LOCAL_PATH)/ \
    $(LOCAL_PATH)/sysdeps/ \
    $(LOCAL_PATH)/sysdeps/linux-gnu \
    external/elfutils \
    external/elfutils/0.153/libelf \
    external/libunwind/include \

arm_path := sysdeps/linux-gnu/arm
LOCAL_C_INCLUDES_arm := $(LOCAL_PATH)/$(arm_path)
LOCAL_SRC_FILES_arm := \
    $(arm_path)/breakpoint.c \
    $(arm_path)/fetch.c \
    $(arm_path)/plt.c \
    $(arm_path)/regs.c \
    $(arm_path)/trace.c \

arm64_path := sysdeps/linux-gnu/aarch64
LOCAL_C_INCLUDES_arm64 := $(LOCAL_PATH)/$(arm64_path)
LOCAL_SRC_FILES_arm64 := \
    $(arm64_path)/fetch.c \
    $(arm64_path)/plt.c \
    $(arm64_path)/regs.c \
    $(arm64_path)/trace.c \

mips_path := sysdeps/linux-gnu/mips
LOCAL_C_INCLUDES_mips := $(LOCAL_PATH)/$(mips_path)
LOCAL_SRC_FILES_mips := \
    $(mips_path)/plt.c \
    $(mips_path)/regs.c \
    $(mips_path)/trace.c \

x86_path := sysdeps/linux-gnu/x86
LOCAL_C_INCLUDES_x86 := $(LOCAL_PATH)/$(x86_path)
LOCAL_SRC_FILES_x86 := \
    $(x86_path)/fetch.c \
    $(x86_path)/plt.c \
    $(x86_path)/regs.c \
    $(x86_path)/trace.c \

# x86_64 uses the same source as x86.
LOCAL_C_INCLUDES_x86_64 := $(LOCAL_C_INCLUDES_x86)
LOCAL_SRC_FILES_x86_64 := $(LOCAL_SRC_FILES_x86)

LOCAL_CFLAGS := -D_GNU_SOURCE=1 -D_POSIX_SOURCE=1

LOCAL_CFLAGS += \
    -DELF_HASH_TAKES_CHARP=1 \
    -DHAVE_ALARM=1 \
    -DHAVE_ATEXIT=1 \
    -DHAVE_DLFCN_H=1 \
    -DHAVE_ELF_C_READ_MMAP=1 \
    -DHAVE_ELF_H=1 \
    -DHAVE_FCNTL_H=1 \
    -DHAVE_FORK=1 \
    -DHAVE_GELF_H=1 \
    -DHAVE_GETOPT_LONG=1 \
    -DHAVE_GETTIMEOFDAY=1 \
    -DHAVE_INTTYPES_H=1 \
    -DHAVE_LIBELF=1 \
    -DHAVE_LIBSELINUX=1 \
    -DHAVE_LIBSTDC__=1 \
    -DHAVE_LIBUNWIND=1 \
    -DHAVE_LIBUNWIND_PTRACE=1 \
    -DHAVE_LIMITS_H=1 \
    -DHAVE_MEMORY_H=1 \
    -DHAVE_MEMSET=1 \
    -DHAVE_OPEN_MEMSTREAM=1 \
    -DHAVE_SELINUX_SELINUX_H=1 \
    -DHAVE_STDDEF_H=1 \
    -DHAVE_STDINT_H=1 \
    -DHAVE_STDLIB_H=1 \
    -DHAVE_STRCHR=1 \
    -DHAVE_STRDUP=1 \
    -DHAVE_STRERROR=1 \
    -DHAVE_STRINGS_H=1 \
    -DHAVE_STRING_H=1 \
    -DHAVE_STRSIGNAL=1 \
    -DHAVE_STRTOL=1 \
    -DHAVE_STRTOUL=1 \
    -DHAVE_SYS_IOCTL_H=1 \
    -DHAVE_SYS_PARAM_H=1 \
    -DHAVE_SYS_STAT_H=1 \
    -DHAVE_SYS_TIME_H=1 \
    -DHAVE_SYS_TYPES_H=1 \
    -DHAVE_UNISTD_H=1 \
    -DHAVE_UNWINDER=1 \
    -DHAVE_VFORK=1 \
    -DHAVE_WORKING_FORK=1 \
    -DHAVE_WORKING_VFORK=1 \
    -DLT_OBJDIR='".libs"' \
    -DPACKAGE='"ltrace"' \
    -DPACKAGE_BUGREPORT='"ltrace-devel@lists.alioth.debian.org"' \
    -DPACKAGE_NAME='"ltrace"' \
    -DPACKAGE_STRING='"ltrace 0.7.91"' \
    -DPACKAGE_TARNAME='"ltrace"' \
    -DPACKAGE_URL='"http://ltrace.alioth.debian.org/"' \
    -DPACKAGE_VERSION='"0.7.91"' \
    -DVERSION='"0.7.91"' \
    -D_FILE_OFFSET_BITS=64 \
    -D_LARGE_FILES=1 \
    -DPKGDATADIR=NULL \
    -DSYSCONFDIR='"/etc/"' \
    -Drindex=strrchr \

LOCAL_CFLAGS_32 += -DSIZEOF_LONG=4
LOCAL_CFLAGS_64 += -DSIZEOF_LONG=8

LOCAL_CFLAGS += \
    -Wall \
    -Wno-missing-field-initializers \
    -Wno-unused-parameter \
    -Wno-sign-compare \

LOCAL_STATIC_LIBRARIES := libelf

LOCAL_SHARED_LIBRARIES := \
    libcutils \
    libgccdemangle \
    libselinux \
    libunwind \
    libunwind-ptrace \

LOCAL_MODULE := ltrace

LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)

LOCAL_MODULE_TAGS := debug

LOCAL_MODULE_TARGET_ARCH := arm arm64 x86 x86_64

LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk

include $(BUILD_EXECUTABLE)
