TARGET		    := retroarch.exe
DEBUG           = 0
GRIFFIN_BUILD   = 0
OS              = Win32
ARCH            = amd64
#TARGET_ARCH     = x86
BUILD_DIR       = objs/msvc
CXX_BUILD       = 0

WindowsSdkDir = C:\Program Files (x86)\Windows Kits\10\$(NOTHING)
WindowsSDKVersion := 10.0.14393.0\$(NOTHING)
VCINSTALLDIR := C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\$(NOTHING)

HAVE_DSP_FILTER          := 1
HAVE_VIDEO_FILTER        := 1
HAVE_SCREENSHOTS         := 1
HAVE_REWIND              := 1
HAVE_AUDIOMIXER          := 1
HAVE_D3DX                := 1
HAVE_D3D8                := 0
HAVE_D3D9                := 1
HAVE_D3D10               := 1
HAVE_D3D11               := 1
HAVE_D3D12               := 1
HAVE_CG                  := 1
HAVE_OPENGL              := 1
HAVE_OPENGL1             := 1
HAVE_GFX_WIDGETS			 := 1
HAVE_VULKAN              := 1
HAVE_XAUDIO              := 1
HAVE_XINPUT              := 1
HAVE_WASAPI              := 0
HAVE_THREAD_STORAGE      := 1
HAVE_WINMM               := 1

HAVE_RPNG                := 1
HAVE_ZLIB                := 1
HAVE_CONFIGFILE          := 1
HAVE_PATCH               := 1
HAVE_MENU                := 1
HAVE_RGUI                := 1
HAVE_XMB                 := 1
HAVE_MATERIALUI          := 1
HAVE_STB_FONT            := 1
HAVE_THREADS             := 1
HAVE_LIBRETRODB          := 1
HAVE_COMMAND             := 1
HAVE_STDIN_CMD           := 1
HAVE_CMD                 := 1
HAVE_DYLIB               := 1
HAVE_DYNAMIC             := 1
HAVE_DINPUT              := 1
HAVE_MENU_COMMON         := 1
HAVE_BUILTINZLIB         := 1

HAVE_RJPEG               := 1
HAVE_RBMP                := 1
HAVE_RTGA                := 1
HAVE_7ZIP                := 1
HAVE_NETWORKING          := 1
HAVE_NETWORK_CMD         := 1
HAVE_OVERLAY             := 1
HAVE_VIDEO_LAYOUT        := 0
HAVE_LANGEXTRA           := 1
HAVE_CHEEVOS             := 1
HAVE_SHADERPIPELINE      := 1
HAVE_IMAGEVIEWER         := 1
HAVE_BSV_MOVIE           := 1
HAVE_CHEATS              := 1

ifeq ($(HAVE_D3D8), 1)
   D3D8_LIBS := -ld3d8
   ifeq ($(HAVE_D3DX), 1)
      D3DX8_LIBS := -ld3dx8
   endif
endif

ifeq ($(HAVE_D3D9), 1)
   D3D9_LIBS := -ld3d9
   ifeq ($(HAVE_D3DX), 1)
      D3DX9_LIBS := -ld3dx9
   endif
endif

include Makefile.common
INCLUDE_DIRS := $(patsubst  -isystem%,-I%,$(INCLUDE_DIRS))
CFLAGS       := $(filter-out  -Wno-unknown-pragmas,$(DEF_FLAGS))
CXXFLAGS     := $(filter-out  -fpermissive -Wno-switch -Wno-sign-compare -fno-strict-aliasing -Wno-maybe-uninitialized -Wno-reorder -Wno-parentheses,$(CXXFLAGS))
LIBS         := $(filter-out  -lstdc++,$(LIBS))

ifeq ($(ARCH),x64)
   ARCH := amd64
endif

ARCH2 := $(ARCH)
ifeq ($(ARCH),amd64)
   ARCH2 := x64
endif

ifeq ($(TARGET_ARCH),)
   TARGET_ARCH = $(ARCH)
endif

ifeq ($(TARGET_ARCH),x64)
   TARGET_ARCH = amd64
endif

TARGET_ARCH2 = $(TARGET_ARCH)
ifeq ($(TARGET_ARCH2),amd64)
   TARGET_ARCH2 = x64
endif

CROSS = $(ARCH)
ifeq ($(ARCH),x86)
CROSS =
endif

INCLUDE := $(VCINSTALLDIR)include;$(VCINSTALLDIR)atlmfc\include;$(WindowsSdkDir)include\$(WindowsSDKVersion)ucrt;$(WindowsSdkDir)include\$(WindowsSDKVersion)shared;$(WindowsSdkDir)include\$(WindowsSDKVersion)um;
LIB     := $(VCINSTALLDIR)LIB\$(CROSS);$(VCINSTALLDIR)atlmfc\lib\$(CROSS);$(WindowsSdkDir)lib\$(WindowsSDKVersion)ucrt\$(TARGET_ARCH2);$(WindowsSdkDir)lib\$(WindowsSDKVersion)um\$(TARGET_ARCH2);C:\Program Files (x86)\NVIDIA Corporation\Cg\lib.$(TARGET_ARCH2);C:\Program Files (x86)\Microsoft DirectX SDK (February 2010)\Lib\$(TARGET_ARCH2);
LIBPATH := $(VCINSTALLDIR)LIB\$(CROSS);$(VCINSTALLDIR)atlmfc\lib\$(CROSS);

PATH := $(shell IFS=$$'\n'; cygpath "$(VCINSTALLDIR)bin\\$(CROSS)"):$(shell IFS=$$'\n'; cygpath "$(WindowsSdkDir)\bin\\$(ARCH2)"):$(PATH)

export INCLUDE := $(INCLUDE)
export LIB     := $(LIB)
export LIBPATH := $(LIBPATH)
export PATH    := $(PATH)

#$(info WindowsSdkDir : $(WindowsSdkDir))
#$(info WindowsSDKVersion : $(WindowsSDKVersion))
#$(info VCINSTALLDIR : $(VCINSTALLDIR))
#$(info INCLUDE : $(INCLUDE))
#$(info LIB : $(LIB))
#$(info LIBPATH : $(LIBPATH))
#$(info PATH : $(PATH))
#$(error end)

DEFINES += -D__SSE__ -D__SSE2__
ifeq ($(TARGET_ARCH2),x64)
DEFINES += -D__x86_64__
else
#DEFINES += -D__i686__
endif

FLAGS  += -nologo -MP
FLAGS  += -Gm- -Zc:inline -fp:precise -Zc:forScope -GR- -Gd -Oi -volatile:iso
#FLAGS  += -Zc:wchar_t -Zp16 -Z7
FLAGS += -utf-8
#FLAGS += -source-charset:utf-8

CXXFLAGS += $(CFLAGS) -TP -EHsc
ifeq ($(CXX_BUILD),1)
   CFLAGS  := $(CXXFLAGS)
   DEFINES += -DCXX_BUILD
else
   CFLAGS  += -TC
endif

WARNINGS += -WX -W3
WARNINGS += -wd4101 -wd4996 -wd4244 -wd4267 -wd4090 -wd4305 -wd4146 -wd4334 -wd4018 -wd4800 -wd4838

CC = cl.exe
CXX = cl.exe
LD = link.exe
RC = rc.exe

LIBS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib
LDFLAGS  += -nologo -wx -nxcompat -machine:$(TARGET_ARCH2)

ifeq ($(DEBUG),1)
   FLAGS += -GS -Gy -Od -RTC1 -D_SECURE_SCL=1 -Zi
   FLAGS += -MDd
   LDFLAGS += -DEBUG
   DEFINES += -DDEBUG -D_DEBUG
else
   FLAGS += -GS- -Gy- -O2 -Ob2 -GF -GT -Oy -Ot -D_SECURE_SCL=0
   FLAGS += -MD
endif

ifeq ($(DEBUG),1)
   BUILD_DIR := $(BUILD_DIR)-debug
endif

ifeq ($(GRIFFIN_BUILD),1)
   BUILD_DIR := $(BUILD_DIR)-griffin
endif

BUILD_DIR := $(BUILD_DIR)-$(TARGET_ARCH2)

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

ifeq ($(GRIFFIN_BUILD), 1)
   OBJ       := griffin/griffin.o griffin/griffin_cpp.o
   DEFINES   += -DHAVE_GRIFFIN -DUSE_MATH_DEFINES
else
   BLACKLIST :=
   OBJ := $(filter-out $(BLACKLIST),$(OBJ))
endif

DEFINES += -DRARCH_INTERNAL -DHAVE_SCREENSHOTS -DHAVE_REWIND -DHAVE_DYNAMIC -DJSON_STATIC
INCLUDE_DIRS += -I. -Igfx/include

OBJ := $(patsubst %rarch.o,%rarch.res,$(OBJ))
OBJ := $(addprefix $(BUILD_DIR)/,$(OBJ))
OBJ := $(OBJ:.o=.obj)

LDFLAGS += -WX -SUBSYSTEM:WINDOWS -ENTRY:mainCRTStartup

DEFINES := $(patsubst -f%,,$(DEFINES))
LDFLAGS := $(patsubst -l%,%.lib,$(LDFLAGS))
LIBS := $(filter-out -lm,$(LIBS))
LIBS := $(patsubst -l%,%.lib,$(LIBS))

#$(info INCLUDE_DIRS : $(INCLUDE_DIRS))
#$(info DEFINES : $(DEFINES))
#$(info CFLAGS : $(CFLAGS))
#$(info CXXFLAGS : $(CXXFLAGS))
#$(info LDFLAGS : $(LDFLAGS))
#$(info LIBS : $(LIBS))
#$(info OBJ : $(OBJ))
#$(info target : $(TARGET))
#$(info flags : $(FLAGS))
#$(info INCLUDE : $(INCLUDE))
#$(info LIB : $(LIB))
#$(info LIBPATH : $(LIBPATH))
#$(error end)

$(info os     : $(OS))
$(info host   : $(ARCH))
$(info target : $(TARGET_ARCH))

all: $(TARGET)

%: $(BUILD_DIR)/%
	cp $< $@

ifeq ($(DEBUG),1)
%.exe: $(BUILD_DIR)/%.exe
	cp $< $@
	cp $(BUILD_DIR)/$*.pdb $*.pbd
endif

SHELL:=$(SHELL) -o pipefail

DEPFLAGS = -showIncludes | tee $(BUILD_DIR)/$*.dtemp | sed /'Note: including file:'/d
MAKEDEPS = echo $@: $< \\ > $(BUILD_DIR)/$*.depend && \
           grep 'Note: including file:' $(BUILD_DIR)/$*.dtemp \
           | sed '/$(subst \,\\,$(WindowsSdkDir))/Id; /$(subst \,\\,$(VCINSTALLDIR))/Id; s/Note: including file:[ ]*//g; s/\\/\//g; s/ /\\ /g; s/.*/   & \\/g' \
           >> $(BUILD_DIR)/$*.depend && \
           rm -f $(BUILD_DIR)/$*.dtemp

#DEPFLAGS :=
#MAKEDEPS :=

$(BUILD_DIR)/%.obj: %.cpp
	@mkdir -p $(dir $@)
	$(Q)$(CXX) -c -Fo:$@ $< $(FLAGS) $(CXXFLAGS) $(DEFINES) $(INCLUDE_DIRS) $(WARNINGS) $(DEPFLAGS)
	@$(MAKEDEPS)

$(BUILD_DIR)/%.obj: %.c
	@mkdir -p $(dir $@)
	$(Q)$(CC) -c -Fo:$@ $< $(FLAGS) $(CFLAGS) $(DEFINES) $(INCLUDE_DIRS) $(WARNINGS) $(DEPFLAGS)
	@$(MAKEDEPS)

$(BUILD_DIR)/%.res: %.rc
	@mkdir -p $(dir $@)
	$(Q)$(RC) $<
	$(Q)mv $*.res $@

$(BUILD_DIR)/$(TARGET): $(OBJ) .$(TARGET).last
	@touch .$(TARGET).last
	$(Q)$(LD) $(OBJ) $(LDFLAGS) $(LIBS) -out:$(BUILD_DIR)/$(TARGET)

%.h %.hpp %.depend %.last: ;

clean:
	rm -f $(OBJ) $(TARGET)
	rm -f $(BUILD_DIR)/$(TARGET)
	rm -f .$(TARGET).last
	rm -f $(OBJ:.obj=.depend)

.PHONY: clean all
.PRECIOUS: %.depend %.last

-include $(patsubst %.obj,%.depend,$(filter %.obj,$(OBJ)))