# 当前工程路径
PROJECT_PATH := $(shell pwd)

# 编译器路径
TOOLCHAIN_ROOT := $(PROJECT_PATH)/../../compiler

# 编译工具
SDCC_HOME := $(TOOLCHAIN_ROOT)/sdcc-4.5.0
SDCC := $(SDCC_HOME)/bin/sdcc
SDAS := $(SDCC_HOME)/bin/sdas8051
PACKIHX := $(SDCC_HOME)/bin/packihx

MCU_MODEL = -mmcs51 --stack-auto
MODEL  = --model-large
CODE_SIZE = --code-size 0x2000  # 8KB 的 Flash 存储器
IRAM_SIZE = --iram-size 0x100    # 256B 的内部 SRAM idata
XRAM_SIZE = --xram-size 0x400   # 1KB 的内部扩展 RAM xdata

# 目标文件
FILE_NAME   := ventus
VERSION 	:= v0.0.1
DATE_TIME 	:= none
# DATE_TIME 	:= $(shell date +"%Y%m%d_%H%M%S")
COPY_PATH   := /share/bin/stc

TARGET := stc_$(FILE_NAME)_$(VERSION)_$(DATE_TIME)
BUILDDIR := build
HEXDIR := $(BUILDDIR)/bin
HEXFILE := $(HEXDIR)/$(TARGET).hex
BINFILE := $(HEXDIR)/$(TARGET).bin
MAPFILE := $(BUILDDIR)/$(TARGET).map

# 项目路径
SRCDIR_PATH := $(PROJECT_PATH)/driver
LIB_PATH := $(PROJECT_PATH)/../../lib
WORK_PATH := $(PROJECT_PATH)/work

# 扫描所有源文件目录
SRCS_DIR += $(shell find $(SRCDIR_PATH) -type d 2>/dev/null) \
    $(shell find $(LIB_PATH) -type d 2>/dev/null) \
    $(shell find $(WORK_PATH) -type d 2>/dev/null)

# 扫描所有头文件目录
INC_DIR += $(shell find $(SRCDIR_PATH) -type d 2>/dev/null) \
    $(shell find $(LIB_PATH) -type d 2>/dev/null) \
    $(shell find $(WORK_PATH) -type d 2>/dev/null)

# 查找所有源文件
SRCS := $(foreach dir,$(SRCS_DIR), $(wildcard $(dir)/*.c))

# 生成包含路径
INCLUDES := $(foreach dir,$(INC_DIR), -I$(dir))

# 生成目标文件路径（使用相对路径）
SRCS_REL := $(patsubst $(PROJECT_PATH)/%,%,$(SRCS))
OBJS := $(patsubst %.c,$(BUILDDIR)/%.rel,$(SRCS_REL))

# 主目标
all: check_env $(HEXFILE) copy

check_env:
	@if [ ! -f "$(SDCC)" ]; then \
		echo "error: not found sdcc compiler,$(SDCC)"; \
		exit 1; \
	fi
	@mkdir -p $(BUILDDIR) $(HEXDIR)

# 编译规则
$(BUILDDIR)/%.rel: %.c
	@mkdir -p $(dir $@)
	@echo "Compiling $<"
	
# 	@$(SDCC) -c -o $@ $(MCU_MODEL) $(INCLUDES) $(MODEL) --nogcse --noinvariant --noinduction \
# 	--noloopreverse --no-peep --nooverlay --out-fmt-ihx --debug $<
	@$(SDCC) -c -o $@ $(MCU_MODEL) $(INCLUDES) $(MODEL) --out-fmt-ihx --debug $<

$(BUILDDIR)/%.rel: %.asm
	@mkdir -p $(dir $@)
	$(SDAS) -o $(INCLUDES) $@ $<

# 生成 HEX 文件
$(HEXFILE): $(OBJS)
	@mkdir -p $(dir $@)
	$(SDCC) -o $@ $(MCU_MODEL) $(INCLUDES) $(MODEL) $(CODE_SIZE) \
	$(IRAM_SIZE) $(XRAM_SIZE) --out-fmt-ihx $^

rebuild: clean all

copy:
	@mkdir -p $(COPY_PATH)
	@rm -rf $(COPY_PATH)/stc_$(FILE_NAME)*
	@cp -f $(HEXFILE) $(COPY_PATH)/

clean:
	@echo "Cleaning project..."
	@rm -rf $(BUILDDIR)

.PHONY: all clean check_env rebuild copy
