INCLUDES=Inc Drivers/STM32H7xx_HAL_Driver/Inc Drivers/CMSIS/Device/ST/STM32H7xx/Include Drivers/CMSIS/Include Middlewares/Third_Party/LwIP/src/include Middlewares/Third_Party/LwIP/system Drivers/BSP/Components/lan8742
MACROS=STM32H743xx

ifeq ($(DEBUG),y)
	OPTFLAGCL:=-Og -ffunction-sections -fdata-sections
	OPTFLAGLD:=-Wl,--gc-sections
	BUILDDIR=Debug
else
	OPTFLAGCL:=-Os -ffunction-sections -fdata-sections -flto -DNDEBUG
	OPTFLAGLD:=-Wl,--gc-sections -flto
	BUILDDIR=Release
endif

ARCHFLAGS:=-mthumb -std=gnu11 -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16
CFLAGS:=-Wall -Wextra $(addprefix -I,$(INCLUDES)) $(addprefix -D,$(MACROS))
LDFLAGS:=-mcpu=cortex-m7 -mthumb
PREFIX:=arm-none-eabi-


rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))

C_SOURCES:=$(call rwildcard,,*.c)
S_SOURCES:=$(call rwildcard,,*.s)
OBJECTS := $(addprefix $(BUILDDIR)/,$(C_SOURCES:%.c=%.o)) $(addprefix $(BUILDDIR)/,$(S_SOURCES:%.s=%.o))
DEPS:=$(addprefix $(BUILDDIR)/,$(C_SOURCES:%.c=%.d))
EXENAME=Prog

all : $(BUILDDIR)/$(EXENAME).elf $(BUILDDIR)/$(EXENAME).bin $(BUILDDIR)/$(EXENAME).hex

$(BUILDDIR)/$(EXENAME).elf : $(OBJECTS)
	$(PREFIX)gcc $(ARCHFLAGS) $(OPTFLAGLD) $(LDFLAGS) -T STM32H743ZITx_FLASH.ld -o $@ $^

$(BUILDDIR)/$(EXENAME).bin : $(BUILDDIR)/$(EXENAME).elf
	$(PREFIX)objcopy -O binary $< $@

$(BUILDDIR)/$(EXENAME).hex : $(BUILDDIR)/$(EXENAME).elf
	$(PREFIX)objcopy -O ihex $< $@

-include $(DEPS)

$(BUILDDIR)/%.o : %.c
	@if ! [ -d $(dir $@) ] ; then mkdir -p $(dir $@) || exit 1 ; fi
	$(PREFIX)gcc $(ARCHFLAGS) $(OPTFLAGCL) $(CFLAGS) -MD -c -o $@ $<

$(BUILDDIR)/%.o : %.s
	@if ! [ -d $(dir $@) ] ; then mkdir -p $(dir $@) || exit 1 ; fi
	$(PREFIX)gcc $(ARCHFLAGS) -c -o $@ $<

.PHONY : clean

clean :
	rm -f $(OBJECTS) $(BUILDDIR)/$(EXENAME).elf $(BUILDDIR)/$(EXENAME).bin $(BUILDDIR)/$(EXENAME).hex
