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

ARCHFLAGS:=-mthumb -std=gnu11 -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16
CFLAGS:=$(ARCHFLAGS) -O2 -Wall -Wextra -DNDEBUG -ffunction-sections -fdata-sections -flto $(addprefix -I,$(INCLUDES)) $(addprefix -D,$(MACROS))
LDFLAGS:=$(ARCHFLAGS) -mcpu=cortex-m7 -mthumb -flto -Wl,--gc-sections
PREFIX:=arm-none-eabi-
BUILDDIR=Release

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 $(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 $(CFLAGS) -MD -c -o $@ $<

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

.PHONY : clean

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