STATIC_LINKING := 0
AR             := ar
TARGET_NAME    := virtualxt
CORE_DIR       := ../../../

ifneq ($(V),1)
   Q := @
endif

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

ifeq (,$(ARCH))
   ARCH = $(shell uname -m)
endif

OBJ_EXT := o
ifeq ($(STATIC_LINKING), 1)
   EXT := a
endif

ifneq (,$(findstring unix,$(platform)))
   EXT ?= so
   TARGET := $(TARGET_NAME)_libretro.$(EXT)
   fpic := -fPIC
   SHARED := -shared -Wl,--no-undefined
else ifeq ($(platform), linux-portable)
   EXT ?= so
   TARGET := $(TARGET_NAME)_libretro.$(EXT)
   fpic := -fPIC -nostdlib
   SHARED := -shared

   # NOTE: We only support linux amd64 atm.
else ifneq (,$(findstring android,$(platform)))
   TARGET := $(TARGET_NAME)_libretro_android.so
   fpic := -fPIC
   SHARED := -shared -Wl,--no-undefined
   TARGET_TRIPLE := unknown
   
   ifeq ($(platform), android-arm)
      TARGET_TRIPLE = armv7a-linux-androideabi
   else ifeq ($(platform), android-arm64)
      TARGET_TRIPLE = aarch64-linux-android
   else ifeq ($(platform), android-x86)
      TARGET_TRIPLE = i686-linux-android
   else ifeq ($(platform), android-x86_64)
      TARGET_TRIPLE = x86_64-linux-android
   endif

   CC = $(ANDROID_NDK_LLVM)/bin/$(TARGET_TRIPLE)21-clang
   AR = $(ANDROID_NDK_LLVM)/bin/llvm-ar
   ROOT_LDFLAGS = -nostdlib

else ifneq (,$(findstring osx,$(platform)))
   TARGET := $(TARGET_NAME)_libretro.dylib
   fpic := -fPIC
   SHARED := -dynamiclib
   TARGET_PLATFORM = $(shell uname -p)

   ifeq ($(CROSS_COMPILE),1)
		TARGET_RULE   = -target $(LIBRETRO_APPLE_PLATFORM) -isysroot $(LIBRETRO_APPLE_ISYSROOT)
		CC           := cc $(TARGET_RULE)
		LDFLAGS      += $(TARGET_RULE)
		TARGET_PLATFORM = $(LIBRETRO_APPLE_PLATFORM)
   endif

else ifneq (,$(findstring ios,$(platform)))
   EXT ?= dylib
   TARGET := $(TARGET_NAME)_libretro_ios.$(EXT)
   fpic := -fPIC
   SHARED := -dynamiclib
   MIN_VERSION := -miphoneos-version-min=5.0

   ifeq ($(platform),$(filter $(platform),ios9 ios-arm64))
      MIN_VERSION = -miphoneos-version-min=8.0
   endif
   ifeq ($(IOSSDK),)
      IOSSDK := $(shell xcodebuild -version -sdk iphoneos Path)
   endif

   ifeq ($(platform),ios-arm64)
      SHARED += -arch arm64 $(MIN_VERSION) -isysroot $(IOSSDK)
      CC = cc -arch arm64 $(MIN_VERSION) -isysroot $(IOSSDK)
   else
      SHARED += -arch armv7 $(MIN_VERSION) -isysroot $(IOSSDK)
      CC = cc -arch armv7 $(MIN_VERSION) -isysroot $(IOSSDK)
   endif
else ifneq (,$(findstring tvos,$(platform)))
   EXT ?= dylib
   TARGET := $(TARGET_NAME)_libretro_tvos.$(EXT)
   fpic := -fPIC
   SHARED := -dynamiclib
   MIN_VERSION := -mappletvos-version-min=9.0

   ifeq ($(TVOSSDK),)
      TVOSSDK := $(shell xcodebuild -version -sdk appletvos Path)
   endif

   SHARED += -arch arm64 $(MIN_VERSION) -isysroot $(TVOSSDK)
   CC = cc -arch arm64 $(MIN_VERSION) -isysroot $(TVOSSDK)
else ifeq ($(platform), emscripten)
    TARGET := $(TARGET_NAME)_libretro_emscripten.bc
    OBJ_EXT := o
    CC = emcc
    fpic := -fPIC
    SHARED := -shared -Wl,--no-undefined
    STATIC_LINKING=1
    AR = emar
else ifneq (,$(findstring msvc,$(platform)))
   TARGET := $(TARGET_NAME)_libretro.dll
   STATIC_LINKING=0
else
   TARGET := $(TARGET_NAME)_libretro.dll
   SHARED := -shared -static-libgcc -s -Wl,--no-undefined
endif

MKPATH = $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
OBJECTS = $(TARGET_NAME)_libretro.$(OBJ_EXT)

all: $(TARGET)


$(OBJECTS):
	$(MAKE) -C $(CORE_DIR) "CC=$(CC)" "AR=$(AR)" "LDFLAGS=$(ROOT_LDFLAGS)" object
	cp $(CORE_DIR)virtualxt_libretro.o $@
	
$(TARGET): $(OBJECTS)
ifeq ($(STATIC_LINKING), 1)
	$(AR) rcs $@ $(OBJECTS)
else
	@$(if $(Q), $(shell echo echo LD $@),)
	$(Q)$(CC) $(fpic) $(SHARED) -o $@ $(OBJECTS) $(LDFLAGS)
endif

clean:
	rm -f $(OBJECTS) $(TARGET)
	-$(MAKE) -C $(CORE_DIR) clean

.PHONY: clean

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