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

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 -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16
CFLAGS:=-Wall -Wextra -std=gnu11 $(addprefix -I,$(INCLUDES)) $(addprefix -D,$(MACROS))
LDFLAGS:=-T STM32H743ZITx_FLASH.ld
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_C := $(addprefix $(BUILDDIR)/,$(C_SOURCES:%.c=%.o))
OBJECTS_S := $(addprefix $(BUILDDIR)/,$(S_SOURCES:%.s=%.o))
OBJECTS := $(OBJECTS_C) $(OBJECTS_S)
DEPS:=$(addprefix $(BUILDDIR)/,$(C_SOURCES:%.c=%.d))
EXENAME:=Prog

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

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

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

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

$(BUILDDIR)/$(EXENAME).disas : $(BUILDDIR)/$(EXENAME).elf
	$(PREFIX)objdump -d -C $< > $@

-include $(DEPS)

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

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

.PHONY : clean all

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

