
# Sources du projet
MES_SOURCES = main.c \
       lib/HARDWARE_SETUP/hardware_setup.c \
	   lib/ORDONNANCEUR/ordonnanceur.c \
	   lib/TASK/task.c
	   
# Dépendances externes (01-lib)
DEPDIR = ../01-lib

DEPENDANCE = $(DEPDIR)/User/syscalls.c \
       $(DEPDIR)/User/sysmem.c \
       $(DEPDIR)/system_stm32f4xx.c

ASM_SRCS = $(DEPDIR)/gcc/startup_stm32f410rx.s


# Options compilateur
FAMILY_CPU = cortex-m4
CPU = STM32F410Rx

CC = arm-none-eabi-gcc
CFLAGS  = -mcpu=$(FAMILY_CPU) -mthumb -Wall -Wextra -MMD -MP -g3 -O0

CFLAGS += -fno-omit-frame-pointer
CFLAGS += -fno-inline
CFLAGS += -fno-optimize-sibling-calls
CFLAGS += -mabi=aapcs
CFLAGS += -mfloat-abi=soft

CPPFLAGS = -D$(CPU) \
          -I$(DEPDIR)/gcc \
          -I$(DEPDIR)/Core \
          -I$(DEPDIR)/User \
          -I$(DEPDIR)

LDFLAGS = -T generatedLinkerIDE.ld
LDLIBS  = -lc -lm -lnosys

# Répertoires de build
BUILD = build
BIN   = bin

# Objets

# Objets des sources principales
LOCAL_OBJS = $(patsubst %.c,$(BUILD)/%.o,$(MES_SOURCES))

# Objets des dépendances externalisées dans build/01-lib/
DEP_OBJS = $(patsubst $(DEPDIR)/%.c,$(BUILD)/01-lib/%.o,$(DEPENDANCE))
ASM_OBJS = $(patsubst $(DEPDIR)/%.s,$(BUILD)/01-lib/%.o,$(ASM_SRCS))

# Tous les objets nécessaires
OBJS = $(LOCAL_OBJS) $(DEP_OBJS) $(ASM_OBJS)

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

# Cibles principales
all: $(BUILD)/main.elf $(BIN)/firmware.bin

# Compilation sources locales
$(BUILD)/%.o: %.c
	mkdir -p $(dir $@)
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@

# Compilation des dépendances 01-lib (C)
$(BUILD)/01-lib/%.o: $(DEPDIR)/%.c
	mkdir -p $(dir $@)
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@

# Compilation des dépendances 01-lib (ASM)
$(BUILD)/01-lib/%.o: $(DEPDIR)/%.s
	mkdir -p $(dir $@)
	arm-none-eabi-as -mcpu=$(FAMILY_CPU) -mthumb $< -o $@

# Link final
$(BUILD)/main.elf: $(OBJS)
	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDLIBS) -o $@

# Génération binaire
$(BIN)/firmware.bin: $(BUILD)/main.elf
	mkdir -p $(BIN)
	arm-none-eabi-objcopy -O binary $< $@

# Flash STM32
flash: all
	st-flash write $(BIN)/firmware.bin 0x8000000

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

# Nettoyage
clean:
	rm -rf $(BUILD) $(BIN)

# Inclusion des dépendances automatiques
-include $(DEPS)
