# =============================================================================
# HERV Firmware - Nuvoton NANO100SE3BN (Cortex-M0)
# Eclipse(Nueclipse) -> VS Code + ARM-GCC 마이그레이션
#
# 사용법:
#   make          : 빌드 (build/HERV.elf, .hex, .bin)
#   make clean    : 빌드 정리
#   make flash    : Nu-Link 으로 플래시 (OpenOCD-Nuvoton 필요)
#   make erase    : 칩 erase
#   make size     : 메모리 사용량 출력
# =============================================================================

PROJECT  := HERV
BUILD    := build

# --- Toolchain ---
PREFIX   := arm-none-eabi-
CC       := $(PREFIX)gcc
AS       := $(PREFIX)gcc -x assembler-with-cpp
LD       := $(PREFIX)gcc
OBJCOPY  := $(PREFIX)objcopy
SIZE     := $(PREFIX)size

# --- MCU ---
MCU      := -mcpu=cortex-m0 -mthumb

# --- Include 경로 (Eclipse 와 동일) ---
INCLUDES := \
    -ILibrary/CMSIS/Include \
    -ILibrary/Device/Nuvoton/Nano100Series/Include \
    -ILibrary/StdDriver/inc \
    -IUser

# --- 공통 컴파일 플래그 (Eclipse subdir.mk 에서 추출) ---
COMMON_FLAGS := $(MCU) -Os -g \
                -fmessage-length=0 -fsigned-char \
                -ffunction-sections -fdata-sections

CFLAGS  := $(COMMON_FLAGS) $(INCLUDES) -std=gnu11 -MMD -MP
ASFLAGS := $(COMMON_FLAGS) -MMD -MP

# --- 링커 ---
LDSCRIPT := Library/Device/Nuvoton/Nano100Series/Source/GCC/gcc_arm.ld
LDFLAGS  := $(COMMON_FLAGS) -T$(LDSCRIPT) \
            -Xlinker --gc-sections \
            -Wl,-Map=$(BUILD)/$(PROJECT).map

# --- 소스 자동 수집 ---
# 주의: User/pwm_duty10000.c 가 StdDriver/pwm.c 를 대체하므로 pwm.c 는 빌드에서 제외
#       (Eclipse Nueclipse 프로젝트도 동일하게 pwm.c 를 exclude 하고 빌드)
STDDRIVER_EXCLUDE := Library/StdDriver/src/pwm.c
# 백업 소스(빌드 제외) : My_Hood_old.c = 후드 프로토콜 13B 구버전 보관본(중복심볼 방지)
USER_EXCLUDE := User/My_Hood_old.c

C_SRCS := \
    $(filter-out $(USER_EXCLUDE), $(wildcard User/*.c)) \
    $(filter-out $(STDDRIVER_EXCLUDE), $(wildcard Library/StdDriver/src/*.c)) \
    Library/Device/Nuvoton/Nano100Series/Source/system_Nano100Series.c \
    Library/Device/Nuvoton/Nano100Series/Source/GCC/_syscalls.c

ASM_SRCS := \
    Library/Device/Nuvoton/Nano100Series/Source/GCC/startup_Nano100Series.S

# --- Object 파일 (build/ 아래 같은 트리 구조 유지) ---
OBJS := $(addprefix $(BUILD)/, $(C_SRCS:.c=.o)) \
        $(addprefix $(BUILD)/, $(ASM_SRCS:.S=.o))
DEPS := $(OBJS:.o=.d)

# --- 출력 ---
ELF := $(BUILD)/$(PROJECT).elf
HEX := $(BUILD)/$(PROJECT).hex
BIN := $(BUILD)/$(PROJECT).bin

# =============================================================================
# Targets
# =============================================================================

.PHONY: all clean flash erase debug-server size rebuild

all: $(ELF) $(HEX) $(BIN) size

# clean -> all 을 순차 실행 (병렬 make -jN 에서 clean/all 동시 실행 방지)
rebuild:
	@$(MAKE) clean
	@$(MAKE) all

$(ELF): $(OBJS)
	@echo '[LD]  $@'
	@$(LD) $(LDFLAGS) -o $@ $^

$(HEX): $(ELF)
	@echo '[HEX] $@'
	@$(OBJCOPY) -O ihex $< $@

$(BIN): $(ELF)
	@echo '[BIN] $@'
	@$(OBJCOPY) -O binary $< $@

size: $(ELF)
	@echo ''
	@$(SIZE) --format=berkeley $<
	@echo ''

# C 컴파일
$(BUILD)/%.o: %.c
	@mkdir -p $(dir $@)
	@echo '[CC]  $<'
	@$(CC) $(CFLAGS) -c $< -o $@

# Assembly 컴파일
$(BUILD)/%.o: %.S
	@mkdir -p $(dir $@)
	@echo '[AS]  $<'
	@$(AS) $(ASFLAGS) -c $< -o $@

# Nu-Link 으로 플래시 굽기
flash: $(ELF)
	openocd -f openocd.cfg -c "program $(ELF) verify reset exit"

# OpenOCD GDB 서버만 실행 (VS Code 디버그용)
debug-server:
	openocd -f openocd.cfg

# 칩 erase
erase:
	openocd -f openocd.cfg -c "init; reset halt; nuc_chip_erase; exit"

clean:
	@echo 'Cleaning...'
	@rm -rf $(BUILD)

-include $(DEPS)
