ROOT_DIR			:= .
DEPS_DIR			:= $(ROOT_DIR)/deps
DEBUG			 	= 0
HAVE_LOGGER			= 0
HAVE_FILE_LOGGER		= 0
HAVE_CC_RESAMPLER		= 1
WHOLE_ARCHIVE_LINK		= 0
BIG_STACK   			= 1
PC_DEVELOPMENT_IP_ADDRESS	= 255.255.255.255
PC_DEVELOPMENT_UDP_PORT		= 3490
RARCH_CONSOLE			= 0
USBGECKO			= 0

ifneq ($(EMSCRIPTEN),)
   platform = emscripten
endif

ifeq ($(platform),)
platform = unix
ifeq ($(shell uname -a),)
   platform = win
else ifneq ($(findstring MINGW,$(shell uname -a)),)
   platform = win
else ifneq ($(findstring Darwin,$(shell uname -a)),)
   platform = osx
else ifneq ($(findstring win,$(shell uname -a)),)
   platform = win
endif
endif

# system platform
system_platform = unix
ifeq ($(shell uname -a),)
EXE_EXT = .exe
   system_platform = win
else ifneq ($(findstring Darwin,$(shell uname -a)),)
   system_platform = osx
else ifneq ($(findstring MINGW,$(shell uname -a)),)
   system_platform = win
endif

TARGET_NAME        := retroarch

INCLUDE            :=
LDFLAGS            :=
LIBDIRS            :=

SHADER_CG_DIR      := media/shaders_cg
OVERLAY_DIR        := media/overlays
SHADER_GLSL_DIR    := media/shaders_glsl

PYTHON2		       := python2$(EXE_EXT)
PYTHON3		       := python3$(EXE_EXT)
GIT			       := git$(EXE_EXT)

ifeq ($(WHOLE_ARCHIVE_LINK), 1)
   WHOLE_START     := -Wl,--whole-archive
   WHOLE_END       := -Wl,--no-whole-archive
endif

LIBS               := $(WHOLE_START) -lretro_$(platform) $(WHOLE_END)

libogc_platform    :=

ifeq ($(platform), ngc)
libogc_platform    := 1
else ifeq ($(platform), wii)
libogc_platform    := 1
endif

# PS3
ifeq ($(platform), ps3)
	#TODO
  MEDIA_SHADER_DIR := pkg/ps3/USRDIR/cores/shaders
  RARCH_CONSOLE          = 1

# PS3 - Cobra
else ifeq ($(platform), ps3-cobra)
	#TODO
  MEDIA_SHADER_DIR := ps3/iso/PS3_GAME/USRDIR/cores/shaders
  RARCH_CONSOLE          = 1

# NGC/Wii - libogc
else ifeq ($(libogc_platform), 1)
  CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
  CXX = $(DEVKITPPC)/bin/powerpc-eabi-g++$(EXE_EXT)
  LD = $(DEVKITPPC)/bin/powerpc-eabi-ld$(EXE_EXT)
  ELF2DOL = $(DEVKITPPC)/bin/elf2dol$(EXE_EXT)
  EXT_TARGET := $(TARGET_NAME)_$(platform).dol
  EXT_INTER_TARGET := $(TARGET_NAME)_$(platform).elf

  INCLUDE += -I. -I$(DEVKITPRO)/libogc/include -Ideps/libz

ifeq ($(platform), ngc)
  LIBDIRS += -L$(DEVKITPRO)/libogc/lib/cube
  MACHDEP := -DHW_DOL -mogc
else ifeq ($(platform), wii)
  LIBDIRS += -L$(DEVKITPRO)/libogc/lib/wii
  MACHDEP := -DHW_RVL -mrvl
endif
  LIBDIRS += -L.
  MACHDEP += -DGEKKO -mcpu=750 -meabi -mhard-float -DMSB_FIRST

ifeq ($(platform), ngc)
	LDFLAGS += $(MACHDEP) -Wl,-Map,$(notdir $(EXT_INTER_TARGET)).map
ifeq ($(BIG_STACK), 1)
   LDFLAGS += -T bootstrap/gx/ogc.ld
endif
else ifeq ($(platform), wii)
	LDFLAGS += $(MACHDEP) -Wl,-Map,$(notdir $(EXT_INTER_TARGET)).map,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,strdup,-wrap,strndup,-wrap,malloc_usable_size
ifeq ($(BIG_STACK), 1)
  LDFLAGS += -T bootstrap/gx/rvl.ld
endif
endif
  LIBS += -lfat -logc

ifeq ($(platform), wii)
  LIBS += -lwiiuse -lbte
ifeq ($(USBGECKO), 1)
  LIBS += -ldb
endif
else ifeq ($(platform), ngc)
ifeq ($(HAVE_LOGGER), 1)
  LIBS += -lbba
endif
endif

  CFLAGS += -DGEKKO -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int

  HAVE_FILTERS_BUILTIN     := 1
  HAVE_THREADS             := 1
  HAVE_RPNG						:= 1
  HAVE_RJPEG					:= 1
  HAVE_RBMP					   := 1
  HAVE_RTGA					   := 1
  HAVE_OVERLAY             := 1
  HAVE_ZLIB                := 1
  WANT_ZLIB						:= 1
  HAVE_7ZIP                := 1
  RARCH_CONSOLE          = 1

ifeq ($(platform), wii)
  HAVE_LANGEXTRA				:= 1
  HAVE_WIIUSB_HID          := 1
  HAVE_RARCH_EXEC          := 1
  HAVE_RSOUND              := 1

  APP_BOOTER_DIR = wii/app_booter
  PLATOBJS := $(APP_BOOTER_DIR)/app_booter.binobj
ifeq ($(USBGECKO), 1)
  CFLAGS += -DUSBGECKO
endif
endif

# Libxenon (Xbox 360)
else ifeq ($(platform), xenon360)
	CC = xenon-gcc$(EXE_EXT)
	CXX = xenon-g++$(EXE_EXT)
	OBJCOPY = xenon-objcopy$(EXE_EXT)
	LD    = xenon-ld$(EXE_EXT)
	STRIP = xenon-strip$(EXE_EXT)
	INCLUDE += -I$(DEVKITXENON)/usr/include

	EXT_TARGET := $(TARGET_NAME)_$(platform).elf32
	EXT_INTER_TARGET := $(TARGET_NAME)_$(platform).elf

	LIBS                    += -lxenon -lm -lc

  LIBDIRS                  += -L. -L$(DEVKITXENON)/usr/lib -L$(DEVKITXENON)/xenon/lib/32
  LDFLAGS                  +=  -Wl,-q -m32 -n -T$(DEVKITXENON)/app.lds
  PLATCFLAGS               := -DHAVE_GETOPT_LONG=1
  PLATCFLAGS               += -maltivec -mhard-float -m32 -mpowerpc64 -mcpu=cell -mtune=cell -fno-pic -g -Wall -DXENON $(INCDIRS) -Wno-char-subscripts
  PLATCFLAGS               += -u read -u _start -u exc_base
  HAVE_THREADS             := 1
  HAVE_GETOPT_LONG         := 1
  RARCH_CONSOLE          = 1

# PSP
else ifeq ($(platform), psp1)
  CC = psp-gcc$(EXE_EXT)
  CXX = psp-g++$(EXE_EXT)
  LD = psp-ld$(EXE_EXT)
  INCLUDE += -I$(PSPSDK)/psp/sdk/include
  EXT_TARGET := $(TARGET_NAME)_$(platform).elf
  EXT_INTER_TARGET := $(TARGET_NAME)_$(platform).elf
  PLATCFLAGS := -DPSP -D_PSP_FW_VERSION=150 -G0 \
	  -D_MIPS_ARCH_ALLEGREX
  LIBS +=  -lpspgu -lpspgum -lm -lpspaudio -lpspfpu -lpsppower -lpsprtc -lpspkernel

  LIBDIRS += -L.
  LDFLAGS +=  -Wl,-q

  BUILD_PRX                 = 1
  HAVE_RPNG                := 1
  HAVE_RJPEG					:= 1
  HAVE_RBMP					   := 1
  HAVE_RTGA					   := 1
  HAVE_KERNEL_PRX          := 1
  HAVE_LANGEXTRA				:= 1
  RARCH_CONSOLE          = 1

ifeq ($(BUILD_PRX), 1)
	LDFLAGS += $(addprefix -L,$(PSPSDK)/lib) -specs=$(PSPSDK)/lib/prxspecs -Wl,-q,-T$(PSPSDK)/lib/linkfile.prx $(LDFLAGS)
endif

# Vita
else ifeq ($(platform), vita)
  CC = arm-vita-eabi-gcc$(EXE_EXT)
  CXX = arm-vita-eabi-g++$(EXE_EXT)
  LD = arm-vita-eabi-ld$(EXE_EXT)
  EXT_TARGET := $(TARGET_NAME)_$(platform).velf
  EXT_INTER_TARGET := $(TARGET_NAME)_$(platform).elf
  MACHDEP := -DVITA
  WANT_ZLIB						:= 1
  INCLUDE += -Ideps/libvita2d/include
  INCLUDE += -Ideps/libz
  PLATCFLAGS := -mfloat-abi=hard -fsingle-precision-constant \
       -mword-relocations -fno-unwind-tables -fno-asynchronous-unwind-tables -ftree-vectorize -fno-optimize-sibling-calls
  LIBS += -lSceDisplay_stub -lSceGxm_stub -lSceNet_stub -lSceNetCtl_stub\
			 -lSceSysmodule_stub -lSceCtrl_stub -lSceTouch_stub -lSceAudio_stub -lSceFiber_stub\
			 -lScePower_stub -lSceRtc_stub -lSceCommonDialog_stub -lScePgf_stub \
			 -lSceMotion_stub -lSceAppMgr_stub -lpng -lm -lc

  PLATOBJS += $(DEPS_DIR)/libvita2d/shader/clear_v_gxp.o \
		 $(DEPS_DIR)/libvita2d/shader/clear_f_gxp.o \
		 $(DEPS_DIR)/libvita2d/shader/color_v_gxp.o \
		 $(DEPS_DIR)/libvita2d/shader/color_f_gxp.o \
		 $(DEPS_DIR)/libvita2d/shader/texture_v_gxp.o \
		 $(DEPS_DIR)/libvita2d/shader/texture_f_gxp.o \
		 $(DEPS_DIR)/libvita2d/shader/texture_tint_f_gxp.o

  PLATOBJS += \
		libretro-common/audio/conversion/s16_to_float_neon.o \
		libretro-common/audio/conversion/float_to_s16_neon.o \
		memory/neon/memcpy-neon.o \
		libretro-common/audio/resampler/drivers/sinc_resampler_neon.o \
		audio/drivers_resampler/cc_resampler_neon.o

  LIBDIRS += -L.
  LDFLAGS +=  -Wl,-q

  HAVE_FILTERS_BUILTIN     := 1
  HAVE_LANGEXTRA				:= 1
  HAVE_RPNG                := 1
  HAVE_RJPEG					:= 1
  HAVE_RBMP					   := 1
  HAVE_RTGA					   := 1
  HAVE_ZLIB                := 1
  HAVE_7ZIP                := 1
  HAVE_VITA2D              := 1
  HAVE_NETWORKING          := 1
  HAVE_OVERLAY             := 1
  HAVE_MATERIALUI				:= 1
  HAVE_XMB						:= 1
  HAVE_STB_FONT :=1
  RARCH_CONSOLE          = 1
  HAVE_THREADS     := 1
  HAVE_LIBRETRODB := 1
endif


CFLAGS += -Wall -std=gnu99 $(MACHDEP) $(PLATCFLAGS) $(INCLUDE)

OBJ = griffin/griffin.o  $(PLATOBJS)

INCLUDE += -I./libretro-common/include

ifeq ($(HAVE_LOGGER), 1)
CFLAGS		+= -DHAVE_LOGGER
CFLAGS      += -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT)
endif

ifeq ($(platform), wii)
CFLAGS      += -DHAVE_SOCKET_LEGACY
endif

ifeq ($(platform), vita)
CFLAGS      += -DHAVE_SOCKET_LEGACY
endif

ifeq ($(HAVE_KERNEL_PRX), 1)
CFLAGS      += -DHAVE_KERNEL_PRX
endif

ifeq ($(HAVE_WIIUSB_HID), 1)
CFLAGS		+= -DHAVE_WIIUSB_HID -DHAVE_HID
endif

ifeq ($(HAVE_VITA2D), 1)
CFLAGS		+= -DHAVE_VITA2D
endif

ifeq ($(HAVE_LIBRETRODB), 1)
CFLAGS		+= -DHAVE_LIBRETRODB
endif

ifeq ($(BIG_STACK),1)
CFLAGS		+= -DBIG_STACK
endif

ifeq ($(HAVE_RJPEG), 1)
CFLAGS      += -DHAVE_RJPEG
endif

ifeq ($(HAVE_FILE_LOGGER), 1)
CFLAGS		+= -DHAVE_FILE_LOGGER
endif

ifeq ($(HAVE_RARCH_EXEC), 1)
CFLAGS      += -DHAVE_RARCH_EXEC
endif

ifeq ($(HAVE_ZLIB), 1)
CFLAGS      += -DHAVE_ZLIB
endif

ifeq ($(WANT_ZLIB), 1)
CFLAGS		+= -DWANT_ZLIB
endif

ifeq ($(HAVE_RPNG), 1)
CFLAGS      += -DHAVE_RPNG
endif

ifeq ($(HAVE_RBMP), 1)
CFLAGS		+= -DHAVE_RBMP
endif

ifeq ($(HAVE_RTGA), 1)
CFLAGS		+=	-DHAVE_RTGA
endif

ifeq ($(HAVE_IMAGEVIEWER), 1)
CFLAGS		+=	-DHAVE_IMAGEVIEWER
endif

ifeq ($(HAVE_7ZIP), 1)
CFLAGS      += -DHAVE_7ZIP
endif

ifeq ($(HAVE_OVERLAY), 1)
CFLAGS      += -DHAVE_OVERLAY
endif

ifeq ($(HAVE_NETWORKING), 1)
CFLAGS      += -DHAVE_NETWORKING
endif

ifeq ($(RARCH_CONSOLE), 1)
CFLAGS += -DRARCH_CONSOLE
endif

ifeq ($(RARCH_MOBILE), 1)
CFLAGS += -DRARCH_MOBILE
endif

CFLAGS += -std=gnu99 -DSINC_LOWER_QUALITY -DHAVE_RGUI -DHAVE_MENU -DHAVE_GRIFFIN=1 -Wno-char-subscripts  -DRARCH_INTERNAL

ifeq ($(HAVE_MATERIALUI), 1)
CFLAGS += -DHAVE_MATERIALUI
endif

ifeq ($(HAVE_XMB), 1)
CFLAGS += -DHAVE_XMB
endif

ifeq ($(HAVE_STB_FONT), 1)
CFLAGS += -DHAVE_STB_FONT
endif

ifeq ($(HAVE_LANGEXTRA), 1)
CFLAGS += -DHAVE_LANGEXTRA
endif

ifeq ($(HAVE_FILTERS_BUILTIN), 1)
CFLAGS += -DHAVE_FILTERS_BUILTIN
endif

ifeq ($(HAVE_THREADS), 1)
CFLAGS += -DHAVE_THREADS
ifeq ($(platform), psp1)
LIBS += -lpthread-psp
endif
ifeq ($(platform), vita)
LIBS += -lpthread
endif
endif

ifeq ($(HAVE_RSOUND), 1)
CFLAGS += -DHAVE_RSOUND
endif

ifeq ($(HAVE_GETOPT_LONG), 1)
CFLAGS += -DHAVE_GETOPT_LONG=1
endif

ifeq ($(DEBUG), 1)
   CFLAGS += -O0 -g -DDEBUG
else ifeq ($(platform), psp1)
   CFLAGS += -O2
else ifeq ($(platform), vita)
   CFLAGS += -O3
else
   CFLAGS += -O3
endif

all: $(EXT_TARGET)

%.dol: %.elf
	$(ELF2DOL) $< $@

%.velf: %.elf
ifneq ($(DEBUG), 1)
	arm-vita-eabi-strip -g $<
endif
	vita-elf-create $< $@
	vita-make-fself -c -s $@ eboot.bin

%.elf32: %.elf
ifeq ($(platform), xenon360)
	$(OBJCOPY) -O elf32-powerpc --adjust-vma 0x80000000 $< $@
endif

%.prx: %.elf
ifeq ($(platform),psp1)
	psp-prxgen $< $@
endif

$(EXT_INTER_TARGET): $(OBJ)
	$(CXX) -o $@ $(LDFLAGS) $(LIBDIRS) $(OBJ) $(PLATEXTRA) $(LIBS)

%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<

%.o: %.S
	$(CC) $(CFLAGS) -c -o $@ $<

%.bmpobj: %.bmp
	$(LD) -r -b binary -o $@ $<

%.binobj: %.bin
	$(LD) -r -b binary -o $@ $<

$(APP_BOOTER_DIR)/app_booter.bin:
	$(MAKE) -C $(APP_BOOTER_DIR)

pkg: all
ifeq ($(platform), wii)
	cp -r $(EXT_TARGET) pkg/wii/CORE.dol
else ifeq ($(platform), ngc)
	cp -r $(EXT_TARGET) pkg/ngc/CORE.dol
else ifeq ($(platform), psp1)
	psp-fixup-imports$(EXT) $(EXT_TARGET)
endif

shaders-checkout:
	@if test -d $(SHADER_CG_DIR); then \
		echo "[SHADER CHECKOUT::] Git pulling common-shaders..."; \
      cd $(SHADER_CG_DIR); \
		$(GIT) pull; \
		cd ../../../../..; \
	else \
	echo "[SHADER CHECKOUT::] Git cloning common-shaders first..."; \
      $(GIT) clone git://github.com/libretro/common-shaders.git $(SHADER_CG_DIR); \
	fi

shaders-deploy:
ifeq ($(platform), ps3)
	@if test -d $(MEDIA_SHADER_DIR); then \
		cp -r $(SHADER_CG_DIR)/* $(MEDIA_SHADER_DIR); \
	else \
	echo "[DEPLOY PS3::] Creating PS3 shader directory first..."; \
		mkdir -p $(MEDIA_SHADER_DIR) || bin/true; \
	fi
	@echo "[DEPLOY PS3::] Copied shaders to PS3 shaders directory."
else ifeq ($(platform), ps3-cobra)
	@if test -d $(MEDIA_SHADER_DIR); then \
		cp -r $(SHADER_CG_DIR)/* $(MEDIA_SHADER_DIR); \
	else \
	echo "[DEPLOY PS3::] Creating PS3 shader directory first..."; \
		mkdir -p $(MEDIA_SHADER_DIR) || bin/true; \
	fi
	@echo "[DEPLOY PS3::] Copied shaders to PS3 shaders directory."
endif

shaders-convert-glsl:
	$(PYTHON3) tools/cg2glsl.py $(SHADER_CG_DIR) $(SHADER_GLSL_DIR)

overlays-checkout:
	@if test -d $(OVERLAY_DIR); then \
		echo "[OVERLAY CHECKOUT::] Git pulling common-overlays..."; \
      cd $(OVERLAY_DIR); \
		$(GIT) pull; \
		cd ../../../../..; \
	else \
	echo "[OVERLAY CHECKOUT::] Git cloning common-overlays first..."; \
      $(GIT) clone git://github.com/libretro/common-overlays.git $(OVERLAY_DIR); \
	fi


clean:
	rm -f $(EXT_TARGET)
	rm -f $(EXT_INTER_TARGET)
	rm -f $(OBJ)
ifeq ($(platform), wii)
	$(MAKE) -C $(APP_BOOTER_DIR) clean
endif

.PHONY: clean