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

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

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

# 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) -I$(CPP_RUNTIME)

# 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
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
LDSCRIPT = $(TARGET_DIR)/LPC1114.ld
LDFLAGS = -mcpu=cortex-m0 -mthumb -nostartfiles -Wl,--gc-sections \
          -T$(LDSCRIPT) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map \
          --specs=nosys.specs -fno-exceptions -fno-rtti

# 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)

# 1. FIX, EXPLICIT SZABÁLYOK A TÁVOLI FÁJLOKHOZ (Nincs mintakeveredés!)
$(BUILD_DIR)/cpp_runtime.o: $(CPP_RUNTIME)/cpp_runtime.cpp
	$(CXX) $(CXXFLAGS) $< -o $@

$(BUILD_DIR)/system_LPC11xx.o: $(TARGET_DIR)/system_LPC11xx.c
	$(CC) $(CFLAGS) $< -o $@

$(BUILD_DIR)/startup_LPC11xx.o: $(TARGET_DIR)/startup_LPC11xx.S
	$(CC) $(ASFLAGS) $< -o $@

# 2. GENERIKUS SZABÁLY A HELYI FÁJLOKHOZ (main.cpp)
$(BUILD_DIR)/%.o: %.cpp
	$(CXX) $(CXXFLAGS) $< -o $@


# ELF fájl linkelése
$(BUILD_DIR)/$(TARGET).elf: $(OBJS)
	$(CXX) $(LDFLAGS) $(OBJS) -o $@
	$(SIZE) $@

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

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

clean:
	@if exist $(BUILD_DIR) rmdir /s /q $(BUILD_DIR)

.PHONY: all clean