# ==============================
# Target : Samsung S3C2416 / ARM926EJ-S
# Toolchain : arm-none-eabi-gcc
# ==============================

CROSS   := arm-none-eabi-
CC      := $(CROSS)gcc
CXX     := $(CROSS)g++
AS      := $(CROSS)gcc
LD      := $(CROSS)g++
AR      := $(CROSS)ar
OBJCOPY := $(CROSS)objcopy
SIZE    := $(CROSS)size
G1SDK := ../g1sdk/

# -----------------------------------------------------------------------------
BUILD_DIR := obj

# -----------------------------------------------------------------------------
# CPU — ARM926EJ-S = ARMv5TEJ, little-endian, pas de Thumb-2
# -----------------------------------------------------------------------------
# CPU_FLAGS := -mcpu=arm926ej-s -march=armv5tej -mthumb -mlittle-endian -mfloat-abi=soft -mthumb-interwork # -marm
CPU_FLAGS := -mcpu=arm926ej-s -marm -mlittle-endian -mfloat-abi=soft -mthumb-interwork -mno-unaligned-access # -march=armv5t 

# Optim=4 dans Keil = -O2 (level 4 Keil ≈ O2 GCC, pas O3)
OPT_FLAGS := -Os -fno-builtin-sprintf -fno-delete-null-pointer-checks

# -----------------------------------------------------------------------------
# Defines (depuis <Define> du .uvprojx)
# NOTE: sprintf=__sprintf suppressed — armcc specific, 
# ?LDFLAGS += -Wl,--defsym,sprintf=__sprintf
# -----------------------------------------------------------------------------
DEFINES := -DHPG1 -DMUTEKI_HAS_PRIME_UI_EVENT 

# -----------------------------------------------------------------------------
# Include paths
# -----------------------------------------------------------------------------
INCLUDES := -I$(G1SDK)/include -I.

# -----------------------------------------------------------------------------
# Flags communs C et C++
# -----------------------------------------------------------------------------
COMMON_FLAGS := $(CPU_FLAGS) $(OPT_FLAGS) $(DEFINES) $(INCLUDES) \
    -ffunction-sections -fdata-sections -fshort-wchar -fno-short-enums -Wall -Wno-narrowing -fno-tree-loop-distribute-patterns -fno-isolate-erroneous-paths-dereference -fomit-frame-pointer -pipe

CFLAGS   := -include $(G1SDK)/include/besta_fixes.h $(COMMON_FLAGS) -std=gnu99
CXXFLAGS := -include $(G1SDK)/include/besta_fixes.h $(COMMON_FLAGS) -std=gnu++11 -fno-exceptions -fpermissive # -fno-rtti

# Assembleur
ASFLAGS  := $(CPU_FLAGS) -x assembler-with-cpp

# -----------------------------------------------------------------------------
# Linker
#   IRAM : 0x40000000, taille 0x10000   (64 Ko — SRAM interne)
#   SDRAM: 0x30000000 (depuis OCR_RVCT9, taille 0x1000000 = 16 Mo)
#
# code at 0x30600000 
# entry point AppMain 
#
# -----------------------------------------------------------------------------

LDFLAGS := -L. \
    -T $(G1SDK)/lib/g1app.ld \
    -Wl,--gc-sections \
    -Wl,-Map=$(BUILD_DIR)/armfir.map \
    -Wl,--entry=AppMain \
    -nostartfiles \
    -Wl,--no-wchar-size-warning -Wl,--no-enum-size-warning -Wl,--allow-multiple-definition -Wl,-n 

 LDLIBS := --specs=nano.specs -Lsrc/lib -lgiac -lmpfi -lmpfr -lgmp  -lmicropy -L$(G1SDK)/lib/  -lsyscalls -lgcc
#LDLIBS := --specs=nano.specs -Lsrc/lib -lgiac -lmpfi -lmpfr -lgmp  -L$(G1SDK)/lib/  -lsyscalls -lgcc

TARGET := $(BUILD_DIR)/armfir.elf

# 
SRC_CXX := event.cpp

# ======================================
ALL_CXX_SRCS := \
	$(SRC_CXX) \
	$(G1SDK)/src/besta_fixes.cc

SRC_C := k_csdk.c 

# .o Paths
# (avoid collisions)
CXX_OBJS := $(addprefix $(BUILD_DIR)/,$(addsuffix .o,$(basename $(ALL_CXX_SRCS))))
C_OBJS   := $(addprefix $(BUILD_DIR)/,$(addsuffix .o,$(basename $(SRC_C))))
ALL_OBJS := $(CXX_OBJS) $(C_OBJS)

# Rule
.PHONY: all clean size

all: $(TARGET)

$(TARGET): $(ALL_OBJS) src/lib/libgiac.a
	@mkdir -p $(dir $@)
	$(LD) $(LDFLAGS) -o $@ $^ $(LDLIBS)
	$(SIZE) $@
	arm-none-eabi-nm -n obj/armfir.elf > symbols.txt
	arm-none-eabi-objcopy -j ER_RO -j ER_RW -j ER_ZI obj/armfir.elf clean_armfir.elf
	arm-none-eabi-strip -s clean_armfir.elf -o armfir_final.elf
	arm-none-eabi-readelf -S armfir_final.elf
	arm-none-eabi-readelf -h armfir_final.elf | grep "Entry point"
	./g1app.sh
# echo "run ./g1.sh to update then in WSL g1.sh then hp connkit"
# desassemblage du debut du binaire
# arm-none-eabi-objdump -d armfir.elf | head -n 50
# arm-none-eabi-objdump -D -b binary -m arm -M force-thumb --adjust-vma=0x30600000 armfir_armcc.bin | head -n 100
# il manque peut-etre un code de mise à 0 de la BSS, de copie de data? ou pas
# arm-none-eabi-readelf -h obj/armfir.elf
# arm-none-eabi-readelf -S obj/armfir.elf 

# C++
$(BUILD_DIR)/%.o: %.cpp
	@mkdir -p $(dir $@)
	$(CXX) $(CXXFLAGS) -c $< -o $@

$(BUILD_DIR)/%.o: %.cc
	@mkdir -p $(dir $@)
	$(CXX) $(CXXFLAGS) -c $< -o $@

# C
$(BUILD_DIR)/%.o: %.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) -c $< -o $@

# dep
$(BUILD_DIR)/%.d: %.cpp
	@mkdir -p $(dir $@)
	$(CXX) $(CXXFLAGS) -MM -MT $(BUILD_DIR)/$*.o $< > $@

$(BUILD_DIR)/%.d: %.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) -MM -MT $(BUILD_DIR)/$*.o $< > $@

-include $(ALL_OBJS:.o=.d)

size: $(TARGET)
	$(SIZE) --format=berkeley $<

clean:
	rm -rf $(BUILD_DIR) armfir_final.elf clean_armfir.elf app.elf


