TARGET		    := retroarch_orbis
DEBUG               ?= 0
GRIFFIN_BUILD        = 0
WHOLE_ARCHIVE_LINK   = 0

PS4_TITLE_ID	:= RETROARCH
PS4_TITLE_NAME	:= RetroArch

PC_DEVELOPMENT_IP_ADDRESS  =
PC_DEVELOPMENT_UDP_PORT	   =

OBJ :=

DEFINES :=

ifeq ($(GRIFFIN_BUILD), 1)
	OBJ += griffin/griffin.o
	DEFINES += -DHAVE_GRIFFIN=1
	DEFINES += -DHAVE_MENU -DHAVE_LIBRETRODB -DHAVE_CONFIGFILE
	DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_CC_RESAMPLER
	ifeq ($(DEBUG), 1)
		DEFINES += -DHAVE_NETLOGGER
	endif
else

	HAVE_FILTERS_BUILTIN	:= 1
	HAVE_LANGEXTRA		:= 0
	HAVE_RPNG		:= 1
	HAVE_RJPEG		:= 1
	HAVE_RBMP		:= 1
	HAVE_RTGA		:= 1
	HAVE_ZLIB		:= 1
	HAVE_OVERLAY		:= 1
	HAVE_VIDEO_LAYOUT := 0
	HAVE_7ZIP		:= 1
	HAVE_EGL 		:= 1
	HAVE_MENU_WIDGETS := 1
	HAVE_GLSL      := 1
	HAVE_OPENGLES  		:= 1
	HAVE_NETWORKING		:= 0
	HAVE_SOCKET_LEGACY	:= 0
	HAVE_MENU		:= 1
	HAVE_MENU_COMMON	:= 1
	HAVE_CONFIGFILE := 1
	HAVE_RGUI		:= 0
	HAVE_MATERIALUI 	:= 0
	HAVE_XMB		:= 1
	HAVE_THREADS		:= 1
	HAVE_LIBRETRODB		:= 1
	HAVE_CC_RESAMPLER	:= 1
	HAVE_CHEEVOS		:= 1
	RARCH_CONSOLE		:= 1
	HAVE_STATIC_VIDEO_FILTERS = 1
	HAVE_STATIC_AUDIO_FILTERS = 1

	ifeq ($(DEBUG), 1)
		HAVE_NETLOGGER = 1
	endif

	include Makefile.common
	CFLAGS += $(DEF_FLAGS)
	BLACKLIST :=
	OBJ := $(filter-out $(BLACKLIST),$(OBJ))
endif

ifeq ($(strip $(PS4SDK)),)
$(error "Please set PS4SDK in your environment. export PS4SDK=<path to>ps4sdk")
endif

export PATH := $(PATH):$(PS4SDK)/bin

PREFIX :=

CC      := $(PREFIX)clang
CXX     := $(PREFIX)clang
AS      := $(PREFIX)clang
AR      := $(PREFIX)ar
OBJCOPY := $(PREFIX)objcopy
STRIP   := $(PREFIX)strip
NM      := $(PREFIX)nm
LD      := $(CXX)

INCDIRS := -I. -Ideps/7zip -Ilibretro-common/include -Ideps/stb -Ilibretro-common/include/compat/zlib
LIBDIRS := -L.

ARCHFLAGS := -m64 -DORBIS
CFLAGS    += $(ARCHFLAGS) -std=c11 -mcmodel=large -ffreestanding -nostdlib -nostdinc -fno-builtin -fno-stack-protector

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

ASFLAGS := $(ARCHFLAGS) -I$(PS4SDK)/include -target x86_64-scei-ps4-elf -fPIE
LDFLAGS := -O3 -Wall -m64 -nostartfiles -nostdlib -L$(PS4SDK)/lib -pie
ARFLAGS := rcs

CRTFILE ?= $(PS4SDK)/crt0.s

CFLAGS += -Wall -pedantic -Wno-zero-length-array -Wno-format-pedantic
CFLAGS += -D__PS4__ -I$(PS4SDK)/include -I $(PS4SDK)/include/sce
CFLAGS += -target x86_64-scei-ps4-elf -fPIE
CFLAGS += -DRARCH_INTERNAL -DRARCH_CONSOLE
CFLAGS += -DHAVE_FILTERS_BUILTIN $(DEFINES)

ifneq ($(PC_DEVELOPMENT_IP_ADDRESS),)
   CFLAGS += -DPC_DEVELOPMENT_IP_ADDRESS='"$(PC_DEVELOPMENT_IP_ADDRESS)"'
endif

ifneq ($(PC_DEVELOPMENT_UDP_PORT),)
   CFLAGS += -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT)
endif

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

PS4_LIBS := -lps4link -ldebugnet -lorbisFile -lelfloader -lorbisKeyboard -lorbis2d -lpng -lz -lorbisGl -lorbisPad -lorbisAudio -lmod -lorbisFileBrowser -lorbisXbmFont -lSceNet_stub -lScePigletv2VSH_stub -lSceSystemService_stub -lSceUserService_stub -lScePad_stub -lSceAudioOut_stub -lSceIme_stub -lSceSysmodule_stub \
	-lPs4_extension_kernel_call_standard -lPs4_extension_kernel_execute_dynlib_prepare_dlclose -lPs4_common_kernel -lPs4_common_user -lPs4_common_generic -lPs4LibCInternalAdaptive_stub -lPs4LibKernelAdaptive_stub -lSceLibcInternal_stub -lkernel_stub -lps4Kernel_stub -lPs4_base_stub_resolve_minimal -lPs4_base_kernel_dlsym_standard -lPs4_base_kernel_seek_elf_address_standard -lPs4_base_assembler_register_parameter_standard -lPs4_base_assembler_system_call_standard

LIBS	:= $(WHOLE_START) -lretro_orbis $(WHOLE_END) $(PS4_LIBS)

TARGETS := $(TARGET).elf

DEPFLAGS    = -MT $@ -MMD -MP -MF $*.Tdepend
POSTCOMPILE = mv -f $*.Tdepend $*.depend

all: $(TARGETS)

%.o: %.cpp
%.o: %.cpp %.depend
	$(CXX) -c -o $@ $< $(CXXFLAGS) $(INCDIRS) $(DEPFLAGS)
	$(POSTCOMPILE)

%.o: %.c
%.o: %.c %.depend
	$(CC) -c -o $@ $< $(CFLAGS) $(INCDIRS) $(DEPFLAGS)
	$(POSTCOMPILE)

%.o: %.S
%.o: %.S %.depend
	$(CC) -c -o $@ $< $(ASFLAGS) $(INCDIRS) $(DEPFLAGS)
	$(POSTCOMPILE)

%.o: %.s
%.o: %.s %.depend
	$(CC) -c -o $@ $< $(ASFLAGS) $(INCDIRS) $(DEPFLAGS)
	$(POSTCOMPILE)

%.depend: ;

$(TARGET).elf: $(OBJ) libretro_orbis.a
	$(LD) $(CRTFILE) $(OBJ) $(LDFLAGS) $(LIBDIRS) $(LIBS) -o $@

clean:
	rm -f $(OBJ) $(TARGET).elf
	rm -f $(OBJ:.o=.depend)

.PHONY: clean all
.PRECIOUS: %.depend

-include $(OBJ:.o=.depend)