1DEBUG=0
2DEBUGLOG=0
3RELEASE_BUILD=1
4SINGLE_PRECISION_FLOATS=0
5MIN_AUDIO_PROCESSING_PER_FRAME=0
6FRONTEND_SUPPORTS_RGB565=1
7
8ifeq ($(platform),)
9platform = unix
10ifeq ($(shell uname -s),)
11   platform = win
12else ifneq ($(findstring MINGW,$(shell uname -s)),)
13   platform = win
14else ifneq ($(findstring Darwin,$(shell uname -s)),)
15   platform = osx
16	arch = intel
17ifeq ($(shell uname -p),powerpc)
18	arch = ppc
19endif
20ifeq ($(shell uname -p),arm64)
21	arch = arm
22endif
23else ifneq ($(findstring win,$(shell uname -s)),)
24   platform = win
25endif
26endif
27
28# system platform
29system_platform = unix
30ifeq ($(shell uname -a),)
31EXE_EXT = .exe
32   system_platform = win
33else ifneq ($(findstring Darwin,$(shell uname -a)),)
34   system_platform = osx
35	arch = intel
36ifeq ($(shell uname -p),powerpc)
37	arch = ppc
38endif
39ifeq ($(shell uname -p),arm64)
40	arch = arm
41endif
42else ifneq ($(findstring MINGW,$(shell uname -a)),)
43   system_platform = win
44endif
45
46TARGET_NAME := nxengine
47
48CORE_DIR     := nxengine
49EXTRACTDIR   := $(CORE_DIR)/extract-auto
50LIBS         :=
51ifeq (,$(findstring msvc,$(platform)))
52LIBS         += -lm
53endif
54
55SPACE :=
56SPACE := $(SPACE) $(SPACE)
57BACKSLASH :=
58BACKSLASH := \$(BACKSLASH)
59filter_out1 = $(filter-out $(firstword $1),$1)
60filter_out2 = $(call filter_out1,$(call filter_out1,$1))
61unixpath = $(subst \,/,$1)
62unixcygpath = /$(subst :,,$(call unixpath,$1))
63
64ifeq ($(platform), unix)
65   TARGET := $(TARGET_NAME)_libretro.so
66   fpic := -fPIC
67   SHARED := -shared -Wl,--version-script=$(CORE_DIR)/libretro/link.T -Wl,-no-undefined
68   CFLAGS += -D_GNU_SOURCE=1
69else ifeq ($(platform), osx)
70   TARGET := $(TARGET_NAME)_libretro.dylib
71   fpic := -fPIC
72   SHARED := -dynamiclib
73ifeq ($(arch),ppc)
74   CFLAGS += -DMSB_FIRST=1
75endif
76   CFLAGS += -DOSX
77   OSXVER = `sw_vers -productVersion | cut -d. -f 2`
78   OSX_LT_MAVERICKS = `(( $(OSXVER) <= 9)) && echo "YES"`
79   OSX_GT_MOJAVE = $(shell (( $(OSXVER) >= 14)) && echo "YES")
80ifeq ($(OSX_LT_MAVERICKS),YES)
81   fpic += -mmacosx-version-min=10.1
82endif
83   fpic += -stdlib=libc++
84
85   ifeq ($(CROSS_COMPILE),1)
86		TARGET_RULE   = -target $(LIBRETRO_APPLE_PLATFORM) -isysroot $(LIBRETRO_APPLE_ISYSROOT)
87		CFLAGS   += $(TARGET_RULE)
88		CPPFLAGS += $(TARGET_RULE)
89		CXXFLAGS += $(TARGET_RULE)
90		LDFLAGS  += $(TARGET_RULE)
91   endif
92
93# iOS
94else ifneq (,$(findstring ios,$(platform)))
95   TARGET := $(TARGET_NAME)_libretro_ios.dylib
96   fpic := -fPIC
97   SHARED := -dynamiclib
98
99ifeq ($(IOSSDK),)
100   IOSSDK := $(shell xcodebuild -version -sdk iphoneos Path)
101endif
102
103ifeq ($(platform), ios-arm64)
104	 CC = clang -arch arm64 -isysroot $(IOSSDK)
105	 CXX = clang++ -arch arm64 -isysroot $(IOSSDK)
106else
107	 CC = clang -arch armv7 -isysroot $(IOSSDK)
108   CXX = clang++ -arch armv7 -isysroot $(IOSSDK)
109endif
110CFLAGS += -DIOS
111ifeq ($(platform),$(filter $(platform),ios9 ios-arm64))
112   CC     +=  -miphoneos-version-min=8.0
113   CXX    +=  -miphoneos-version-min=8.0
114   CFLAGS +=  -miphoneos-version-min=8.0
115else
116   CC     +=  -miphoneos-version-min=5.0
117   CXX    +=  -miphoneos-version-min=5.0
118   CFLAGS +=  -miphoneos-version-min=5.0
119endif
120
121# tvOS
122else ifeq ($(platform), tvos-arm64)
123	TARGET := $(TARGET_NAME)_libretro_tvos.dylib
124	fpic = -fPIC
125	SHARED := -dynamiclib
126	ifeq ($(IOSSDK),)
127		IOSSDK := $(shell xcodebuild -version -sdk appletvos Path)
128	endif
129
130else ifeq ($(platform), theos_ios)
131DEPLOYMENT_IOSVERSION = 5.0
132TARGET = iphone:latest:$(DEPLOYMENT_IOSVERSION)
133ARCHS = armv7 armv7s
134TARGET_IPHONEOS_DEPLOYMENT_VERSION=$(DEPLOYMENT_IOSVERSION)
135THEOS_BUILD_DIR := objs
136include $(THEOS)/makefiles/common.mk
137
138LIBRARY_NAME = $(TARGET_NAME)_libretro_ios
139else ifeq ($(platform), qnx)
140   TARGET := $(TARGET_NAME)_libretro_qnx.so
141   fpic := -fPIC
142   SHARED := -shared -Wl,--version-script=$(CORE_DIR)/libretro/link.T -Wl,-no-undefined
143   CFLAGS += -D_GNU_SOURCE=1
144
145   CC = qcc -Vgcc_ntoarmv7le
146   CXX = QCC -Vgcc_ntoarmv7le_cpp
147   AR = QCC -Vgcc_ntoarmv7le
148	CFLAGS += -D__BLACKBERRY_QNX__ -marm -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp -lcpp
149else ifeq ($(platform), psl1ght)
150   TARGET := $(TARGET_NAME)_libretro_$(platform).a
151   CC = $(PS3DEV)/ppu/bin/ppu-gcc$(EXE_EXT)
152   CXX = $(PS3DEV)/ppu/bin/ppu-g++$(EXE_EXT)
153   AR = $(PS3DEV)/ppu/bin/ppu-ar$(EXE_EXT)
154   CFLAGS += -DMSB_FIRST=1
155	STATIC_LINKING = 1
156else ifeq ($(platform), ps2)
157   TARGET := $(TARGET_NAME)_libretro_$(platform).a
158   CC =  mips64r5900el-ps2-elf-gcc$(EXE_EXT)
159   CXX =  mips64r5900el-ps2-elf-g++$(EXE_EXT)
160   AR =  mips64r5900el-ps2-elf-ar$(EXE_EXT)
161   CFLAGS += -DGNU_SOURCE=1 -G0 -DABGR1555
162   STATIC_LINKING = 1
163   SINGLE_PRECISION_FLOATS = 1
164   MIN_AUDIO_PROCESSING_PER_FRAME = 1
165   FRONTEND_SUPPORTS_RGB565 = 0
166else ifeq ($(platform), psp1)
167   TARGET := $(TARGET_NAME)_libretro_$(platform).a
168   CC = psp-gcc$(EXE_EXT)
169   CXX = psp-g++$(EXE_EXT)
170   AR = psp-ar$(EXE_EXT)
171   CFLAGS += -DGNU_SOURCE=1 -G0 -I$(shell psp-config --pspsdk-path)/include
172   STATIC_LINKING = 1
173   SINGLE_PRECISION_FLOATS = 1
174   MIN_AUDIO_PROCESSING_PER_FRAME = 1
175
176else ifeq ($(platform), vita)
177   TARGET := $(TARGET_NAME)_libretro_$(platform).a
178	CC = arm-vita-eabi-gcc$(EXE_EXT)
179	CXX = arm-vita-eabi-g++$(EXE_EXT)
180	AR = arm-vita-eabi-ar$(EXE_EXT)
181   CFLAGS += -DGNU_SOURCE=1
182   STATIC_LINKING = 1
183   SINGLE_PRECISION_FLOATS = 1
184   MIN_AUDIO_PROCESSING_PER_FRAME = 1
185else ifeq ($(platform), ctr)
186   TARGET := $(TARGET_NAME)_libretro_$(platform).a
187   CC = $(DEVKITARM)/bin/arm-none-eabi-gcc$(EXE_EXT)
188   CXX = $(DEVKITARM)/bin/arm-none-eabi-g++$(EXE_EXT)
189   AR = $(DEVKITARM)/bin/arm-none-eabi-ar$(EXE_EXT)
190   CFLAGS += -DARM11 -D_3DS -DGNU_SOURCE=1
191   #workaround the sdl sizeof(enum)=sizeof(int) assert
192   CFLAGS += -D__NDS__
193   CFLAGS += -march=armv6k -mtune=mpcore -mfloat-abi=hard
194   CFLAGS += -mword-relocations
195   CFLAGS += -fomit-frame-pointer -fstrict-aliasing -ffast-math
196   CFLAGS += -fno-rtti -fno-exceptions -std=gnu++11
197   STATIC_LINKING = 1
198   SINGLE_PRECISION_FLOATS = 1
199   MIN_AUDIO_PROCESSING_PER_FRAME = 1
200else ifeq ($(platform), rpi1)
201   TARGET := $(TARGET_NAME)_libretro.so
202   fpic := -fPIC
203   SHARED := -shared -Wl,--version-script=$(CORE_DIR)/libretro/link.T -Wl,-no-undefined
204   CFLAGS += -DARM -DGNU_SOURCE=1
205   CFLAGS += -marm -march=armv6j -mfpu=vfp -mfloat-abi=hard
206   CFLAGS += -fomit-frame-pointer -fstrict-aliasing
207   CFLAGS += -fno-rtti -fno-exceptions -std=gnu++11
208   SINGLE_PRECISION_FLOATS = 1
209   MIN_AUDIO_PROCESSING_PER_FRAME = 1
210   HAVE_NEON = 1
211else ifeq ($(platform), rpi2)
212   TARGET := $(TARGET_NAME)_libretro.so
213   fpic := -fPIC
214   SHARED := -shared -Wl,--version-script=$(CORE_DIR)/libretro/link.T -Wl,-no-undefined
215   CFLAGS += -DARM -DGNU_SOURCE=1
216   CFLAGS += -marm -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
217   CFLAGS += -fomit-frame-pointer -fstrict-aliasing
218   CFLAGS += -fno-rtti -fno-exceptions -std=gnu++11
219   SINGLE_PRECISION_FLOATS = 1
220   MIN_AUDIO_PROCESSING_PER_FRAME = 1
221   HAVE_NEON = 1
222else ifeq ($(platform), rpi3)
223   TARGET := $(TARGET_NAME)_libretro.so
224   fpic := -fPIC
225   SHARED := -shared -Wl,--version-script=$(CORE_DIR)/libretro/link.T -Wl,-no-undefined
226   CFLAGS += -DARM -DGNU_SOURCE=1
227   CFLAGS += -marm -mcpu=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard
228   CFLAGS += -fomit-frame-pointer -fstrict-aliasing
229   CFLAGS += -fno-rtti -fno-exceptions -std=gnu++11
230   SINGLE_PRECISION_FLOATS = 1
231   MIN_AUDIO_PROCESSING_PER_FRAME = 1
232   HAVE_NEON = 1
233else ifeq ($(platform), rpi3_64)
234   TARGET := $(TARGET_NAME)_libretro.so
235   fpic := -fPIC
236   SHARED := -shared -Wl,--version-script=$(CORE_DIR)/libretro/link.T -Wl,-no-undefined
237   CFLAGS += -DARM -DGNU_SOURCE=1
238   CFLAGS += -march=armv8-a+crc -mtune=cortex-a53
239   CFLAGS += -fomit-frame-pointer -fstrict-aliasing
240   CFLAGS += -fno-rtti -fno-exceptions -std=gnu++11
241   SINGLE_PRECISION_FLOATS = 1
242   MIN_AUDIO_PROCESSING_PER_FRAME = 1
243   HAVE_NEON = 1
244else ifeq ($(platform), rpi4_64)
245   TARGET := $(TARGET_NAME)_libretro.so
246   fpic := -fPIC
247   SHARED := -shared -Wl,--version-script=$(CORE_DIR)/libretro/link.T -Wl,-no-undefined
248   CFLAGS += -DARM -DGNU_SOURCE=1
249   CFLAGS += -march=armv8-a+crc+simd -mtune=cortex-a72
250   CFLAGS += -fomit-frame-pointer -fstrict-aliasing
251   CFLAGS += -fno-rtti -fno-exceptions -std=gnu++11
252   SINGLE_PRECISION_FLOATS = 1
253   MIN_AUDIO_PROCESSING_PER_FRAME = 1
254   HAVE_NEON = 1
255else ifeq ($(platform), xenon)
256   TARGET := $(TARGET_NAME)_libretro_xenon360.a
257   CC = xenon-gcc$(EXE_EXT)
258   CXX = xenon-g++$(EXE_EXT)
259   AR = xenon-ar$(EXE_EXT)
260   CFLAGS += -D__LIBXENON__ -D__ppc_ -DMSB_FIRST=1
261	STATIC_LINKING = 1
262else ifeq ($(platform), dos)
263   TARGET := $(TARGET_NAME)_libretro_djgpp.a
264   CC = i586-pc-msdosdjgpp-gcc$(EXE_EXT)
265   CXX = i586-pc-msdosdjgpp-g++$(EXE_EXT)
266   AR = i586-pc-msdosdjgpp-ar$(EXE_EXT)
267   STATIC_LINKING=1
268   STATIC_LINKING_LINK=1
269else ifeq ($(platform), ngc)
270   TARGET := $(TARGET_NAME)_libretro_$(platform).a
271   CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
272   CXX = $(DEVKITPPC)/bin/powerpc-eabi-g++$(EXE_EXT)
273   AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT)
274   CFLAGS += -DGEKKO -DHW_DOL -mrvl -mcpu=750 -meabi -mhard-float -DMSB_FIRST=1
275   CFLAGS += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int
276	STATIC_LINKING = 1
277
278else ifeq ($(platform), wii)
279   TARGET := $(TARGET_NAME)_libretro_$(platform).a
280   CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
281   CXX = $(DEVKITPPC)/bin/powerpc-eabi-g++$(EXE_EXT)
282   AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT)
283   CFLAGS += -DGEKKO -DHW_RVL -mrvl -mcpu=750 -meabi -mhard-float -DMSB_FIRST=1
284   CFLAGS += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int
285	STATIC_LINKING = 1
286
287else ifeq ($(platform), wiiu)
288   TARGET := $(TARGET_NAME)_libretro_$(platform).a
289   CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
290   CXX = $(DEVKITPPC)/bin/powerpc-eabi-g++$(EXE_EXT)
291   AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT)
292   CFLAGS += -DGEKKO -DWIIU -DHW_RVL -mwup -mcpu=750 -meabi -mhard-float -DMSB_FIRST=1
293   CFLAGS += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int
294	STATIC_LINKING = 1
295
296# Nintendo Switch (libtransistor)
297else ifeq ($(platform), switch)
298	EXT=a
299        TARGET := $(TARGET_NAME)_libretro_$(platform).$(EXT)
300        include $(LIBTRANSISTOR_HOME)/libtransistor.mk
301        STATIC_LINKING=1
302
303else ifeq ($(platform),emscripten)
304   TARGET := $(TARGET_NAME)_libretro_$(platform).bc
305	STATIC_LINKING = 1
306   SINGLE_PRECISION_FLOATS = 1
307   MIN_AUDIO_PROCESSING_PER_FRAME = 1
308
309# Nintendo Switch (libnx)
310else ifeq ($(platform), libnx)
311include $(DEVKITPRO)/libnx/switch_rules
312    EXT=a
313    TARGET := $(TARGET_NAME)_libretro_$(platform).$(EXT)
314    DEFINES := -DSWITCH=1 -U__linux__ -U__linux -DRARCH_INTERNAL
315    CFLAGS  :=  $(DEFINES) -g \
316                -O2 \
317            -fPIE -I$(LIBNX)/include/ -ffunction-sections -fdata-sections -ftls-model=local-exec -Wl,--allow-multiple-definition -specs=$(LIBNX)/switch.specs
318    CFLAGS += $(INCDIRS)
319    CFLAGS  += $(INCLUDE)  -D__SWITCH__ -DHAVE_LIBNX
320    CXXFLAGS := $(ASFLAGS) $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
321    CFLAGS += -std=gnu11
322    STATIC_LINKING = 1
323
324else ifneq (,$(findstring armv,$(platform)))
325   TARGET := $(TARGET_NAME)_libretro.so
326   fpic := -fPIC
327   SHARED := -shared -Wl,--version-script=$(CORE_DIR)/libretro/link.T -Wl,-no-undefined
328   CFLAGS += -D_GNU_SOURCE=1
329ifneq (,$(findstring cortexa8,$(platform)))
330   CFLAGS += -marm -mcpu=cortex-a8
331else ifneq (,$(findstring cortexa9,$(platform)))
332   CFLAGS += -marm -mcpu=cortex-a9
333endif
334   CFLAGS += -marm
335ifneq (,$(findstring neon,$(platform)))
336   CFLAGS += -mfpu=neon
337   HAVE_NEON = 1
338endif
339ifneq (,$(findstring softfloat,$(platform)))
340   CFLAGS += -mfloat-abi=softfp
341else ifneq (,$(findstring hardfloat,$(platform)))
342   CFLAGS += -mfloat-abi=hard
343endif
344   CFLAGS += -DARM
345# Windows MSVC 2003 Xbox 1
346else ifeq ($(platform), xbox1_msvc2003)
347TARGET := $(TARGET_NAME)_libretro_xdk1.lib
348CC  = CL.exe
349CXX  = CL.exe
350LD   = lib.exe
351
352export INCLUDE := $(XDK)/xbox/include
353export LIB := $(XDK)/xbox/lib
354PATH := $(call unixcygpath,$(XDK)/xbox/bin/vc71):$(PATH)
355PSS_STYLE :=2
356CFLAGS   += -D_XBOX -D_XBOX1
357CXXFLAGS += -D_XBOX -D_XBOX1
358STATIC_LINKING=1
359HAS_GCC := 0
360# Windows MSVC 2010 Xbox 360
361else ifeq ($(platform), xbox360_msvc2010)
362TARGET := $(TARGET_NAME)_libretro_xdk360.lib
363MSVCBINDIRPREFIX = $(XEDK)/bin/win32
364CC  = "$(MSVCBINDIRPREFIX)/cl.exe"
365CXX  = "$(MSVCBINDIRPREFIX)/cl.exe"
366LD   = "$(MSVCBINDIRPREFIX)/lib.exe"
367
368export INCLUDE := $(XEDK)/include/xbox
369export LIB := $(XEDK)/lib/xbox
370PSS_STYLE :=2
371CFLAGS   += -D_XBOX -D_XBOX360
372CXXFLAGS += -D_XBOX -D_XBOX360
373STATIC_LINKING=1
374HAS_GCC := 0
375
376# Windows MSVC 2010 x64
377else ifeq ($(platform), windows_msvc2010_x64)
378	LIBS=
379	CC  = cl.exe
380	CXX = cl.exe
381
382PATH := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/bin/amd64"):$(PATH)
383PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../IDE")
384LIB := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/lib/amd64")
385INCLUDE := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/include")
386
387WindowsSdkDir := $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')
388WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')
389
390WindowsSDKIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include")
391WindowsSDKGlIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\gl")
392WindowsSDKLibDir := $(shell cygpath -w "$(WindowsSdkDir)\Lib\x64")
393
394INCFLAGS_PLATFORM = -I"$(WindowsSDKIncludeDir)"
395export INCLUDE := $(INCLUDE);$(WindowsSDKIncludeDir);$(WindowsSDKGlIncludeDir)
396export LIB := $(LIB);$(WindowsSDKLibDir)
397TARGET := $(TARGET_NAME)_libretro.dll
398PSS_STYLE :=2
399LDFLAGS += -DLL
400LIBS =
401# Windows MSVC 2010 x86
402else ifeq ($(platform), windows_msvc2010_x86)
403	LIBS=
404	CC  = cl.exe
405	CXX = cl.exe
406
407PATH := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/bin"):$(PATH)
408PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../IDE")
409LIB := $(shell IFS=$$'\n'; cygpath -w "$(VS100COMNTOOLS)../../VC/lib")
410INCLUDE := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/include")
411
412WindowsSdkDir := $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')
413WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')
414
415WindowsSDKIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include")
416WindowsSDKGlIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\gl")
417WindowsSDKLibDir := $(shell cygpath -w "$(WindowsSdkDir)\Lib")
418
419INCFLAGS_PLATFORM = -I"$(WindowsSDKIncludeDir)"
420export INCLUDE := $(INCLUDE);$(WindowsSDKIncludeDir);$(WindowsSDKGlIncludeDir)
421export LIB := $(LIB);$(WindowsSDKLibDir)
422TARGET := $(TARGET_NAME)_libretro.dll
423PSS_STYLE :=2
424LDFLAGS += -DLL
425LIBS =
426
427# Windows MSVC 2005 x86
428else ifeq ($(platform), windows_msvc2005_x86)
429	CC  = cl.exe
430	CXX = cl.exe
431	HAS_GCC := 0
432
433PATH := $(shell IFS=$$'\n'; cygpath "$(VS80COMNTOOLS)../../VC/bin"):$(PATH)
434PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS80COMNTOOLS)../IDE")
435INCLUDE := $(shell IFS=$$'\n'; cygpath "$(VS80COMNTOOLS)../../VC/include")
436LIB := $(shell IFS=$$'\n'; cygpath -w "$(VS80COMNTOOLS)../../VC/lib")
437BIN := $(shell IFS=$$'\n'; cygpath "$(VS80COMNTOOLS)../../VC/bin")
438
439WindowsSdkDir := $(shell reg query "HKLM\SOFTWARE\Microsoft\MicrosoftSDK\InstalledSDKs\8F9E5EF3-A9A5-491B-A889-C58EFFECE8B3" -v "Install Dir" | grep -o '[A-Z]:\\.*')
440
441WindowsSDKIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include")
442WindowsSDKAtlIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\atl")
443WindowsSDKCrtIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\crt")
444WindowsSDKGlIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\gl")
445WindowsSDKMfcIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\mfc")
446WindowsSDKLibDir := $(shell cygpath -w "$(WindowsSdkDir)\Lib")
447
448export INCLUDE := $(INCLUDE);$(WindowsSDKIncludeDir);$(WindowsSDKAtlIncludeDir);$(WindowsSDKCrtIncludeDir);$(WindowsSDKGlIncludeDir);$(WindowsSDKMfcIncludeDir);nxengine/libretro/libretro-common/include/compat/msvc
449export LIB := $(LIB);$(WindowsSDKLibDir)
450TARGET := $(TARGET_NAME)_libretro.dll
451PSS_STYLE :=2
452LDFLAGS += -DLL
453CFLAGS += -D_CRT_SECURE_NO_DEPRECATE
454LIBS =
455
456# Windows MSVC 2003 x86
457else ifeq ($(platform), windows_msvc2003_x86)
458	CC  = cl.exe
459	CXX = cl.exe
460
461PATH := $(shell IFS=$$'\n'; cygpath "$(VS71COMNTOOLS)../../Vc7/bin"):$(PATH)
462PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS71COMNTOOLS)../IDE")
463INCLUDE := $(shell IFS=$$'\n'; cygpath "$(VS71COMNTOOLS)../../Vc7/include")
464LIB := $(shell IFS=$$'\n'; cygpath -w "$(VS71COMNTOOLS)../../Vc7/lib")
465BIN := $(shell IFS=$$'\n'; cygpath "$(VS71COMNTOOLS)../../Vc7/bin")
466
467WindowsSdkDir := $(INETSDK)
468
469export INCLUDE := $(INCLUDE);$(INETSDK)/Include;src/drivers/libretro/msvc/msvc-2005
470export LIB := $(LIB);$(WindowsSdkDir);$(INETSDK)/Lib
471TARGET := $(TARGET_NAME)_libretro.dll
472PSS_STYLE :=2
473LDFLAGS += -DLL
474CFLAGS += -D_CRT_SECURE_NO_DEPRECATE
475
476# Windows MSVC 2017 all architectures
477else ifneq (,$(findstring windows_msvc2017,$(platform)))
478
479    NO_GCC := 1
480    CFLAGS += -DNOMINMAX
481    CXXFLAGS += -DNOMINMAX
482    WINDOWS_VERSION = 1
483
484	PlatformSuffix = $(subst windows_msvc2017_,,$(platform))
485	ifneq (,$(findstring desktop,$(PlatformSuffix)))
486		WinPartition = desktop
487		MSVC2017CompileFlags = -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -FS
488		LDFLAGS += -MANIFEST -LTCG:incremental -NXCOMPAT -DYNAMICBASE -DEBUG -OPT:REF -INCREMENTAL:NO -SUBSYSTEM:WINDOWS -MANIFESTUAC:"level='asInvoker' uiAccess='false'" -OPT:ICF -ERRORREPORT:PROMPT -NOLOGO -TLBID:1
489		LIBS += kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib
490	else ifneq (,$(findstring uwp,$(PlatformSuffix)))
491		WinPartition = uwp
492		MSVC2017CompileFlags = -DWINAPI_FAMILY=WINAPI_FAMILY_APP -D_WINDLL -D_UNICODE -DUNICODE -D__WRL_NO_DEFAULT_LIB__ -EHsc -FS
493		LDFLAGS += -APPCONTAINER -NXCOMPAT -DYNAMICBASE -MANIFEST:NO -LTCG -OPT:REF -SUBSYSTEM:CONSOLE -MANIFESTUAC:NO -OPT:ICF -ERRORREPORT:PROMPT -NOLOGO -TLBID:1 -DEBUG:FULL -WINMD:NO
494		LIBS += WindowsApp.lib
495	endif
496
497	CFLAGS += $(MSVC2017CompileFlags)
498	CXXFLAGS += $(MSVC2017CompileFlags)
499
500	TargetArchMoniker = $(subst $(WinPartition)_,,$(PlatformSuffix))
501
502	CC  = cl.exe
503	CXX = cl.exe
504	LD = link.exe
505
506	reg_query = $(call filter_out2,$(subst $2,,$(shell reg query "$2" -v "$1" 2>nul)))
507	fix_path = $(subst $(SPACE),\ ,$(subst \,/,$1))
508
509	ProgramFiles86w := $(shell cmd //c "echo %PROGRAMFILES(x86)%")
510	ProgramFiles86 := $(shell cygpath "$(ProgramFiles86w)")
511
512	WindowsSdkDir ?= $(call reg_query,InstallationFolder,HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0)
513	WindowsSdkDir ?= $(call reg_query,InstallationFolder,HKEY_CURRENT_USER\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0)
514	WindowsSdkDir ?= $(call reg_query,InstallationFolder,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0)
515	WindowsSdkDir ?= $(call reg_query,InstallationFolder,HKEY_CURRENT_USER\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0)
516	WindowsSdkDir := $(WindowsSdkDir)
517
518	WindowsSDKVersion ?= $(firstword $(foreach folder,$(subst $(subst \,/,$(WindowsSdkDir)Include/),,$(wildcard $(call fix_path,$(WindowsSdkDir)Include\*))),$(if $(wildcard $(call fix_path,$(WindowsSdkDir)Include/$(folder)/um/Windows.h)),$(folder),)))$(BACKSLASH)
519	WindowsSDKVersion := $(WindowsSDKVersion)
520
521	VsInstallBuildTools = $(ProgramFiles86)/Microsoft Visual Studio/2017/BuildTools
522	VsInstallEnterprise = $(ProgramFiles86)/Microsoft Visual Studio/2017/Enterprise
523	VsInstallProfessional = $(ProgramFiles86)/Microsoft Visual Studio/2017/Professional
524	VsInstallCommunity = $(ProgramFiles86)/Microsoft Visual Studio/2017/Community
525
526	VsInstallRoot ?= $(shell if [ -d "$(VsInstallBuildTools)" ]; then echo "$(VsInstallBuildTools)"; fi)
527	ifeq ($(VsInstallRoot), )
528		VsInstallRoot = $(shell if [ -d "$(VsInstallEnterprise)" ]; then echo "$(VsInstallEnterprise)"; fi)
529	endif
530	ifeq ($(VsInstallRoot), )
531		VsInstallRoot = $(shell if [ -d "$(VsInstallProfessional)" ]; then echo "$(VsInstallProfessional)"; fi)
532	endif
533	ifeq ($(VsInstallRoot), )
534		VsInstallRoot = $(shell if [ -d "$(VsInstallCommunity)" ]; then echo "$(VsInstallCommunity)"; fi)
535	endif
536	VsInstallRoot := $(VsInstallRoot)
537
538	VcCompilerToolsVer := $(shell cat "$(VsInstallRoot)/VC/Auxiliary/Build/Microsoft.VCToolsVersion.default.txt" | grep -o '[0-9\.]*')
539	VcCompilerToolsDir := $(VsInstallRoot)/VC/Tools/MSVC/$(VcCompilerToolsVer)
540
541	WindowsSDKSharedIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\$(WindowsSDKVersion)\shared")
542	WindowsSDKUCRTIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\$(WindowsSDKVersion)\ucrt")
543	WindowsSDKUMIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\$(WindowsSDKVersion)\um")
544	WindowsSDKUCRTLibDir := $(shell cygpath -w "$(WindowsSdkDir)\Lib\$(WindowsSDKVersion)\ucrt\$(TargetArchMoniker)")
545	WindowsSDKUMLibDir := $(shell cygpath -w "$(WindowsSdkDir)\Lib\$(WindowsSDKVersion)\um\$(TargetArchMoniker)")
546
547	# For some reason the HostX86 compiler doesn't like compiling for x64
548	# ("no such file" opening a shared library), and vice-versa.
549	# Work around it for now by using the strictly x86 compiler for x86, and x64 for x64.
550	# NOTE: What about ARM?
551	ifneq (,$(findstring x64,$(TargetArchMoniker)))
552		VCCompilerToolsBinDir := $(VcCompilerToolsDir)\bin\HostX64
553	else
554		VCCompilerToolsBinDir := $(VcCompilerToolsDir)\bin\HostX86
555	endif
556
557	PATH := $(shell IFS=$$'\n'; cygpath "$(VCCompilerToolsBinDir)/$(TargetArchMoniker)"):$(PATH)
558	PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VsInstallRoot)/Common7/IDE")
559	INCLUDE := $(shell IFS=$$'\n'; cygpath -w "$(VcCompilerToolsDir)/include")
560	LIB := $(shell IFS=$$'\n'; cygpath -w "$(VcCompilerToolsDir)/lib/$(TargetArchMoniker)")
561	ifneq (,$(findstring uwp,$(PlatformSuffix)))
562		LIB := $(shell IFS=$$'\n'; cygpath -w "$(LIB)/store")
563	endif
564
565	export INCLUDE := $(INCLUDE);$(WindowsSDKSharedIncludeDir);$(WindowsSDKUCRTIncludeDir);$(WindowsSDKUMIncludeDir)
566	export LIB := $(LIB);$(WindowsSDKUCRTLibDir);$(WindowsSDKUMLibDir)
567	TARGET := $(TARGET_NAME)_libretro.dll
568	PSS_STYLE :=2
569	LDFLAGS += -DLL
570
571# Windows
572else
573   TARGET := $(TARGET_NAME)_libretro.dll
574   CC ?= gcc
575   SHARED := -shared -static-libgcc -static-libstdc++ -s -Wl,--version-script=$(CORE_DIR)/libretro/link.T
576   CFLAGS += -D__WIN32__ -Wno-missing-field-initializers
577endif
578
579ifeq ($(DEBUG), 1)
580ifneq (,$(findstring msvc,$(platform)))
581   CFLAGS   += -MTd
582   CXXFLAGS += -MTd
583   CFLAGS   += -Od -Zi -DDEBUG -D_DEBUG
584   CXXFLAGS += -Od -Zi -DDEBUG -D_DEBUG
585else
586   CFLAGS   += -O0 -g -DDEBUG
587   CXXFLAGS += -O0 -g -DDEBUG
588endif
589else
590ifneq (,$(findstring msvc,$(platform)))
591   CFLAGS   += -MT
592   CXXFLAGS += -MT
593endif
594   CFLAGS   += -O2 -DNDEBUG
595   CXXFLAGS += -O2 -DNDEBUG
596endif
597
598ifeq ($(RELEASE_BUILD), 1)
599CFLAGS += -DRELEASE_BUILD
600endif
601
602ifeq ($(SINGLE_PRECISION_FLOATS), 1)
603CFLAGS += -DSINGLE_PRECISION_FLOATS
604endif
605
606ifeq ($(MIN_AUDIO_PROCESSING_PER_FRAME), 1)
607CFLAGS += -DMIN_AUDIO_PROCESSING_PER_FRAME
608endif
609
610ifeq ($(DEBUGLOG), 1)
611CFLAGS += -DDEBUG_LOG=1
612endif
613
614ifeq ($(FRONTEND_SUPPORTS_RGB565), 1)
615CFLAGS += -DFRONTEND_SUPPORTS_RGB565
616endif
617
618include Makefile.common
619
620ifneq (,$(findstring msvc2003,$(platform)))
621INCFLAGS += -I$(LIBRETRO_COMM_DIR)/include/compat/msvc
622endif
623
624OBJECTS := $(SOURCES_CXX:.cpp=.o) $(SOURCES_C:.c=.o)
625
626DEFINES := -DHAVE_INTTYPES_H -D__LIBRETRO__
627
628ifneq (,$(findstring msvc,$(platform)))
629DEFINES += -DINLINE="_inline"
630else
631DEFINES += -DINLINE="inline"
632endif
633
634ifneq (,$(findstring msvc,$(platform)))
635WARNINGS_DEFINES =
636CODE_DEFINES =
637else
638WARNINGS_DEFINES = -Wall -W -Wno-unused-parameter
639CODE_DEFINES =
640endif
641
642ifeq ($(platform), osx)
643ifndef ($(NOUNIVERSAL))
644   CFLAGS += $(ARCHFLAGS)
645	CXXFLAGS += $(ARCHFLAGS)
646   LFLAGS += $(ARCHFLAGS)
647endif
648endif
649
650COMMON_DEFINES += $(CODE_DEFINES) $(WARNINGS_DEFINES) $(fpic) $(INCFLAGS) $(INCFLAGS_PLATFORM)
651
652CFLAGS     += $(DEFINES) $(COMMON_DEFINES)
653
654OBJOUT   = -o
655LINKOUT  = -o
656
657ifneq (,$(findstring msvc,$(platform)))
658	OBJOUT = -Fo
659	LINKOUT = -out:
660ifeq ($(STATIC_LINKING),1)
661	LD ?= lib.exe
662	STATIC_LINKING=0
663else
664	LD = link.exe
665endif
666else
667	LD = $(CXX)
668endif
669
670%.o: %.c
671	$(CC) $(CFLAGS) -c $(OBJOUT)$@ $<
672
673%.o: %.cpp
674	$(CXX) $(CFLAGS) -c $(OBJOUT)$@ $<
675
676ifeq ($(platform), theos_ios)
677COMMON_FLAGS := -DIOS -DARM $(COMMON_DEFINES) -I$(THEOS_INCLUDE_PATH) -Wno-error
678$(LIBRARY_NAME)_CFLAGS += $(CFLAGS) $(COMMON_FLAGS)
679$(LIBRARY_NAME)_CXXFLAGS += $(CXXFLAGS) $(COMMON_FLAGS)
680${LIBRARY_NAME}_FILES = $(SOURCES_CXX) $(SOURCES_C)
681include $(THEOS_MAKE_PATH)/library.mk
682else
683all: $(TARGET)
684
685$(TARGET): $(OBJECTS)
686ifeq ($(STATIC_LINKING), 1)
687	$(AR) rcs $@ $(OBJECTS)
688else
689	$(LD) $(fpic) $(SHARED) $(LDFLAGS) $(LINKOUT)$@ $(OBJECTS) $(LIBS)
690endif
691
692
693clean:
694	rm -f $(OBJECTS) $(TARGET)
695
696cleandata:
697	rm -f wavetable.dat
698	rm -f stage.dat
699	rm -f settings.dat
700	rm -rf pxt
701	rm -rf org
702	rm -rf endpic
703
704.PHONY: clean
705endif
706