# BUILD SETTINGS ###################################

# Valid values: WINDOWS, UNIX, GP2X, DINGOO, GP32
PLATFORM := GP32

# If building for the GP2X
GP2X_CHAINPREFIX := /opt/open2x/gcc-4.1.1-glibc-2.3.6
GP2X_CHAIN := $(GP2X_CHAINPREFIX)/bin/arm-open2x-linux-

# If building for the DINGOO
DINGOO_LIB := /home/anthony/mipsel-dingux/lib
DINGOO_USR := /home/anthony/mipsel-dingux/usr
DINGOO_TOOLPREFIX := $(DINGOO_USR)/bin/mipsel-linux-uclibc-
#
# If building for the GP32
GP32_SDL := ../SDL++
GP32_INC := $(GP32_SDL)/include/SDL
GP32_LIB := $(GP32_SDL)/lib
GP32DEVKIT := $(HOME)/devkitARM
GP32_TOOLPREFIX := $(GP32DEVKIT)/bin/arm-eabi-
# END SETTINGS #####################################

TARGET := tyrian
OBJS := animlib.o backgrnd.o config.o destruct.o editship.o episodes.o error.o file.o fm_synth.o fmopl.o fonthand.o game_menu.o helptext.o joystick.o jukebox.o keyboard.o lds_play.o loudness.o lvllib.o lvlmast.o mainint.o menus.o mtrand.o musmast.o newshape.o nortsong.o nortvars.o opentyr.o palette.o params.o pcxload.o pcxmast.o picload.o scroller.o setup.o sndmast.o starlib.o tyrian2.o varz.o vga256d.o video.o video_scale.o xmas.o gpprintf.o memset.o memcpy.o gp32.o
ifdef ($(ENABLE_NETWORK))
OBJS += network.o
else
OBJS += network_stub.o
endif

STRIP := strip

#CFLAGS = --std=c99 -Wall -Wstrict-prototypes -Wmissing-declarations -Wno-unused -I$(CURDIR)/src/
CFLAGS = -Wall -Wmissing-declarations -Wno-unused -I$(CURDIR)/src/
LDFLAGS += -s

ifeq ($(PLATFORM), UNIX)
	CFLAGS += -DTARGET_UNIX
	
	SDL_CFLAGS := $(shell sdl-config --cflags)
	SDL_LDFLAGS := $(shell sdl-config --libs) -lSDL_net
endif
ifeq ($(PLATFORM), WINDOWS)
	SDL_CFLAGS := -I/mingw/include/SDL -D_GNU_SOURCE=1 -Dmain=SDL_main
	SDL_LDFLAGS := -L/mingw/lib -lmingw32 -lSDLmain -lSDL -lSDL_net -mwindows
endif
ifeq ($(PLATFORM), GP2X)
	CC := $(GP2X_CHAIN)gcc
	STRIP := $(GP2X_CHAIN)strip
	
	CFLAGS += -DTARGET_GP2X -mcpu=arm920t -mtune=arm920t -msoft-float -ffast-math
	
	SDL_CFLAGS := `$(GP2X_CHAINPREFIX)/bin/sdl-config --cflags` -I$(GP2X_CHAINPREFIX)/include
	SDL_LDFLAGS := `$(GP2X_CHAINPREFIX)/bin/sdl-config --libs` -L$(GP2X_CHAINPREFIX)/lib
endif
ifeq ($(PLATFORM), DINGOO)
	CC := $(DINGOO_TOOLPREFIX)gcc
	STRIP := $(DINGOO_TOOLPREFIX)strip
	
	CFLAGS += -DTARGET_DINGOO -mips32 -mtune=mips32 -O3 -msoft-float -ffast-math -pipe -G0
	
	SDL_CFLAGS := `$(DINGOO_USR)/bin/sdl-config --prefix=$(DINGOO_USR) --cflags` -I$(DINGOO_USR)/include
	SDL_LDFLAGS := -L$(DINGOO_USR)/lib -Wl,-rpath-link,$(DINGOO_USR)/lib -Wl,-rpath-link,$(DINGOO_LIB) -Wl,-rpath,/lib -Wl,-rpath,/usr/lib -lSDL -lpthread -ldl -lm
endif
ifeq ($(PLATFORM), GP32)
	CC := $(GP32_TOOLPREFIX)g++
	OBJCP = $(GP32DEVKIT)/bin/arm-eabi-objcopy
	B2FXE = $(GP32DEVKIT)/bin/b2fxec
	
	CFLAGS += -DTARGET_GP32 -D__arm__ -DINLINE="static __inline__" -mcpu=arm920t -mtune=arm920t -mno-thumb-interwork -mstructure-size-boundary=32 -fomit-frame-pointer -falign-functions -falign-loops -falign-labels -falign-jumps -ffast-math -freciprocal-math -fsingle-precision-constant -finline -finline-functions -fexpensive-optimizations -fomit-frame-pointer -funsafe-math-optimizations -fno-exceptions -fno-common -fpeel-loops -fweb -frename-registers -ftree-vectorize -fmerge-all-constants -Wall -Wno-sign-compare -Wunused -Wpointer-arith -Waggregate-return
	
	SDL_CFLAGS := -I$(GP32_INC)
	SDL_LDFLAGS := -L$(GP32_LIB) -lSDL -lm -lc
endif

CFLAGS += $(SDL_CFLAGS)
LDFLAGS += $(SDL_LDFLAGS) 

DEBUG := 0

DEBUG_FLAGS_0 := -O3 -DNDEBUG -fno-strict-aliasing
DEBUG_FLAGS_1 := -g3 -O0 -Werror


ifneq ($(PLATFORM), GP32)
SVN_REV := $(shell svnversion src -n)
ifneq ($(SVN_REV), )
	ifeq ($(SVN_REV), exported)
		SVN_REV := unknown
	endif
	
	CFLAGS += -DSVN_REV=\"$(SVN_REV)\"
endif
endif

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

all : $(TARGET).fxe

OBJS := $(foreach obj, $(OBJS), obj/$(obj))

STARTOBJS = obj/crt0.o

$(TARGET).fxe: $(TARGET).bin
	$(B2FXE) -t "OpenTyrian GP32 v1.0" -b "$(TARGET).bmp" -a "Slaanesh" -f $(TARGET).bin $(TARGET).fxe

$(TARGET).bin: $(TARGET).elf
	$(OBJCP) -O binary $(TARGET).elf $(TARGET).bin

$(TARGET).elf : $(STARTOBJS)$(OBJS)
	$(CC) -o $@ -nostartfiles -specs=gp32.specs  -s -static $(CFLAGS) $^ $(LDFLAGS)

ifneq ($(MAKECMDGOALS), clean)
-include $(OBJS:.o=.d)
endif

obj/%.o : src/%.c
	$(CC) -o $@ -MMD -c $(DEBUG_FLAGS_$(DEBUG)) $(CFLAGS) $<

obj/%.o : src/%.S
	$(CC) -o $@ -c $(DEBUG_FLAGS_$(DEBUG)) $(CFLAGS) $<


obj/crt0.o:	$(GP32_SDL)/crt0x_gp32.s
	$(CC) -c -o obj/crt0.o $(GP32_SDL)/crt0x_gp32.s

.PHONY : release clean

release : DEBUG := 0
release : all
	$(STRIP) $(TARGET)

clean :
	rm -f obj/*.o obj/*.d
	rm -f $(TARGET).elf
	rm -f $(TARGET).bin
	rm -f $(TARGET).fxe
