# Minimal Makefile for STM32F407 bootloader (Phase 0–3, pre-SPI)
# Toolchain: arm-none-eabi-gcc
#
# Uses:
#  - standalone stm32f4xx-hal-driver repository
#  - CMSIS device pack for STM32F4

HAL_REPO   ?= ../stm32f4xx-hal-driver
CMSIS_CORE_REPO ?= ../cmsis_core
CMSIS_DEVICE_F4_REPO ?= ../cmsis_device_f4

HAL_DIR    := $(HAL_REPO)
CMSIS_CORE := $(CMSIS_CORE_REPO)/CMSIS/Core
CMSIS_DEV  := $(CMSIS_DEVICE_F4_REPO)

CC      := arm-none-eabi-gcc
AS      := arm-none-eabi-gcc
OBJCOPY := arm-none-eabi-objcopy
SIZE    := arm-none-eabi-size

TARGET  := bootloader
BUILD   := build

APP_OBJDIR := $(BUILD)/app
HAL_OBJDIR := $(BUILD)/hal
CMSIS_OBJDIR := $(BUILD)/cmsis

CFLAGS := -mcpu=cortex-m4 -mthumb -O2 -g3           -ffunction-sections -fdata-sections           -Wall -Wextra -Wno-unused-parameter           -std=gnu11 -DSTM32F407xx -DUSE_HAL_DRIVER

INCLUDES :=     -Iinc	-Ihal_conf	-I$(HAL_DIR)/Inc     -I$(CMSIS_CORE)/Include     -I$(CMSIS_DEV)/Include

LDSCRIPT := linker/STM32F417IG_FLASH.ld

LDFLAGS := -T$(LDSCRIPT)            -Wl,--gc-sections           --specs=nosys.specs

APP_SRCS_C :=	src/main.c	src/bl_led.c	src/bl_image.c     src/bl_meta.c     src/bl_update.c     src/bl_flash.c      src/ram_test.c

HAL_SRCS_C :=	$(HAL_DIR)/Src/stm32f4xx_hal.c     $(HAL_DIR)/Src/stm32f4xx_hal_gpio.c     $(HAL_DIR)/Src/stm32f4xx_hal_flash.c     $(HAL_DIR)/Src/stm32f4xx_hal_flash_ex.c     $(HAL_DIR)/Src/stm32f4xx_hal_cortex.c $(HAL_DIR)/Src/stm32f4xx_hal_rcc.c

CMSIS_SRCS_C := $(CMSIS_DEV)/Source/Templates/system_stm32f4xx.c

SRCS_S := startup/startup_stm32f40_41xxx.s

APP_OBJS := $(patsubst src/%.c,$(APP_OBJDIR)/%.o,$(APP_SRCS_C))
HAL_OBJS := $(addprefix $(HAL_OBJDIR)/,$(notdir $(HAL_SRCS_C:.c=.o)))
CMSIS_OBJS := $(addprefix $(CMSIS_OBJDIR)/,$(notdir $(CMSIS_SRCS_C:.c=.o)))

OBJS :=     $(APP_OBJS) $(HAL_OBJS) $(CMSIS_OBJS) $(patsubst %.s,$(BUILD)/%.o,$(SRCS_S))

DEPS := $(OBJS:.o=.d)

.PHONY: all clean size

all: $(BUILD)/$(TARGET).elf $(BUILD)/$(TARGET).bin size

$(APP_OBJDIR)/%.o: src/%.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -c $< -o $@

$(HAL_OBJDIR)/%.o: $(HAL_DIR)/Src/%.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -c $< -o $@

$(CMSIS_OBJDIR)/%.o: $(CMSIS_DEV)/Source/Templates/%.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -c $< -o $@

$(BUILD)/%.o: %.s
	@mkdir -p $(dir $@)
	$(AS) $(CFLAGS) -c $< -o $@

$(BUILD)/$(TARGET).elf: $(OBJS)
	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) -o $@

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

size: $(BUILD)/$(TARGET).elf
	$(SIZE) $<

clean:
	rm -rf $(BUILD)

-include $(DEPS)
