# Projekt neve és a fő forrásfájl
TARGET = blinky
SRCS = main.cpp

# Útvonalak a közös munkaterülethez 
WORKSPACE_DIR = ../..
CMSIS_DIR   = $(WORKSPACE_DIR)/cmsis
TARGET_DIR  = $(WORKSPACE_DIR)/targets/TARGET_LPC11XX

# Add hozzá a közös hardverspecifikus forrásfájlokat
SRCS += $(TARGET_DIR)/system_LPC11xx.c
SRCS += $(TARGET_DIR)/startup_LPC11xx.S

# Kimeneti mappa a helyi projekt könyvtárában
BUILD_DIR = build

# Include útvonalak, hogy a fordító megtalálja a fejlécfájlokat (.h)
INCLUDES = -I. -I$(CMSIS_DIR) -I$(TARGET_DIR)

# Toolchain beállítások - C++ FORDÍTÓVAL (G++) FELVÉRTEZVE
CC      = arm-none-eabi-gcc
CXX     = arm-none-eabi-g++
OBJCOPY = arm-none-eabi-objcopy
SIZE    = arm-none-eabi-size

# Hardver specifikus kapcsolók (LPC1114 -> Cortex-M0)
CPU = -mcpu=cortex-m0 -mthumb

# C fordítási kapcsolók (system_LPC11xx.c-hez)
CFLAGS = $(CPU) -c -g -O3 -Wall -ffunction-sections -fdata-sections $(INCLUDES)

# C++ fordítási kapcsolók a main.cpp-hez (Létfontosságú bare-metal megszorításokkal!)
CXXFLAGS = $(CPU) -c -g -O3 -Wall -std=c++11 -ffunction-sections -fdata-sections \
           -fno-exceptions -fno-rtti -fno-threadsafe-statics $(INCLUDES)

# Assembly fordítási kapcsolók
ASFLAGS = $(CPU) -c -g

# Linker kapcsolók - Figyelj, itt is a CXX (g++) fog linkelni!
LDSCRIPT = $(TARGET_DIR)/LPC1114.ld
LDFLAGS = $(CPU) -nostartfiles -Wl,--gc-sections -T$(LDSCRIPT) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map --specs=nosys.specs

# Objektum fájlok generálása (Mindent a helyi build/ mappába gyűjt)
OBJS = $(addprefix $(BUILD_DIR)/, $(addsuffix .o, $(basename $(notdir $(SRCS)))))

# -----------------------------------------------------------------------------
# FORDÍTÁSI SZABÁLYOK (TARGETS)
# -----------------------------------------------------------------------------

all: $(BUILD_DIR) $(BUILD_DIR)/$(TARGET).bin $(BUILD_DIR)/$(TARGET).hex

# Helyi build mappa létrehozása Windows-barát módon
$(BUILD_DIR):
	@if not exist $(BUILD_DIR) mkdir $(BUILD_DIR)

# A helyi .cpp fájlok (main.cpp) fordítása C++ fordítóval
$(BUILD_DIR)/%.o: %.cpp
	$(CXX) $(CXXFLAGS) $< -o $@

# Szabály a távoli targets/.c fájlokhoz (system_LPC11xx.c továbbra is tiszta C)
$(BUILD_DIR)/%.o: $(TARGET_DIR)/%.c
	$(CC) $(CFLAGS) $< -o $@

# Szabály a távoli targets/.S assembly fájlhoz (startup_LPC11xx.S)
$(BUILD_DIR)/%.o: $(TARGET_DIR)/%.S
	$(CC) $(ASFLAGS) $< -o $@

# ELF fájl linkelése az objektumokból - CXX (g++) végzi, hogy a C++ könyvtárak a helyükön legyenek!
$(BUILD_DIR)/$(TARGET).elf: $(OBJS)
	$(CXX) $(LDFLAGS) $(OBJS) -o $@
	$(SIZE) $@

# BIN fájl konvertálása az ELF-ből
$(BUILD_DIR)/$(TARGET).bin: $(BUILD_DIR)/$(TARGET).elf
	$(OBJCOPY) -O binary $< $@

# HEX fájl konvertálása az ELF-ből
$(BUILD_DIR)/$(TARGET).hex: $(BUILD_DIR)/$(TARGET).elf
	$(OBJCOPY) -O ihex $< $@

# Tiszta lap: a teljes helyi build mappa gyalulása
clean:
	@if exist $(BUILD_DIR) rmdir /s /q $(BUILD_DIR)

.PHONY: all clean