# Makefile — STM32F103 标准库 (SPL V1.4) + arm-none-eabi-gcc 云端编译
# 用法: make all           → 编译整个工程
#       make clean         → 清理
#       make cppcheck      → 静态代码审查
#       make disasm        → 反汇编查看生成的汇编

# ─── 目标芯片 ───
TARGET   = solar_tracker_f103
MCU      = cortex-m3
FLOAT_ABI = soft

# ─── 路径配置（根据实际工程结构调整） ───
PROJ_DIR    = .
SRC_DIR     = $(PROJ_DIR)/Src
INC_DIR     = $(PROJ_DIR)/Inc
SPL_DIR     = $(PROJ_DIR)/Libraries/STM32F10x_StdPeriph_Driver
STARTUP_DIR = $(PROJ_DIR)/Libraries/CMSIS/Device/ST/STM32F10x

# ─── 头文件搜索路径 ───
INCLUDES  = -I$(INC_DIR)
INCLUDES += -I$(SPL_DIR)/inc
INCLUDES += -I$(STARTUP_DIR)

# ─── 源文件（自动扫描 Src/ 和 SPL 驱动） ───
SRC_C  = $(wildcard $(SRC_DIR)/*.c)
SRC_C += $(wildcard $(SPL_DIR)/src/*.c)

# ─── 启动文件 ───
# F103C8/CB 用 startup_stm32f10x_md.s
# F103VE    用 startup_stm32f10x_hd.s
# F103ZG    用 startup_stm32f10x_xl.s
STARTUP_ASM = $(STARTUP_DIR)/startup_stm32f10x_md.s

# ─── 编译标志 ───
CFLAGS  = -mcpu=$(MCU) -mthumb -mfloat-abi=$(FLOAT_ABI)
CFLAGS += -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER
CFLAGS += -Os -ffunction-sections -fdata-sections -Wall -Wextra
CFLAGS += -Wno-unused-parameter -Wno-unused-variable
CFLAGS += $(INCLUDES)

LDFLAGS = -mcpu=$(MCU) -mthumb -mfloat-abi=$(FLOAT_ABI)
LDFLAGS += -Wl,--gc-sections -Wl,-Map=$(TARGET).map
LDFLAGS += -T $(PROJ_DIR)/STM32F103C8Tx_FLASH.ld

# ─── 目标文件 ───
OBJS_C   = $(SRC_C:.c=.o)
OBJS_ASM = $(STARTUP_ASM:.s=.o)

# ─── 工具链 ───
CC      = arm-none-eabi-gcc
OBJCOPY = arm-none-eabi-objcopy
OBJDUMP = arm-none-eabi-objdump
SIZE    = arm-none-eabi-size
CPPCHECK = cppcheck

# ─── 编译规则 ───
.PHONY: all clean cppcheck disasm size

all: $(TARGET).elf $(TARGET).bin $(TARGET).hex

$(TARGET).elf: $(OBJS_C) $(OBJS_ASM)
	$(CC) $(LDFLAGS) -o $@ $^ -lm
	$(SIZE) $@

$(TARGET).bin: $(TARGET).elf
	$(OBJCOPY) -O binary $< $@

$(TARGET).hex: $(TARGET).elf
	$(OBJCOPY) -O ihex $< $@

%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<

%.o: %.s
	$(CC) $(CFLAGS) -c -o $@ $<

# ─── 静态代码审查 ───
cppcheck:
	$(CPPCHECK) --enable=all --suppress=missingIncludeSystem \
		--suppress=unmatchedSuppression \
		-I$(INC_DIR) -I$(SPL_DIR)/inc -I$(STARTUP_DIR) \
		$(SRC_C)

# ─── 反汇编 ───
disasm: $(TARGET).elf
	$(OBJDUMP) -d $(TARGET).elf > $(TARGET).S
	@echo "反汇编输出: $(TARGET).S"

# ─── 清理 ───
clean:
	rm -f $(OBJS_C) $(OBJS_ASM)
	rm -f $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).map
	rm -f $(TARGET).S
