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
HAVE_NETWORKING            = 1
PC_DEVELOPMENT_IP_ADDRESS  = 255.255.255.255
PC_DEVELOPMENT_UDP_PORT    = 3490
RARCH_CONSOLE              = 0
USBGECKO                   = 0

SPACE      :=
SPACE      := $(SPACE) $(SPACE)
BACKSLASH  :=
BACKSLASH  := \$(BACKSLASH)
filter_out1 = $(filter-out $(firstword $1),$1)
filter_out2 = $(call filter_out1,$(call filter_out1,$1))

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

TARGET_NAME        := retroarch

INCLUDE            :=
LDFLAGS            :=
LIBDIRS            :=

ifeq ($(LIBRETRO), nxengine)
   WHOLE_ARCHIVE_LINK = 1
endif

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

LIBS               := $(WHOLE_START) -lretro_wii $(WHOLE_END)

libogc_platform    := 1

EXTERNAL_LIBOGC   ?= 0
GX_PTHREAD_LEGACY ?= 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)_wii.dol
EXT_INTER_TARGET  := $(TARGET_NAME)_wii.elf

# Check whether ELF2DOL executable exists
# (path has changed in more recent toolchains)
ifeq ("$(wildcard $(ELF2DOL))","")
   ELF2DOL = $(DEVKITPRO)/tools/bin/elf2dol$(EXE_EXT)
endif

INCLUDE += -I.

ifeq ($(EXTERNAL_LIBOGC), 1)
   CFLAGS   += -DEXTERNAL_LIBOGC
   CXXFLAGS += -DEXTERNAL_LIBOGC
   LIBDIRS += -L$(DEVKITPRO)/libogc/lib/wii
   INCLUDE +=  -I$(DEVKITPRO)/libogc/include
else
   CFLAGS   += -DINTERNAL_LIBOGC
   CXXFLAGS += -DINTERNAL_LIBOGC
   LIBDIRS += -Lwii/libogc/libs/wii
   INCLUDE += -Iwii/libogc/include
endif

ifeq ($(GX_PTHREAD_LEGACY), 1)
   CFLAGS   += -DGX_PTHREAD_LEGACY
   CXXFLAGS += -DGX_PTHREAD_LEGACY
endif

MACHDEP := -DHW_RVL -mrvl

LIBDIRS += -L.
MACHDEP += -DGEKKO -mcpu=750 -meabi -mhard-float

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

ifeq ($(EXTERNAL_LIBOGC), 1)
   LIBS += -lfat
endif

LIBS += -lwiiuse -lbte

ifeq ($(USBGECKO), 1)
  LIBS += -ldb
endif
 
ifeq ($(HAVE_LOGGER), 1)
  LIBS += -lbba
endif

LIBS += -logc

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

HAVE_RUNAHEAD            := 1
HAVE_DSP_FILTER          := 1
HAVE_VIDEO_FILTER        := 1
HAVE_FILTERS_BUILTIN     := 1
HAVE_THREADS             := 1
HAVE_RPNG                := 1
HAVE_RJPEG               := 1
HAVE_RBMP                := 1
HAVE_RTGA                := 1
HAVE_IBXM                := 1
HAVE_OVERLAY             := 1
HAVE_VIDEO_LAYOUT        := 0
HAVE_ZLIB                := 1
HAVE_7ZIP                := 1
HAVE_CONFIGFILE          := 1
HAVE_PATCH               := 1
HAVE_CHEATS              := 1
HAVE_SCREENSHOTS         := 1
HAVE_REWIND              := 1
HAVE_AUDIOMIXER          := 1
HAVE_RWAV                := 1
RARCH_CONSOLE             = 1
HAVE_CHEATS              := 1
HAVE_CORE_INFO_CACHE     := 1
HAVE_MENU_COMMON         := 1
HAVE_MENU                := 1
HAVE_BUILTINZLIB         := 1
HAVE_STATIC_AUDIO_FILTERS := 1
HAVE_STATIC_VIDEO_FILTERS := 1

#HAVE_LANGEXTRA          := 1
HAVE_WIIUSB_HID          := 1
HAVE_HID                 := 1
HAVE_RARCH_EXEC          := 1
HAVE_RSOUND              := 0
HAVE_XMB                 := 0
HAVE_OZONE               := 0
HAVE_RGUI                := 1
HAVE_MATERIALUI          := 0

CFLAGS      += -DHAVE_SOCKET_LEGACY

APP_BOOTER_DIR = wii/app_booter
PLATOBJS := $(APP_BOOTER_DIR)/app_booter.binobj

ifeq ($(USBGECKO), 1)
   CFLAGS += -DUSBGECKO
endif

INCLUDE += -I./libretro-common/include \
           -Ideps \
           -Ideps/stb
CFLAGS += -Wall -std=gnu99 $(MACHDEP) $(PLATCFLAGS) $(INCLUDE)

OBJ =  $(PLATOBJS) audio/drivers/gx_audio.o gfx/drivers/gx_gfx.o input/drivers/gx_input.o frontend/drivers/platform_gx.o input/drivers_joypad/gx_joypad.o memory/wii/mem2_manager.o gfx/drivers/gx_gfx_vi_encoder.o frontend/drivers/platform_wii.o input/drivers_hid/wiiusb_hid.o 

ifeq ($(EXTERNAL_LIBOGC), 0)
   OBJ += wii/libogc/libfat/libfat.o wii/libogc/libfat/fatfile.o wii/libogc/libfat/file_allocation_table.o wii/libogc/libfat/cache.o wii/libogc/libfat/fatdir.o wii/libogc/libfat/partition.o wii/libogc/libfat/directory.o wii/libogc/libfat/filetime.o wii/libogc/libfat/disc.o
endif

include Makefile.common

CFLAGS += $(DEFINES) -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" \
		-DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) \


ifeq ($(WANT_GLSLANG), 1)
	OBJ += griffin/griffin_glslang.o
endif

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 ($(HAVE_KERNEL_PRX), 1)
   CFLAGS      += -DHAVE_KERNEL_PRX
endif

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

ifeq ($(BIG_STACK),1)
   CFLAGS      += -DBIG_STACK
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
   CFLAGS      += -I./libretro-common/include/compat/zlib
endif

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

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

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

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

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

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

ifeq ($(HAVE_NETWORK_CMD), 1)
   CFLAGS += -DHAVE_NETWORK_CMD
endif

ifeq ($(HAVE_DYNAMIC), 1)
   CFLAGS += -DHAVE_DYNAMIC
endif

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

OBJOUT   = -o
LINKOUT  = -o
LINK = $(CXX)

all: $(EXT_TARGET)

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

$(EXT_INTER_TARGET): $(OBJ)
	$(LINK) $(LINKOUT)$@ $(LDFLAGS) $(LIBDIRS) $(OBJ) $(PLATEXTRA) $(LIBS)

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

%.o: %.cpp
	$(CXX) $(CFLAGS) -c $(OBJOUT)$@ $<

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

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

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

clean:
	rm -f $(EXT_TARGET)
	rm -f $(EXT_INTER_TARGET)
	rm -f $(OBJ)
	$(MAKE) -C $(APP_BOOTER_DIR) clean

.PHONY: clean

print-%:
	@echo '$*=$($*)'