# Compilateur et options
CC = arm-none-eabi-gcc

CFLAGS = -mcpu=cortex-m4 -mthumb -Wall -Wextra
CPPFLAGS = -DSTM32F410Rx \
	-I../01-lib/gcc \
	-I../01-lib/Core \
	-I../01-lib/User \
	-I../01-lib

# Linker
LINKER_FILE = generatedLinkerIDE.ld
LDFLAGS = -T $(LINKER_FILE)

# Répertoire build et bin
BUILD = build
BIN = bin

# Fichiers source
SRCS := main.c \
       ../01-lib/User/syscalls.c \
       ../01-lib/User/sysmem.c \
       ../01-lib/system_stm32f4xx.c
# Fichier startup asm
ASM_SRCS = ../01-lib/gcc/startup_stm32f410rx.s

# Objets
OBJS = $(patsubst %.c,$(BUILD)/%.o,$(notdir $(SRCS))) \
       $(patsubst %.s,$(BUILD)/%.o,$(notdir $(ASM_SRCS)))


# Cible principale
all: $(BUILD)/main.elf

# Crée le dossier build/ et bin/
$(BUILD):
	mkdir -p $(BUILD)

$(BIN):
	mkdir -p $(BIN)

# Link
$(BUILD)/main.elf: $(BUILD) $(OBJS)
	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) -lc -lm -lnosys -o $@

# Compilation des fichiers C
$(BUILD)/%.o: %.c | $(BUILD)
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@

$(BUILD)/%.o: ../01-lib/User/%.c | $(BUILD)
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@

$(BUILD)/%.o: ../00-cmsis-device-f4-master/Source/Templates/%.c | $(BUILD)
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@

# Assemblage du startup
$(BUILD)/%.o: ../01-lib/gcc/%.s | $(BUILD)
	arm-none-eabi-as -mcpu=cortex-m4 -mthumb $< -o $@

# Converti ELF en BIN
$(BIN)/firmware.bin: $(BUILD)/main.elf | $(BIN)
	arm-none-eabi-objcopy -O binary $< $@

# Upload 
flash: $(BIN)/firmware.bin
	st-flash write $(BIN)/firmware.bin 0x8000000
	
# Nettoyage
clean:
	rm -rf $(BUILD) $(BIN)

size:
	arm-none-eabi-size $(BUILD)/main.elf