###############################
#  Agb 1.06                   #
###############################

.SUFFIXES:

###############################

export TOPDIR	:=	$(CURDIR)/..
export PATH		:=	$(CURDIR):/d/devkitARM/bin:$(PATH)

###############################

TARGET		:=	sasAGB
LIBS		:=	

SOURCES		:=	source
SOURCES		+=	source/dat/vid
SOURCES		+=	source/dat/snd/midi
SOURCES		+=	source/dat/snd/samp
SOURCES		+=	source/dat/snd/tone
SOURCES		+=	source/sys/agb
SOURCES		+=	source/sys/mem
SOURCES		+=	source/sys/snd
SOURCES		+=	source/sys/vid

INCLUDES	:=	include
INCLUDES	+=	include/Agb

BUILD		:=	build

###############################

MODEL		:=	-g -mthumb -mthumb-interwork
TUNING		:=	-mcpu=arm7tdmi
CFLAGS		:=	-O2
CFLAGS		+=	-Wall -Wextra
CFLAGS		+=	-fwrapv -fivopts -ftracer -ffast-math -ftree-loop-linear
CFLAGS		+=	-fomit-frame-pointer -fno-branch-count-reg
CFLAGS		+=	$(INCLUDE) $(TUNING) $(MODEL)
CXXFLAGS	:=	$(CFLAGS) -fno-rtti -fno-exceptions
ASFLAGS		:=	$(MODEL) $(TUNING) $(INCLUDE)
LDFLAGS		:=	$(MODEL) $(TUNING) -nostartfiles -T$(TOPDIR)/lnkscript

###############################

PREFIX			:=	arm-eabi
export CC		:=	$(PREFIX)-gcc
export CXX		:=	$(PREFIX)-g++
export AS		:=	$(PREFIX)-as
export OBJCOPY	:=	$(PREFIX)-objcopy

###############################

%.arm.o : %.arm.cpp
	@echo $(notdir $<)
	$(CXX) -MMD -MP -MF $(DEPSDIR)/$*.d $(CXXFLAGS) -marm -c $< -o $@

###############################

%.arm.o : %.arm.c
	@echo $(notdir $<)
	$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d $(CFLAGS) -marm -c $< -o $@

###############################

%.thumb.o : %.thumb.cpp
	@echo $(notdir $<)
	$(CXX) -MMD -MP -MF $(DEPSDIR)/$*.d $(CXXFLAGS) -mthumb -c $< -o $@

###############################

%.thumb.o : %.thumb.c
	@echo $(notdir $<)
	$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d $(CFLAGS) -mthumb -c $< -o $@

###############################

%.iwram.o : %.iwram.cpp
	@echo $(notdir $<)
	$(CXX) -MMD -MP -MF $(DEPSDIR)/$*.d $(CXXFLAGS) -marm -mlong-calls -c $< -o $@

###############################

%.iwram.o : %.iwram.c
	@echo $(notdir $<)
	$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d $(CFLAGS) -marm -mlong-calls -c $< -o $@

###############################

%.o : %.c
	@echo $(notdir $<)
	$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d $(CFLAGS) -c $< -o $@

###############################

%.o : %.cpp
	@echo $(notdir $<)
	$(CXX) -MMD -MP -MF $(DEPSDIR)/$*.d $(CXXFLAGS) -c $< -o $@

###############################

%.o : %.s
	@echo $(notdir $<)
	$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d -x assembler-with-cpp $(ASFLAGS) $(INCLUDEA) -c $< -o $@

###############################

%.o : %.S
	@echo $(notdir $<)
	$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d -x assembler-with-cpp $(ASFLAGS) $(INCLUDEA) -c $< -o $@

###############################

%.elf:
	@echo Linking . . .
	@$(LD) $(LDFLAGS) $(OFILES) $(LIBS) -o $@

###############################

%.gba : %.elf
	@$(OBJCOPY) -O binary $< $@
	@nm -S -n $< > Map.ini
	@echo Built!

###############################
ifneq ($(BUILD),$(notdir $(CURDIR)))
###############################

export DEPSDIR	:=	$(CURDIR)/$(BUILD)
export OUTPUT	:=	$(CURDIR)/$(TARGET)
export VPATH	:=	$(foreach dir,$(SOURCES),$(CURDIR)/$(dir))

export CFILES	:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
export CPPFILES	:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
export SFILES	:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))

export OFILES	:= $(CFILES:.c=.o)
export OFILES	+= $(SFILES:.s=.o)
export OFILES	+= $(CPPFILES:.cpp=.o)

export INCLUDE	:=	$(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir))
export INCLUDEA	:=	$(foreach dir,$(INCLUDES),-Wa,-I$(CURDIR)/$(dir))

ifeq ($(strip $(CPPFILES)),)
	export LD	:=	$(CC)
else
	export LD	:=	$(CXX)
endif

###############################

.PHONY : $(BUILD) clean

###############################

$(BUILD):
	@[ -d $@ ] || mkdir -p $@
	@make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile

###############################

all : $(BUILD)

###############################

clean:
	@echo Cleaning . . .
	@rm -fr $(BUILD) $(TARGET).gba $(TARGET).elf

###############################
else
###############################

DEPENDS			:=	$(OFILES:.o=.d)

###############################

$(OUTPUT).gba	:	$(OUTPUT).elf
$(OUTPUT).elf	:	$(OFILES)

###############################

-include $(DEPENDS)

###############################
endif
###############################
