#
# Main makefile
#

CROSS		= powerpc-gekko-

export CC		:=	$(CROSS)gcc
export CXX		:=	$(CROSS)g++
export AR		:=	$(CROSS)ar
export OBJCOPY	:=	$(CROSS)objcopy
export AS		:=	$(CROSS)as
export LD		:=	$(CXX)
CFLAGS_LOCAL=
DOLTOOL=doltool
SOURCE=source
INCLUDE=include

# Configuration
CFLAGS =	-Wall $(CFLAGS_LOCAL) -I$(INCLUDE) \
			-mcpu=750 -meabi -mhard-float \
			-O2 -fno-exceptions -nostdinc \
			-Werror-implicit-function-declaration -Wimplicit-int

AFLAGS	=	-Iinclude
LDFLAGS =	-mcpu=750 -meabi -mhard-float -nostdlib

# Files
DVD_MODS = \
	dvd dvdread_orig dvdreset_orig dvdreadid_orig \
	dvdcallbackentry jumptable cache memcpy

ifeq ($(GEKKO_DEBUG),yes)
CFLAGS += -DGEKKO_DEBUG -Os
AFLAGS += -DGEKKO_DEBUG
GECKO_MODS = usb debugprintf snprintf strnlen stream
EXCEPTION_MODS = exception
endif
ifeq ($(MIOS_PLUGIN),yes)
CFLAGS += -DMIOS_PLUGIN
AFLAGS += -DMIOS_PLUGIN
TYPE=mios
else
TYPE=game
endif
ifeq ($(RELOAD_SUPPORT),yes)
CFLAGS += -DRELOAD_SUPPORT -Os
AFLAGS += -DRELOAD_SUPPORT
RELOAD_MODS = dvdreadpatch writebranch codecmp
endif
ifeq ($(REPLACE_DVD_CALLBACK),yes)
CFLAGS += -DREPLACE_DVD_CALLBACK -Os
AFLAGS += -DREPLACE_DVD_CALLBACK
endif
BUILD=build-$(TYPE)

OBJS = $(addsuffix .o,$(addprefix $(BUILD)/,$(DVD_MODS) $(GECKO_MODS) $(RELOAD_MODS) $(EXCEPTION_MODS)))

# Build rules
all:
	# MIOS Version can't be build if too much is compiled in.
ifneq ($(RELOAD_SUPPORT),yes)
	make MIOS_PLUGIN=yes miosplugin.bin
	install -m 644 miosplugin.bin ../gcbackuplauncher/data/
else
ifneq ($(GEKKO_DEBUG),yes)
	make MIOS_PLUGIN=yes miosplugin.bin
	install -m 644 miosplugin.bin ../gcbackuplauncher/data/
endif
endif
	make MIOS_PLUGIN=no gameplugin.bin
	install -m 644 gameplugin.bin ../gcbackuplauncher/data/

clean:
	rm -rf build-mios
	rm -rf build-game
	rm -f miosplugin.elf miosplugin.bin
	rm -f gameplugin.elf gameplugin.bin
	
realclean:
	find -name '*.o' | xargs -r rm
	find -name '*.a' | xargs -r rm
	find -name '*~' | xargs -r rm
	find -name '*.bin' | xargs -r rm
	find -name '*.dol' | xargs -r rm
	find -name '*.elf' | xargs -r rm
	find -name '*.map' | xargs -r rm
	find -name '*.tmp' | xargs -r rm


$(BUILD)/%.o: $(SOURCE)/%.c
	@mkdir -p $(BUILD)
	$(CC) $(CFLAGS)  -c -o $@ $^

$(BUILD)/%.o: $(SOURCE)/%.cpp
	@mkdir -p $(BUILD)
	$(CXX) $(CFLAGS) -c -o $@ $^

$(BUILD)/%.o: $(SOURCE)/%.s
	@mkdir -p $(BUILD)
	$(CC) $(AFLAGS) -c -o $@ $^

$(BUILD)/%.o: $(SOURCE)/%.S
	@mkdir -p $(BUILD)
	$(CC) $(AFLAGS) -c -o $@ $^

%.bin: %.elf
	$(OBJCOPY) -O binary $< $@

miosplugin.elf: $(OBJS)
	$(CC) $(LDFLAGS) -Wl,-n -o $@ -Wl,-Tlinker-mios.lds $(OBJS) -lm

gameplugin.elf: $(OBJS)
	$(CC) $(LDFLAGS) -Wl,-n -o $@ -Wl,-Tlinker-game.lds $(OBJS) -lm

