# Copyright (C) 2022 Arm Technology (China) Co. Ltd. All rights reserved.
#
# SPDX-License-Identifier: Apache-2.0

MD  := mkdir -p
RM  := rm -rf

SRC_ROOT := ./src
UMD_INC := $(PATH_EXPORT_INCLUDE)/npu
LD_DIR := ${PATH_EXPORT_LIB}
CXXFLAGS := -Wall -Werror -std=c++14 -I$(SRC_ROOT) -I$(UMD_INC)
LDFLAGS = -L$(LD_DIR) -laipudrv

ANDROIDCXXFLAGS := --target=aarch64-none-linux-android21 \
                   --gcc-toolchain=$(BUILD_ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64 \
                   --sysroot=$(BUILD_ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
                   -DGTEST_HAS_RTTI=0 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -DANDROID -Wno-error
ANDROIDLDFLAGS := -Wl,-O3 -Wl,--gc-sections \
                  -Wl,--exclude-libs,$(BUILD_ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/lib/gcc/aarch64-linux-android/4.9.x/libgcc.a \
                  -Wl,--exclude-libs,$(BUILD_ANDROID_NDK)/toolchains/llvm/prebuilt/linux-x86_64/aarch64-linux-android/lib64/libatomic.a \
                  -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Qunused-arguments -Wl,-z,noexecstack  -Wl,-z,defs

ifeq ($(BUILD_TARGET_PLATFORM), sim)
    ifneq ($(BUILD_AIPU_VERSION), z123)
        LDFLAGS += -L$(CONFIG_DRV_BRENVAR_AIPUV3_SIM_LPATH) -l$(COMPASS_DRV_BRENVAR_AIPUV3_SIM_LNAME)
    endif
endif

ifeq ($(BUILD_TARGET_PLATFORM), sim)
    CXXFLAGS += -DSIMULATION=1
endif

ifeq ($(BUILD_DEBUG_FLAG), debug)
    CXXFLAGS += -O0 -g -DRTDEBUG=1
else
    CXXFLAGS += -O2 -DRTDEBUG=0
endif

ifeq ($(BUILD_AIPU_VERSION), z123)
    CXXFLAGS += -DZHOUYI_V12
endif

ifeq ($(BUILD_AIPU_VERSION), x2)
    CXXFLAGS += -DZHOUYI_V3
endif

ifeq ($(BUILD_AIPU_VERSION), all)
    CXXFLAGS += -DZHOUYI_V12
    CXXFLAGS += -DZHOUYI_V3
endif

ifneq ($(BUILD_ANDROID_NDK), )
    LDFLAGS += -pthread
    CXXFLAGS += $(ANDROIDCXXFLAGS)
    LDFLAGS += $(ANDROIDCXXFLAGS) $(ANDROIDLDFLAGS)
else
    LDFLAGS += -lpthread
endif

COMPASS_DRV_BTENVAR_TEST_BUILD_DIR ?= $(shell pwd)/build
BUILD_AIPU_DRV_ODIR ?= $(shell pwd)/build

ifdef BUILD_TEST_CASE
SRCS += $(wildcard $(SRC_ROOT)/$(BUILD_TEST_CASE)/*.cpp) \
        $(wildcard $(SRC_ROOT)/common/cmd_line_parsing.cpp) \
        $(wildcard $(SRC_ROOT)/common/helper.cpp)
SRC_DIRS := $(SRC_ROOT)/common $(SRC_ROOT)/$(BUILD_TEST_CASE)
SRC_DIRS := $(patsubst $(SRC_ROOT)/%, %, $(SRC_DIRS))

OBJS = $(patsubst $(SRC_ROOT)/%.cpp, $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/%.o, $(SRCS))

TARGET := $(BUILD_AIPU_DRV_ODIR)/npu_$(BUILD_TEST_CASE)

all: build-repo $(TARGET)

$(TARGET): $(OBJS)
	$(CXX) $^ $(LDFLAGS) -o $@

define make-repo
	$(MD) $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)
	for dir in $(SRC_DIRS); \
	do \
		$(MD) $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/$$dir; \
	done
endef

else
dirs := $(shell find $(SRC_ROOT) -maxdepth 1 -type d)
dirs := $(basename $(patsubst ./%,%,$(dirs)))
exclude_dirs := src
dirs := $(filter-out $(exclude_dirs), $(dirs))
dirs := $(basename $(patsubst src/%,%,$(dirs)))

OBJS_common := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/common/helper.o \
    $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/common/cmd_line_parsing.o

OBJS_batch_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/batch_test/main.o $(OBJS_common)
OBJS_benchmark_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/benchmark_test/main.o $(OBJS_common)
OBJS_debugger_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/debugger_test/main.o $(OBJS_common)
OBJS_dmabuf_dma_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/dmabuf_dma_test/main.o $(OBJS_common)
OBJS_dmabuf_mmap_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/dmabuf_mmap_test/main.o $(OBJS_common)
OBJS_dmabuf_vmap_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/dmabuf_vmap_test/main.o $(OBJS_common)
OBJS_flush_job_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/flush_job_test/main.o $(OBJS_common)
OBJS_llm_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/llm_test/main.o $(OBJS_common)
OBJS_mthread_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/mthread_test/main.o $(OBJS_common)
OBJS_multi_model_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/multi_model_test/main.o $(OBJS_common)
OBJS_profiler_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/profiler_test/main.o $(OBJS_common)
OBJS_sharebuffer_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/sharebuffer_test/main.o $(OBJS_common)
OBJS_time_cost_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/time_cost_test/main.o $(OBJS_common)
OBJS_sd_demo := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/sd_demo/main.o $(OBJS_common)
OBJS_dynamic_core_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/dynamic_core_test/main.o $(OBJS_common)
OBJS_dfs_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/dfs_test/main.o $(OBJS_common)
OBJS_dump_test := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/dump_test/main.o $(OBJS_common)
OBJS_npu_perf := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/npu_perf/main.o $(OBJS_common) \
	$(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/npu_perf/npu_phase.o
TARGET_batch_test := $(BUILD_AIPU_DRV_ODIR)/npu_batch_test
TARGET_benchmark_test :=$(BUILD_AIPU_DRV_ODIR)/npu_benchmark_test
TARGET_debugger_test :=$(BUILD_AIPU_DRV_ODIR)/npu_debugger_test
TARGET_dmabuf_dma_test :=$(BUILD_AIPU_DRV_ODIR)/npu_dmabuf_dma_test
TARGET_dmabuf_mmap_test :=$(BUILD_AIPU_DRV_ODIR)/npu_dmabuf_mmap_test
TARGET_dmabuf_vmap_test :=$(BUILD_AIPU_DRV_ODIR)/npu_dmabuf_vmap_test
TARGET_flush_job_test :=$(BUILD_AIPU_DRV_ODIR)/npu_flush_job_test
TARGET_llm_test :=$(BUILD_AIPU_DRV_ODIR)/npu_llm_test
TARGET_mthread_test :=$(BUILD_AIPU_DRV_ODIR)/npu_mthread_test
TARGET_multi_model_test :=$(BUILD_AIPU_DRV_ODIR)/npu_multi_model_test
TARGET_profiler_test :=$(BUILD_AIPU_DRV_ODIR)/npu_profiler_test
TARGET_sharebuffer_test :=$(BUILD_AIPU_DRV_ODIR)/npu_sharebuffer_test
TARGET_time_cost_test :=$(BUILD_AIPU_DRV_ODIR)/npu_time_cost_test
TARGET_sd_demo :=$(BUILD_AIPU_DRV_ODIR)/npu_sd_demo
TARGET_dynamic_core_test :=$(BUILD_AIPU_DRV_ODIR)/npu_dynamic_core_test
TARGET_dfs_test :=$(BUILD_AIPU_DRV_ODIR)/npu_dfs_test
TARGET_dump_test :=$(BUILD_AIPU_DRV_ODIR)/npu_dump_test
TARGET_perf_test :=$(BUILD_AIPU_DRV_ODIR)/npu_perf_test

TARGETS = $(wildcard $(BUILD_AIPU_DRV_ODIR)/npu_*)

all: build-repo \
    $(TARGET_batch_test) \
    $(TARGET_benchmark_test) \
    $(TARGET_debugger_test) \
    $(TARGET_dmabuf_dma_test) \
    $(TARGET_dmabuf_mmap_test) \
    $(TARGET_dmabuf_vmap_test) \
    $(TARGET_flush_job_test) \
    $(TARGET_llm_test) \
    $(TARGET_mthread_test) \
    $(TARGET_multi_model_test) \
    $(TARGET_profiler_test) \
    $(TARGET_sharebuffer_test) \
    $(TARGET_time_cost_test) \
    $(TARGET_sd_demo) \
    $(TARGET_dynamic_core_test) \
    $(TARGET_dfs_test) \
    $(TARGET_dump_test) \
    $(TARGET_perf_test)

$(TARGET_batch_test): $(OBJS_batch_test)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_benchmark_test): $(OBJS_benchmark_test)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_debugger_test): $(OBJS_debugger_test)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_dmabuf_dma_test): $(OBJS_dmabuf_dma_test)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_dmabuf_mmap_test): $(OBJS_dmabuf_mmap_test)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_dmabuf_vmap_test): $(OBJS_dmabuf_vmap_test)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_flush_job_test): $(OBJS_flush_job_test)
	$(CXX) $^ $(LDFLAGS) -o $@
	#$(RM) $(OBJS_batch_test)

$(TARGET_llm_test): $(OBJS_llm_test)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_mthread_test): $(OBJS_mthread_test)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_multi_model_test): $(OBJS_multi_model_test)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_profiler_test): $(OBJS_profiler_test)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_sharebuffer_test): $(OBJS_sharebuffer_test)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_time_cost_test): $(OBJS_time_cost_test)
	$(CXX) $^ $(LDFLAGS) -o $@
        
$(TARGET_dynamic_core_test): $(OBJS_dynamic_core_test)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_sd_demo): $(OBJS_sd_demo)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_dfs_test): $(OBJS_dfs_test)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_dump_test): $(OBJS_dump_test)
	$(CXX) $^ $(LDFLAGS) -o $@

$(TARGET_perf_test): $(OBJS_npu_perf)
	$(CXX) $^ $(LDFLAGS) -o $@

define make-repo
	for dir in $(dirs); \
	do \
		$(MD) $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/$$dir; \
	done
endef
endif

$(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/%.o: $(SRC_ROOT)/%.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

build-repo:
	@$(call make-repo)

install:
	echo "Target is $(TARGETS)"
	@set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i install ; done
	@for i in $(TARGETS); do \
		ln -f $$i ../../../../bin/ ;\
		echo "***********************************************" ; \
		echo "** INSTALL : $$i " ;\
		echo "***********************************************" ; \
	done
	#@-ln -f $(TARGET) ../../bin/
	@echo

clean:
	#$(RM) $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)/%.o
	#$(RM) $(BUILD_AIPU_DRV_ODIR)/*
	$(RM) $(BUILD_AIPU_DRV_ODIR)
	#rm -rf $(BUILD_AIPU_DRV_ODIR)

.PHONY: all clean
