#  Copyright 2024 Cix Technology Group Co., Ltd.

# SPDX-License-Identifier: Apache-2.0
RM  := rm -rf

# Directories
SRC_ROOT := ./src
COMPASS_DRV_BTENVAR_TEST_BUILD_DIR ?= $(shell pwd)/src
BUILD_AIPU_DRV_ODIR ?= $(shell pwd)/build

BUILD_DIR := $(COMPASS_DRV_BTENVAR_TEST_BUILD_DIR)
OUTPUT_DIR := $(BUILD_AIPU_DRV_ODIR)
UMD_INC := $(PATH_EXPORT_INCLUDE)/npu
LD_DIR := ${PATH_EXPORT_LIB}

# Compiler and flags
CXXFLAGS := -Wall -Werror -std=c++14 -I$(SRC_ROOT) -I$(UMD_INC) -MMD -MP
LDFLAGS_AIPU := -L$(LD_DIR) -laipudrv
LDFLAGS_NOE := -L$(LD_DIR) -lnoe

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

# AIPU version
CXXFLAGS += -DZHOUYI_V3

# Platform-specific flags
ifneq ($(BUILD_ANDROID_NDK),)
    LDFLAGS_AIPU += -pthread
    LDFLAGS_NOE += -pthread
else
    LDFLAGS_AIPU += -lpthread
    LDFLAGS_NOE += -lpthread
endif

# Source directories
dirs := $(notdir $(wildcard $(SRC_ROOT)/*))
dirs := $(filter-out src, $(dirs))

# Pattern rules for building object files and test/sample executables
VPATH := $(SRC_ROOT)

#AIPU##########################################################################
# AIPU UMD Test and sample targets
#AIPUS :=  benchmark_test profiler_test debugger_test time_cost_test batch_test \
#        flush_job_test mthread_test multi_model_test sharebuffer_test \
#        dmabuf_dma_test dmabuf_attach_test dmabuf_mmap_test dmabuf_vmap_test \
#        dynamic_core_test dynamic_shape_test dfs_test llm_test sd_demo \

# Object files and target names
OBJS_common := $(BUILD_DIR)/common/helper.o $(BUILD_DIR)/common/cmd_line_parsing.o

# Targets list
#AIPU_TARGETS := $(addprefix $(OUTPUT_DIR)/aipu_, $(AIPUS))

#NOE###########################################################################
# # NOE UMD Test and sample targets
NOES := perf_test

# Object files and target names
OBJS_noe_utils := $(BUILD_DIR)/noe_utils/helper.o $(BUILD_DIR)/noe_utils/cmd_line_parsing.o

# # Targets list
NOE_TARGETS := $(addprefix $(OUTPUT_DIR)/noe_, $(NOES))

$(BUILD_DIR)/%.o: %.cpp
	@mkdir -p $(@D)
	$(CXX) $(CXXFLAGS) -c $< -o $@

$(OUTPUT_DIR)/aipu_%: $(BUILD_DIR)/%/main.o $(OBJS_common)
	@mkdir -p $(@D)
	$(CXX) $^ $(LDFLAGS_AIPU) -o $@

$(OUTPUT_DIR)/noe_%: $(BUILD_DIR)/%/main.o $(BUILD_DIR)/%/npu_phase.o $(OBJS_noe_utils)
	@mkdir -p $(@D)
	$(CXX) $^ $(LDFLAGS_NOE) -o $@

# Default target
all: build-repo $(AIPU_TARGETS) $(NOE_TARGETS)

# Create necessary build directories
build-repo:
	@for dir in $(dirs); do \
		mkdir -p $(BUILD_DIR)/$$dir; \
	done

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

# Clean rule to remove generated files
clean:
	#$(RM) -r $(BUILD_DIR) $(OUTPUT_DIR)/*
	$(RM) $(OUTPUT_DIR) $(BUILD_DIR)/*/*.d

# Include dependency files
-include $(OBJS_common:.o=.d)
-include $(OBJS_noe_utils:.o=.d)
-include $(BUILD_DIR)/*/*.d

# Phony targets
.PHONY: all clean build-repo
