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

# $(1): target or host
# $(2): ndebug or debug
define build-libart
  ifneq ($(1),target)
    ifneq ($(1),host)
      $$(error expected target or host for argument 1, received $(1))
    endif
  endif
  ifneq ($(2),ndebug)
    ifneq ($(2),debug)
      $$(error expected ndebug or debug for argument 2, received $(2))
    endif
  endif

  art_target_or_host := $(1)
  art_ndebug_or_debug := $(2)

  include $(CLEAR_VARS)
  ifeq ($$(art_target_or_host),target)
    include external/stlport/libstlport.mk
  endif
  LOCAL_CPP_EXTENSION := $(ART_CPP_EXTENSION)
  ifeq ($$(art_ndebug_or_debug),ndebug)
    LOCAL_MODULE := libart
  else # debug
    LOCAL_MODULE := libartd
  endif

  LOCAL_MODULE_TAGS := optional
  LOCAL_MODULE_CLASS := SHARED_LIBRARIES

  ifeq ($$(art_target_or_host),target)
    LOCAL_SRC_FILES := $(LIBART_TARGET_SRC_FILES)
  else # host
    LOCAL_SRC_FILES := $(LIBART_HOST_SRC_FILES)
  endif
  ifeq ($$(art_target_or_host),target)
    LOCAL_CFLAGS := $(ART_TARGET_CFLAGS)
  else # host
    LOCAL_CFLAGS := $(ART_HOST_CFLAGS)
  endif
  ifeq ($$(art_ndebug_or_debug),debug)
    ifeq ($$(art_target_or_host),target)
      LOCAL_CFLAGS += $(ART_TARGET_DEBUG_CFLAGS)
    else # host
      LOCAL_CFLAGS += $(ART_HOST_DEBUG_CFLAGS)
      LOCAL_STATIC_LIBRARIES := libgtest_host
    endif
  else
    ifeq ($$(art_target_or_host),target)
      LOCAL_CFLAGS += $(ART_TARGET_NON_DEBUG_CFLAGS)
    else # host
      LOCAL_CFLAGS += $(ART_HOST_NON_DEBUG_CFLAGS)
    endif
  endif
  LOCAL_C_INCLUDES += $(ART_C_INCLUDES)
  ifeq ($(ART_USE_LLVM_COMPILER),true)
    LOCAL_C_INCLUDES += frameworks/compile/linkloader
    libart_arm_STATIC_LIBRARIES := \
      libLLVMARMInfo \
      libLLVMARMDisassembler \
      libLLVMARMAsmParser \
      libLLVMARMAsmPrinter \
      libLLVMARMCodeGen \
      libLLVMARMDesc

    libart_mips_STATIC_LIBRARIES := \
      libLLVMMipsInfo \
      libLLVMMipsCodeGen \
      libLLVMMipsDesc \
      libLLVMMipsAsmPrinter \

    libart_x86_STATIC_LIBRARIES := \
      libLLVMX86Info \
      libLLVMX86AsmParser \
      libLLVMX86CodeGen \
      libLLVMX86Disassembler \
      libLLVMX86Desc \
      libLLVMX86AsmPrinter \
      libLLVMX86Utils

    ifeq ($$(art_target_or_host),target)
      LOCAL_STATIC_LIBRARIES += \
        $$(libart_arm_STATIC_LIBRARIES)
    else
      LOCAL_STATIC_LIBRARIES += \
        $$(libart_arm_STATIC_LIBRARIES) \
        $$(libart_mips_STATIC_LIBRARIES) \
        $$(libart_x86_STATIC_LIBRARIES)
    endif

    LOCAL_STATIC_LIBRARIES += \
      libLLVMLinker \
      libLLVMipo \
      libLLVMBitWriter \
      libLLVMBitReader \
      libLLVMAsmPrinter \
      libLLVMSelectionDAG \
      libLLVMCodeGen \
      libLLVMScalarOpts \
      libLLVMInstCombine \
      libLLVMInstrumentation \
      libLLVMTransformUtils \
      libLLVMipa \
      libLLVMAnalysis \
      libLLVMTarget \
      libLLVMMC \
      libLLVMMCParser \
      libLLVMCore \
      libLLVMSupport \
      librsloader
  endif
  LOCAL_SHARED_LIBRARIES := liblog libnativehelper
  ifeq ($$(art_target_or_host),target)
    LOCAL_SHARED_LIBRARIES += libcutils libstlport libz libdl libdynamic_annotations
  else # host
    LOCAL_STATIC_LIBRARIES += libcutils
    LOCAL_SHARED_LIBRARIES += libz-host libdynamic_annotations-host
    LOCAL_LDLIBS := -ldl -lpthread
    ifeq ($(HOST_OS),linux)
      LOCAL_LDLIBS += -lrt
    endif
  endif
  LOCAL_STATIC_LIBRARIES += libdex
  ifeq ($$(art_target_or_host),target)
    ifeq ($(ART_USE_LLVM_COMPILER),true)
      include $(LLVM_GEN_INTRINSICS_MK)
      include $(LLVM_DEVICE_BUILD_MK)
    endif
    include $(BUILD_SHARED_LIBRARY)
  else # host
    LOCAL_IS_HOST_MODULE := true
    ifeq ($(ART_USE_LLVM_COMPILER),true)
      include $(LLVM_GEN_INTRINSICS_MK)
      include $(LLVM_HOST_BUILD_MK)
    endif
    include $(BUILD_HOST_SHARED_LIBRARY)
  endif
endef

ifeq ($(ART_BUILD_TARGET_NDEBUG),true)
  $(eval $(call build-libart,target,ndebug))
endif
ifeq ($(ART_BUILD_TARGET_DEBUG),true)
  $(eval $(call build-libart,target,debug))
endif
ifeq ($(ART_BUILD_HOST_NDEBUG),true)
  $(eval $(call build-libart,host,ndebug))
endif
ifeq ($(ART_BUILD_HOST_DEBUG),true)
  $(eval $(call build-libart,host,debug))
endif
