Homebrew RELEASE Development Thread - RetroArch libnx

  • Thread starter m4xw
  • Start date
  • Views 676,844
  • Replies 4,272
  • Likes 69
Status
Not open for further replies.

zaz3300

Member
Newcomer
Joined
Jun 10, 2018
Messages
8
Trophies
0
Age
41
XP
81
Country
United States
btw thank you so much @m4xw for working so hard on this. I've been watching you guys work on this nonstop since may 29th and it blows my mind how much dedication you all have to getting this working! Keep it up and good luck!
 
  • Like
Reactions: m4xw

m4xw

Ancient Deity
OP
Developer
Joined
May 25, 2018
Messages
2,442
Trophies
1
Age
119
XP
6,960
Country
Germany
btw thank you so much @m4xw for working so hard on this. I've been watching you guys work on this nonstop since may 29th and it blows my mind how much dedication you all have to getting this working! Keep it up and good luck!
I've been working on this 90% of my free time for 2 weeks. It's time for a break soon, but I still wanna get stuff finished before I gtfo for a few days or so.

Worst is most of the time was spent debugging, 80% of the code was written in like 2 days lol
 

zaz3300

Member
Newcomer
Joined
Jun 10, 2018
Messages
8
Trophies
0
Age
41
XP
81
Country
United States
I've been working on this 90% of my free time for 2 weeks. It's time for a break soon, but I still wanna get stuff finished before I gtfo for a few days or so.

Worst is most of the time was spent debugging, 80% of the code was written in like 2 days lol
You definitely deserve that break lol. Enjoy it!
 
  • Like
Reactions: m4xw

CatmanFan

Anxious and regretful
Member
Joined
Aug 14, 2016
Messages
1,965
Trophies
0
Website
www.youtube.com
XP
2,615
Country
Morocco
I just had the crazy idea of running Philips CDi (of all consoles) via MAME.
The problem is, I think CDi is only supported on the singular MAME-libretro core, not the MAME 2003 or other stuff, AFAIK, so we might have to compile a brand new core just to get our "favorite" Zelda/Hotel Mario games on the Switch. Either that or there's some kind of workaround...
 

SeongGino

The Average One
Member
Joined
May 20, 2015
Messages
939
Trophies
0
Age
25
Location
Jersey, Jersey
Website
www.twitter.com
XP
1,932
Country
United States
I just had the crazy idea of running Philips CDi (of all consoles) via MAME.
The problem is, I think CDi is only supported on the singular MAME-libretro core, not the MAME 2003 or other stuff, AFAIK, so we might have to compile a brand new core just to get our "favorite" Zelda/Hotel Mario games on the Switch. Either that or there's some kind of workaround...

MESS or MAME (2016)+ is what you're looking for.
 

SeongGino

The Average One
Member
Joined
May 20, 2015
Messages
939
Trophies
0
Age
25
Location
Jersey, Jersey
Website
www.twitter.com
XP
1,932
Country
United States
Welp, that would be barely possible.
Still, I'm already debating which one is easier to compile for Switch.

MAME itself already has an ARM port. Go right ahead, I guess.
But it's not going to be anywhere near as straightforward as any other core thus far, you might just need to let someone else take it from here.
 

9thSage

Well-Known Member
Member
Joined
Aug 8, 2008
Messages
457
Trophies
0
XP
587
Country
United States
I've been working on this 90% of my free time for 2 weeks. It's time for a break soon, but I still wanna get stuff finished before I gtfo for a few days or so.

Worst is most of the time was spent debugging, 80% of the code was written in like 2 days lol
Well, for what it's worth, thank you for the time you've spent working on this...(same for everyone porting cores as well). Early days yet but it's already better than the LibTransistor version in my opinion.
 

Leonidas87

Well-Known Member
Member
Joined
Jul 15, 2014
Messages
651
Trophies
0
Location
Toronto, Ontario
Website
www.youtube.com
XP
960
Country
Canada
2 different set of API's to interface with the switch as well as 2 different toolchains(f.e gcc/g++ compiler on libnx and clang libtransistor)
Both have a different coding style, different stability and a different feature set, but it comes down to the same goal.

Forced Fullscreen + Threaded build, use as is:
https://git.m4xw.net/Switch/RetroArch/VBA-Next/-/jobs/563/artifacts/download
https://git.m4xw.net/Switch/RetroArch/libretro-snes9x2010/-/jobs/565/artifacts/download

These should hopefully not crash, but will bug out in docked, but it will not crash (fine in handheld so far).

Hello everyone great progress the last 2 days on the emulators along with compatability, stability and bringing a few extra cores to the switch.

I have two TEST configuration files which are based of these two builds of VBA and SNES9X2010. THEY HAVE BEEN TESTED EXTENSIVELY AND WORK WELL WITH THREADING+FULL SCREEN

SNES:
Rewind= Left on RIGHT JOYSTICK

Fast forward= Right on the RIGHT JOTSTICK

Start Directory= switch/roms/snes

CLEANED UP MENUE UI A LOT EASIER ON THE EYES

SNES TEST CONFIG FILE:
https://mega.nz/#F!7cwkRbiJ!BCoz8Fbo5W8ER4iooBhWMQ


VBA:
Rewind= Left on RIGHT JOYSTICK

Slow Motion= Down on the RIGHT JOYSTICK

Fast forward= Right on the RIGHT JOTSTICK

Start Directory= switch/roms/gba

CLEANED UP MENUE UI A LOT EASIER ON THE EYES

VBA TEST CONFIG FILE:
https://mega.nz/#F!zNZxhJpZ!fquP3Ks5hnYGzYyffo2OyQ


I do apologize for my absence, remember these are TEST CONFIG FILES FOR SNES9X2010 AND VBA.

All the best to all the contributors and work by everyone expecially @m4xw

Have fun hope yous all enjoy, if you like the TEST config files maybe they will end up as an alternative download on the OP
 
Last edited by Leonidas87,
  • Like
Reactions: ShadyGame

CatmanFan

Anxious and regretful
Member
Joined
Aug 14, 2016
Messages
1,965
Trophies
0
Website
www.youtube.com
XP
2,615
Country
Morocco
So I checked out the Makefiles of MAME 2016 and compared them to MAME 2003 libNX, and I'm not even sure where to put the LibNX makefile code as a whole without splitting it up into parts. Can anyone look into these overly long codes and get an idea of where to put it for me plz? Maybe in the Makefile.libretro file?
Code:
###########################################################################
#
#   makefile
#
#   Core makefile for building MAME and derivatives
#
###########################################################################



###########################################################################
#################   BEGIN USER-CONFIGURABLE OPTIONS   #####################
###########################################################################

# REGENIE = 1
# VERBOSE = 1
# NOWERROR = 1
#
# TARGET = mame
# SUBTARGET = tiny
# TOOLS = 1
# TESTS = 1
# BENCHMARKS = 1
# OSD = sdl

# USE_DISPATCH_GL = 0
# MODERN_WIN_API = 0
# DIRECTINPUT = 7
# USE_SDL = 1
# SDL_INI_PATH = .;$HOME/.mame/;ini;
# SDL2_MULTIAPI = 1
# NO_USE_MIDI = 1
# DONT_USE_NETWORK = 1
# USE_QTDEBUG = 1
# NO_X11 = 1
# NO_USE_XINPUT = 0
# FORCE_DRC_C_BACKEND = 1

# DEBUG = 1
# PROFILER = 1
# SANITIZE = 1

# PTR64 = 1
# BIGENDIAN = 1
# NOASM = 1

# OPTIMIZE = 3
# SYMBOLS = 1
# SYMLEVEL = 2
# MAP = 1
# PROFILE = 1
# ARCHOPTS =
# OPT_FLAGS =
# LDOPTS =

# USE_SYSTEM_LIB_EXPAT = 1
# USE_SYSTEM_LIB_ZLIB = 1
# USE_SYSTEM_LIB_JPEG = 1
# USE_SYSTEM_LIB_FLAC = 1
# USE_SYSTEM_LIB_LUA = 1
# USE_SYSTEM_LIB_SQLITE3 = 1
# USE_SYSTEM_LIB_PORTMIDI = 1
# USE_SYSTEM_LIB_PORTAUDIO = 1
# USE_SYSTEM_LIB_UV = 1
# USE_BUNDLED_LIB_SDL2 = 1

# MESA_INSTALL_ROOT = /opt/mesa
# SDL_INSTALL_ROOT = /opt/sdl2
# SDL_FRAMEWORK_PATH = $(HOME)/Library/Frameworks
# USE_LIBSDL = 1
# CYGWIN_BUILD = 1

# BUILDDIR = build
# TARGETOS = windows
# CROSS_BUILD = 1
# TOOLCHAIN =
# OVERRIDE_CC = cc
# OVERRIDE_CXX = c++
# OVERRIDE_LD = ld

# DEPRECATED = 1
# LTO = 1
# SSE2 = 1
# OPENMP = 1
# FASTDEBUG = 1

# SEPARATE_BIN = 1
# PYTHON_EXECUTABLE = python3
# SHADOW_CHECK = 1
# STRIP_SYMBOLS = 0

# QT_HOME = /usr/lib64/qt48/

# SOURCES = src/mame/drivers/asteroid.cpp,src/mame/audio/llander.cpp

# FORCE_VERSION_COMPILE = 1

# MSBUILD = 1
# USE_LIBUV = 1
# IGNORE_BAD_LOCALISATION=1
# PRECOMPILE = 0

# DEBUG_DIR=c:\test\location
# DEBUG_ARGS= -window -video bgfx

ifdef PREFIX_MAKEFILE
include $(PREFIX_MAKEFILE)
else
-include useroptions.mak
endif

###########################################################################
##################   END USER-CONFIGURABLE OPTIONS   ######################
###########################################################################

MAKEPARAMS := -R

#
# Determine running OS
#

ifeq ($(OS),Windows_NT)
OS := windows
GENIEOS := windows
PLATFORM := x86
else
UNAME := $(shell uname -mps)
UNAME_M := $(shell uname -m)
UNAME_P := $(shell uname -p)
GENIEOS := linux
PLATFORM := unknown
ifneq ($(filter x86_64,$(UNAME_P)),)
PLATFORM := x86
endif
ifneq ($(filter %86,$(UNAME_P)),)
PLATFORM := x86
endif
ifneq ($(filter arm%,$(UNAME_M)),)
PLATFORM := arm
endif
ifneq ($(filter arm%,$(UNAME_P)),)
PLATFORM := arm
endif
ifneq ($(filter aarch64%,$(UNAME_M)),)
PLATFORM := arm64
endif
ifneq ($(filter aarch64%,$(UNAME_P)),)
PLATFORM := arm64
endif
ifneq ($(filter powerpc,$(UNAME_P)),)
PLATFORM := powerpc
endif
ifeq ($(firstword $(filter Linux,$(UNAME))),Linux)
OS := linux
endif
ifeq ($(firstword $(filter Solaris,$(UNAME))),Solaris)
OS := solaris
GENIEOS := solaris
endif
ifeq ($(firstword $(filter SunOS,$(UNAME))),SunOS)
OS := solaris
GENIEOS := solaris
endif
ifeq ($(firstword $(filter FreeBSD,$(UNAME))),FreeBSD)
OS := freebsd
GENIEOS := bsd
endif
ifeq ($(firstword $(filter GNU/kFreeBSD,$(UNAME))),GNU/kFreeBSD)
OS := freebsd
GENIEOS := bsd
endif
ifeq ($(firstword $(filter NetBSD,$(UNAME))),NetBSD)
OS := netbsd
GENIEOS := bsd
endif
ifeq ($(firstword $(filter OpenBSD,$(UNAME))),OpenBSD)
OS := openbsd
GENIEOS := bsd
endif
ifeq ($(firstword $(filter Darwin,$(UNAME))),Darwin)
OS := macosx
GENIEOS := darwin
endif
ifeq ($(firstword $(filter Haiku,$(UNAME))),Haiku)
OS := haiku
endif
ifndef OS
$(error Unable to detect OS from uname -a: $(UNAME))
endif
endif

MINGW:=
ifdef MINGW64
   MINGW := $(MINGW64)
else
   MINGW := $(MINGW32)
endif

#-------------------------------------------------
# specify core target: mame, ldplayer
# specify subtarget: mame, arcade, mess, tiny, etc.
# build scripts will be run from
# scripts/target/$(TARGET)/$(SUBTARGET).lua
#-------------------------------------------------

ifndef TARGET
TARGET := mame
endif

ifndef SUBTARGET
SUBTARGET := $(TARGET)
endif

SUBTARGET_FULL := $(subst -,_,$(SUBTARGET))


CONFIG = release
ifdef DEBUG
CONFIG := debug
endif

ifdef VERBOSE
MAKEPARAMS += verbose=1
else
SILENT := @
MAKEPARAMS += --no-print-directory
endif

ifndef BUILDDIR
BUILDDIR := build
endif

#-------------------------------------------------
# specify OS target, which further differentiates
# the underlying OS; supported values are:
# win32, unix, macosx
#-------------------------------------------------

ifndef TARGETOS

ifeq ($(OS),windows)
TARGETOS := windows
ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
ARCHITECTURE := _x64
endif
ifeq ($(PROCESSOR_ARCHITECTURE),x86)
ARCHITECTURE := _x64
ifeq ($(PROCESSOR_ARCHITEW6432),AMD64)
else
ARCHITECTURE := _x86
endif
endif
else
UNAME    := $(shell uname -mps)
TARGETOS := $(OS)

ARCHITECTURE := _x86

ifeq ($(firstword $(filter x86_64,$(UNAME))),x86_64)
ARCHITECTURE := _x64
endif
ifeq ($(firstword $(filter amd64,$(UNAME))),amd64)
ARCHITECTURE := _x64
endif
ifeq ($(firstword $(filter ppc64,$(UNAME))),ppc64)
ARCHITECTURE := _x64
endif
endif

else
CROSS_BUILD := 1
endif # TARGET_OS

ifdef PTR64
ifeq ($(PTR64),1)
ARCHITECTURE := _x64
else
ARCHITECTURE := _x86
endif
endif

ifeq ($(OS),windows)
ifndef MINGW64
ARCHITECTURE := _x86
endif
ifeq ($(ARCHITECTURE),_x64)
WINDRES  := $(MINGW64)/bin/windres
else
WINDRES  := $(MINGW32)/bin/windres
endif
else
ifeq ($(ARCHITECTURE),_x64)
WINDRES  := $(word 1,$(TOOLCHAIN) x86_64-w64-mingw32-)windres
else
WINDRES  := $(word 1,$(TOOLCHAIN) i686-w64-mingw32-)windres
endif
endif

ifeq ($(findstring arm,$(UNAME)),arm)
ARCHITECTURE :=
ifndef NOASM
   NOASM := 1
endif
endif

ifeq ($(findstring aarch64,$(UNAME)),aarch64)
ARCHITECTURE :=
ifndef NOASM
   NOASM := 1
endif
endif

# Emscripten
ifeq ($(findstring emcc,$(CC)),emcc)
TARGETOS := asmjs
ARCHITECTURE :=
ifndef NOASM
   NOASM := 1
endif
endif

# Autodetect BIGENDIAN
# MacOSX
ifndef BIGENDIAN
ifneq (,$(findstring Power,$(UNAME)))
BIGENDIAN := 1
endif
# Linux
ifneq (,$(findstring ppc,$(UNAME)))
BIGENDIAN := 1
endif
endif # BIGENDIAN

ifndef PYTHON_EXECUTABLE
PYTHON := python
else
PYTHON := $(PYTHON_EXECUTABLE)
endif
CC := $(SILENT)gcc
LD := $(SILENT)g++
CXX:= $(SILENT)g++

#-------------------------------------------------
# specify OSD layer: windows, sdl, etc.
# build scripts will be run from
# scripts/src/osd/$(OSD).lua
#-------------------------------------------------

ifndef OSD

OSD := sdl

ifeq ($(TARGETOS),windows)
OSD := windows
endif

ifeq ($(TARGETOS),linux)
OSD := sdl
endif

ifeq ($(TARGETOS),freebsd)
OSD := sdl
endif

ifeq ($(TARGETOS),netbsd)
OSD := sdl
endif

ifeq ($(TARGETOS),openbsd)
OSD := sdl
endif

ifeq ($(TARGETOS),solaris)
OSD := sdl
endif

ifeq ($(TARGETOS),macosx)
OSD := sdl
endif

ifeq ($(TARGETOS),asmjs)
OSD := sdl
endif
endif

#-------------------------------------------------
# which 3rdparty library to build;
#  link against system (common) library otherwise
#-------------------------------------------------
ifdef USE_SYSTEM_LIB_EXPAT
PARAMS += --with-system-expat='$(USE_SYSTEM_LIB_EXPAT)'
endif

ifdef USE_SYSTEM_LIB_ZLIB
PARAMS += --with-system-zlib='$(USE_SYSTEM_LIB_ZLIB)'
endif

ifdef USE_SYSTEM_LIB_JPEG
PARAMS += --with-system-jpeg='$(USE_SYSTEM_LIB_JPEG)'
endif

ifdef USE_SYSTEM_LIB_FLAC
PARAMS += --with-system-flac='$(USE_SYSTEM_LIB_FLAC)'
endif

ifdef USE_SYSTEM_LIB_LUA
PARAMS += --with-system-lua='$(USE_SYSTEM_LIB_LUA)'
endif

ifdef USE_SYSTEM_LIB_SQLITE3
PARAMS += --with-system-sqlite3='$(USE_SYSTEM_LIB_SQLITE3)'
endif

ifdef USE_SYSTEM_LIB_PORTMIDI
PARAMS += --with-system-portmidi='$(USE_SYSTEM_LIB_PORTMIDI)'
endif

ifdef USE_SYSTEM_LIB_PORTAUDIO
PARAMS += --with-system-portaudio='$(USE_SYSTEM_LIB_PORTAUDIO)'
endif

# reverse logic for this one

ifdef USE_BUNDLED_LIB_SDL2
PARAMS += --with-bundled-sdl2
endif

ifdef USE_SYSTEM_LIB_UV
PARAMS += --with-system-uv='$(USE_SYSTEM_LIB_UV)'
endif

#-------------------------------------------------
# distribution may change things
#-------------------------------------------------

ifeq ($(DISTRO),)
DISTRO := generic
else
ifeq ($(DISTRO),debian-stable)
else
$(error DISTRO $(DISTRO) unknown)
endif
endif

PARAMS+= --distro=$(DISTRO)

ifdef TOOLCHAIN
PARAMS += --TOOLCHAIN='$(TOOLCHAIN)'
endif
ifdef OVERRIDE_CC
PARAMS += --CC='$(OVERRIDE_CC)'
ifndef CROSS_BUILD
CC := $(OVERRIDE_CC)
endif
endif
ifdef OVERRIDE_CXX
PARAMS += --CXX='$(OVERRIDE_CXX)'
ifndef CROSS_BUILD
CXX := $(OVERRIDE_CXX)
endif
endif
ifdef OVERRIDE_LD
PARAMS += --LD='$(OVERRIDE_LD)'
ifndef CROSS_BUILD
LD := $(OVERRIDE_LD)
endif
endif

#-------------------------------------------------
# sanity check the configuration
#-------------------------------------------------

# enable symbols as it is useless without them
ifdef SANITIZE
SYMBOLS = 1
endif

# profiler defaults to on for DEBUG builds
ifdef DEBUG
ifndef PROFILER
PROFILER = 1
endif
endif

# allow gprof profiling as well, which overrides the internal PROFILER
# also enable symbols as it is useless without them
ifdef PROFILE
PROFILER =
SYMBOLS = 1
ifndef SYMLEVEL
SYMLEVEL = 1
endif
endif

# specify a default optimization level if none explicitly stated
ifndef OPTIMIZE
OPTIMIZE = 3
endif

# set the symbols level
ifdef SYMBOLS
ifndef SYMLEVEL
SYMLEVEL = 1
ifdef SOURCES
SYMLEVEL = 2
endif
endif
endif

ifdef TOOLS
ifneq '$(TOOLS)' '0'
PARAMS += --with-tools
endif
endif

ifdef TESTS
ifneq '$(TESTS)' '0'
PARAMS += --with-tests
endif
endif

ifdef BENCHMARKS
ifneq '$(BENCHMARKS)' '0'
PARAMS += --with-benchmarks
endif
endif

ifdef SYMBOLS
PARAMS += --SYMBOLS='$(SYMBOLS)'
endif

ifdef SYMLEVEL
PARAMS += --SYMLEVEL='$(SYMLEVEL)'
endif

ifdef PROFILER
PARAMS += --PROFILER='$(PROFILER)'
endif

ifdef PROFILE
PARAMS += --PROFILE='$(PROFILE)'
endif

ifdef OPTIMIZE
PARAMS += --OPTIMIZE=$(OPTIMIZE)
endif

ifdef SHLIB
PARAMS += --SHLIB=$(SHLIB)
endif

ifdef ARCHOPTS
PARAMS += --ARCHOPTS='$(ARCHOPTS)'
endif

ifdef OPT_FLAGS
PARAMS += --OPT_FLAGS='$(OPT_FLAGS)'
endif

ifdef MAP
PARAMS += --MAP='$(MAP)'
endif

ifdef USE_BGFX
PARAMS += --USE_BGFX='$(USE_BGFX)'
endif

ifdef NOASM
TARGET_PARAMS += --NOASM='$(NOASM)'
endif

ifdef BIGENDIAN
PARAMS += --BIGENDIAN='$(BIGENDIAN)'
endif

ifdef FORCE_DRC_C_BACKEND
PARAMS += --FORCE_DRC_C_BACKEND='$(FORCE_DRC_C_BACKEND)'
endif

ifdef NOWERROR
PARAMS += --NOWERROR='$(NOWERROR)'
endif

ifdef TARGET
PARAMS += --target='$(TARGET)'
endif

ifdef SUBTARGET_FULL
PARAMS += --subtarget='$(SUBTARGET_FULL)'
endif

ifdef OSD
TARGET_PARAMS += --osd='$(OSD)'
endif

ifdef BUILDDIR
PARAMS += --build-dir='$(BUILDDIR)'
endif

ifdef TARGETOS
TARGET_PARAMS += --targetos='$(TARGETOS)'
endif

ifdef DONT_USE_NETWORK
PARAMS += --DONT_USE_NETWORK='$(DONT_USE_NETWORK)'
endif

ifdef USE_DISPATCH_GL
PARAMS += --USE_DISPATCH_GL='$(USE_DISPATCH_GL)'
endif

ifdef NO_USE_MIDI
PARAMS += --NO_USE_MIDI='$(NO_USE_MIDI)'
endif

ifdef USE_QTDEBUG
PARAMS += --USE_QTDEBUG='$(USE_QTDEBUG)'
endif

ifdef MODERN_WIN_API
PARAMS += --MODERN_WIN_API='$(MODERN_WIN_API)'
endif

ifdef DIRECTINPUT
PARAMS += --DIRECTINPUT='$(DIRECTINPUT)'
endif

ifdef USE_SDL
PARAMS += --USE_SDL='$(USE_SDL)'
endif

ifdef SDL_INI_PATH
PARAMS += --SDL_INI_PATH='$(SDL_INI_PATH)'
endif

ifdef CYGWIN_BUILD
PARAMS += --CYGWIN_BUILD='$(CYGWIN_BUILD)'
endif

ifdef MESA_INSTALL_ROOT
PARAMS += --MESA_INSTALL_ROOT='$(MESA_INSTALL_ROOT)'
endif

ifdef NO_X11
PARAMS += --NO_X11='$(NO_X11)'
endif

ifdef NO_USE_XINPUT
PARAMS += --NO_USE_XINPUT='$(NO_USE_XINPUT)'
endif

ifdef SDL_LIBVER
PARAMS += --SDL_LIBVER='$(SDL_LIBVER)'
endif

ifdef SDL2_MULTIAPI
PARAMS += --SDL2_MULTIAPI='$(SDL2_MULTIAPI)'
endif

ifdef SDL_INSTALL_ROOT
PARAMS += --SDL_INSTALL_ROOT='$(SDL_INSTALL_ROOT)'
endif

ifdef SDL_FRAMEWORK_PATH
PARAMS += --SDL_FRAMEWORK_PATH='$(SDL_FRAMEWORK_PATH)'
endif

ifdef USE_LIBSDL
PARAMS += --USE_LIBSDL='$(USE_LIBSDL)'
endif

ifdef LDOPTS
PARAMS += --LDOPTS='$(LDOPTS)'
endif

ifdef LTO
PARAMS += --LTO='$(LTO)'
endif

ifdef DEPRECATED
PARAMS += --DEPRECATED='$(DEPRECATED)'
endif

ifdef SSE2
PARAMS += --SSE2='$(SSE2)'
endif

ifdef OPENMP
PARAMS += --OPENMP='$(OPENMP)'
endif

ifdef FASTDEBUG
PARAMS += --FASTDEBUG='$(FASTDEBUG)'
endif

ifdef SEPARATE_BIN
PARAMS += --SEPARATE_BIN='$(SEPARATE_BIN)'
endif

ifdef PYTHON_EXECUTABLE
PARAMS += --PYTHON_EXECUTABLE='$(PYTHON_EXECUTABLE)'
endif

ifdef SHADOW_CHECK
PARAMS += --SHADOW_CHECK='$(SHADOW_CHECK)'
endif

ifdef STRIP_SYMBOLS
PARAMS += --STRIP_SYMBOLS='$(STRIP_SYMBOLS)'
endif

ifdef QT_HOME
PARAMS += --QT_HOME='$(QT_HOME)'
endif

ifdef SOURCES
PARAMS += --SOURCES='$(SOURCES)'
endif

ifdef FORCE_VERSION_COMPILE
PARAMS += --FORCE_VERSION_COMPILE='$(FORCE_VERSION_COMPILE)'
endif

ifdef PLATFORM
TARGET_PARAMS += --PLATFORM='$(PLATFORM)'
endif

ifdef USE_LIBUV
PARAMS += --USE_LIBUV='$(USE_LIBUV)'
endif

ifdef PRECOMPILE
PARAMS += --precompile='$(PRECOMPILE)'
endif

ifdef DEBUG_DIR
PARAMS += --DEBUG_DIR='$(DEBUG_DIR)'
endif

ifdef DEBUG_ARGS
PARAMS += --DEBUG_ARGS='$(DEBUG_ARGS)'
endif
#-------------------------------------------------
# All scripts
#-------------------------------------------------


SCRIPTS = scripts/genie.lua \
   scripts/src/lib.lua \
   scripts/src/emu.lua \
   scripts/src/machine.lua \
   scripts/src/main.lua \
   scripts/src/3rdparty.lua \
   scripts/src/cpu.lua \
   scripts/src/osd/modules.lua \
   $(wildcard scripts/src/osd/$(OSD)*.lua) \
   scripts/src/sound.lua \
   scripts/src/tools.lua \
   scripts/src/tests.lua \
   scripts/src/benchmarks.lua \
   scripts/src/video.lua \
   scripts/src/bus.lua \
   scripts/src/netlist.lua \
   scripts/toolchain.lua \
   scripts/src/osd/modules.lua \
   $(wildcard src/osd/$(OSD)/$(OSD).mak) \
   $(wildcard src/$(TARGET)/$(SUBTARGET_FULL).mak)

ifeq ($(SUBTARGET_FULL),mame)
SCRIPTS += scripts/target/$(TARGET)/arcade.lua
SCRIPTS += scripts/target/$(TARGET)/mess.lua
endif

ifndef SOURCES
SCRIPTS += scripts/target/$(TARGET)/$(SUBTARGET_FULL).lua
endif

ifdef REGENIE
SCRIPTS+= regenie
endif

#-------------------------------------------------
# Dependent stuff
#-------------------------------------------------

# extension for executables
EXE :=

ifeq ($(OS),windows)
EXE := .exe
endif

SHELLTYPE := msdos
ifeq (,$(ComSpec)$(COMSPEC))
  SHELLTYPE := posix
endif
ifeq (/bin,$(findstring /bin,$(SHELL)))
  SHELLTYPE := posix
endif
ifeq (/bin,$(findstring /bin,$(MAKESHELL)))
  SHELLTYPE := posix
endif

ifeq (posix,$(SHELLTYPE))
  MKDIR = $(SILENT) mkdir -p "$(1)"
  COPY  = $(SILENT) cp -fR "$(1)" "$(2)"
else
  MKDIR = $(SILENT) mkdir "$(subst /,\\,$(1))" 2> nul || exit 0
  COPY  = $(SILENT) copy /Y "$(subst /,\\,$(1))" "$(subst /,\\,$(2))" > nul || exit 0
endif

GENDIR = $(BUILDDIR)/generated

# all sources are under the src/ directory
SRC = src

# all 3rd party sources are under the 3rdparty/ directory
3RDPARTY = 3rdparty
ifeq ($(SUBTARGET_FULL),mame)
PROJECT_NAME := $(SUBTARGET_FULL)
else ifeq ($(SUBTARGET_FULL),mess)
PROJECT_NAME := $(SUBTARGET_FULL)
else
PROJECT_NAME := $(TARGET)$(SUBTARGET_FULL)
endif


ifeq ($(OS),windows)
ifeq (posix,$(SHELLTYPE))
GCC_VERSION      := $(shell $(TOOLCHAIN)$(subst @,,$(CC)) -dumpversion 2> /dev/null)
CLANG_VERSION    := $(shell $(TOOLCHAIN)$(subst @,,$(CC)) --version 2> /dev/null| head -n 1 | grep clang | sed "s/^.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\).*$$/\1/" | head -n 1)
PYTHON_AVAILABLE := $(shell $(PYTHON) --version > /dev/null 2>&1 && echo python)
GIT_AVAILABLE    := $(shell git --version > /dev/null 2>&1 && echo git)
else
GCC_VERSION      := $(shell $(TOOLCHAIN)$(subst @,,$(CC)) -dumpversion 2> NUL)
CLANG_VERSION    := $(shell $(TOOLCHAIN)$(subst @,,$(CC)) --version 2> NUL| head -n 1 | grep clang | sed "s/^.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\).*$$/\1/" | head -n 1)
PYTHON_AVAILABLE := $(shell $(PYTHON) --version > NUL 2>&1 && echo python)
GIT_AVAILABLE    := $(shell git --version > NUL 2>&1 && echo git)
endif
ifdef MSBUILD
MSBUILD_PARAMS   := /v:minimal /m:$(NUMBER_OF_PROCESSORS)
ifeq ($(CONFIG),debug)
MSBUILD_PARAMS += /p:Configuration=Debug
else
MSBUILD_PARAMS += /p:Configuration=Release
endif
ifeq ($(ARCHITECTURE),_x64)
MSBUILD_PARAMS += /p:platform=x64
else
MSBUILD_PARAMS += /p:platform=win32
endif
endif
else
GCC_VERSION      := $(shell $(TOOLCHAIN)$(subst @,,$(CC)) -dumpversion 2> /dev/null)
ifneq ($(OS),solaris)
CLANG_VERSION    := $(shell $(TOOLCHAIN)$(subst @,,$(CC))  --version  2> /dev/null | head -n 1 | grep -e 'version [0-9]\.[0-9]\(\.[0-9]\)\?' -o | grep -e '[0-9]\.[0-9]\(\.[0-9]\)\?' -o | tail -n 1)
endif
PYTHON_AVAILABLE := $(shell $(PYTHON) --version > /dev/null 2>&1 && echo python)
GIT_AVAILABLE := $(shell git --version > /dev/null 2>&1 && echo git)
endif

ifeq ($(CLANG_VERSION),)
$(info GCC $(GCC_VERSION) detected)
else
$(info Clang $(CLANG_VERSION) detected)
ifneq ($(TARGETOS),asmjs)
ifeq ($(ARCHITECTURE),_x64)
ARCHITECTURE := _x64_clang
else
ARCHITECTURE := _x86_clang
endif
endif
endif

ifneq ($(PYTHON_AVAILABLE),python)
$(error Python is not available in path)
endif

ifneq ($(GIT_AVAILABLE),git)
PARAMS += --IGNORE_GIT='1'
endif
ifeq ($(wildcard .git/*),)
PARAMS += --IGNORE_GIT='1'
endif

ifeq ($(GIT_AVAILABLE),git)
NEW_GIT_VERSION := $(shell git describe)
ifeq (posix,$(SHELLTYPE))
OLD_GIT_VERSION := $(shell cat .mame_version 2> /dev/null)
else
OLD_GIT_VERSION := $(shell cat .mame_version 2> NUL)
endif
ifneq ($(NEW_GIT_VERSION),$(OLD_GIT_VERSION))
$(shell git describe > .mame_version)
$(shell touch $(SRC)/version.cpp)
endif
endif


GENIE := 3rdparty/genie/bin/$(GENIEOS)/genie$(EXE)

ifeq ($(TARGET),$(SUBTARGET_FULL))
FULLTARGET := $(TARGET)
else
FULLTARGET := $(TARGET)$(SUBTARGET_FULL)
endif
PROJECTDIR := $(BUILDDIR)/projects/$(OSD)/$(FULLTARGET)
PROJECTDIR_SDL := $(BUILDDIR)/projects/sdl/$(FULLTARGET)
PROJECTDIR_WIN := $(BUILDDIR)/projects/windows/$(FULLTARGET)

.PHONY: all clean regenie generate
all: $(GENIE) $(TARGETOS)$(ARCHITECTURE)
regenie:

#-------------------------------------------------
# gmake-mingw64-gcc
#-------------------------------------------------

$(PROJECTDIR)/gmake-mingw64-gcc/Makefile: makefile $(SCRIPTS) $(GENIE)
ifndef MINGW64
   $(error MINGW64 is not set)
endif
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --gcc=mingw64-gcc --gcc_version=$(GCC_VERSION) gmake

.PHONY: windows_x64
windows_x64: generate $(PROJECTDIR)/gmake-mingw64-gcc/Makefile
ifndef MINGW64
   $(error MINGW64 is not set)
endif
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw64-gcc config=$(CONFIG)64 WINDRES=$(WINDRES) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw64-gcc config=$(CONFIG)64 WINDRES=$(WINDRES)

#-------------------------------------------------
# gmake-mingw32-gcc
#-------------------------------------------------

.PHONY: windows
windows: windows_x86

$(PROJECTDIR)/gmake-mingw32-gcc/Makefile: makefile $(SCRIPTS) $(GENIE)
ifndef MINGW32
   $(error MINGW32 is not set)
endif
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --gcc=mingw32-gcc --gcc_version=$(GCC_VERSION) gmake

.PHONY: windows_x86
windows_x86: generate $(PROJECTDIR)/gmake-mingw32-gcc/Makefile
ifndef MINGW32
   $(error MINGW32 is not set)
endif
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw32-gcc config=$(CONFIG)32 WINDRES=$(WINDRES) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw32-gcc config=$(CONFIG)32 WINDRES=$(WINDRES)

#-------------------------------------------------
# gmake-mingw-clang
#-------------------------------------------------

$(PROJECTDIR)/gmake-mingw-clang/Makefile: makefile $(SCRIPTS) $(GENIE)
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --gcc=mingw-clang --gcc_version=$(CLANG_VERSION) gmake

.PHONY: windows_x64_clang
windows_x64_clang: generate $(PROJECTDIR)/gmake-mingw-clang/Makefile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw-clang config=$(CONFIG)64 WINDRES=$(WINDRES) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw-clang config=$(CONFIG)64 WINDRES=$(WINDRES)

.PHONY: windows_x86_clang
windows_x86_clang: generate $(PROJECTDIR)/gmake-mingw-clang/Makefile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw-clang config=$(CONFIG)32 WINDRES=$(WINDRES) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-mingw-clang config=$(CONFIG)32 WINDRES=$(WINDRES)

#-------------------------------------------------
# Visual Studio 2013
#-------------------------------------------------

.PHONY: vs2013
vs2013: generate
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) vs2013
ifdef MSBUILD
   $(SILENT) msbuild $(PROJECTDIR_WIN)/vs2013/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif

.PHONY: vs2013_intel
vs2013_intel: generate
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --vs=intel-15 vs2013
ifdef MSBUILD
   $(SILENT) msbuild $(PROJECTDIR_WIN)/vs2013-intel/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif

.PHONY: vs2013_xp
vs2013_xp: generate
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --vs=vs2013-xp vs2013
ifdef MSBUILD
   $(SILENT) msbuild $(PROJECTDIR_WIN)/vs2013-xp/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif

#-------------------------------------------------
# Visual Studio 2015
#-------------------------------------------------

.PHONY: vs2015
vs2015: generate
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) vs2015
ifdef MSBUILD
   $(SILENT) msbuild $(PROJECTDIR_WIN)/vs2015/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif

.PHONY: vs2015_intel
vs2015_intel: generate
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --vs=intel-15 vs2015
ifdef MSBUILD
   $(SILENT) msbuild $(PROJECTDIR_WIN)/vs2015-intel/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif

.PHONY: vs2015_xp
vs2015_xp: generate
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --vs=vs2015-xp vs2015
ifdef MSBUILD
   $(SILENT) msbuild $(PROJECTDIR_WIN)/vs2015-xp/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif

.PHONY: vs2015_uwp
vs2015_uwp: generate
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --vs=winstore82 --osd=windows --NO_USE_MIDI=1 --USE_LIBUV=0 --NO_OPENGL=1 --USE_QTDEBUG=0 --MODERN_WIN_API=1 vs2015
ifdef MSBUILD
   $(SILENT) msbuild $(PROJECTDIR_WIN)/vs2015-winstore82/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif

#-------------------------------------------------
# android-arm
#-------------------------------------------------

$(PROJECTDIR)/gmake-android-arm/Makefile: makefile $(SCRIPTS) $(GENIE)
ifndef ANDROID_NDK_ARM
   $(error ANDROID_NDK_ARM is not set)
endif
ifndef ANDROID_NDK_ROOT
   $(error ANDROID_NDK_ROOT is not set)
endif

   $(SILENT) $(GENIE) $(PARAMS) --gcc=android-arm --gcc_version=4.9 --osd=retro --targetos=android-arm --targetos=android --PLATFORM=arm --NOASM=1 gmake
#   $(SILENT) $(GENIE) $(PARAMS) --gcc=android-arm --gcc_version=3.6.0 --osd=osdmini --targetos=android-arm --targetos=android --PLATFORM=arm --NOASM=1 gmake
#   $(SILENT) $(GENIE) $(PARAMS) --gcc=android-arm --gcc_version=3.8.0 --osd=sdl --targetos=android --PLATFORM=arm --NO_USE_MIDI=1 --NO_OPENGL=1 --USE_QTDEBUG=0 --NO_X11=1 --DONT_USE_NETWORK=1 --NOASM=1 gmake

.PHONY: android-arm
android-arm: generate $(PROJECTDIR)/gmake-android-arm/Makefile
ifndef ANDROID_NDK_ARM
   $(error ANDROID_NDK_ARM is not set)
endif
ifndef ANDROID_NDK_ROOT
   $(error ANDROID_NDK_ROOT is not set)
endif
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-android-arm config=$(CONFIG) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-android-arm config=$(CONFIG)

#-------------------------------------------------
# android-arm64
#-------------------------------------------------

$(PROJECTDIR_SDL)/gmake-android-arm64/Makefile: makefile $(SCRIPTS) $(GENIE)
ifndef ANDROID_NDK_ARM64
   $(error ANDROID_NDK_ARM64 is not set)
endif
ifndef ANDROID_NDK_ROOT
   $(error ANDROID_NDK_ROOT is not set)
endif
   $(SILENT) $(GENIE) $(PARAMS) --gcc=android-arm64 --gcc_version=3.8.0 --osd=sdl --targetos=android --PLATFORM=arm64 --NO_USE_MIDI=1 --NO_OPENGL=1 --USE_QTDEBUG=0 --NO_X11=1 --DONT_USE_NETWORK=1 --NOASM=1 gmake

.PHONY: android-arm64
android-arm64: generate $(PROJECTDIR_SDL)/gmake-android-arm64/Makefile
ifndef ANDROID_NDK_ARM64
   $(error ANDROID_NDK_ARM64 is not set)
endif
ifndef ANDROID_NDK_ROOT
   $(error ANDROID_NDK_ROOT is not set)
endif
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR_SDL)/gmake-android-arm64 config=$(CONFIG) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR_SDL)/gmake-android-arm64 config=$(CONFIG)

#-------------------------------------------------
# android-mips
#-------------------------------------------------

$(PROJECTDIR_SDL)/gmake-android-mips/Makefile: makefile $(SCRIPTS) $(GENIE)
ifndef ANDROID_NDK_MIPS
   $(error ANDROID_NDK_MIPS is not set)
endif

ifndef ANDROID_NDK_ROOT
   $(error ANDROID_NDK_ROOT is not set)
endif
   $(SILENT) $(GENIE) $(PARAMS) --gcc=android-mips --gcc_version=3.8.0 --osd=sdl --targetos=android --PLATFORM=mips --NO_USE_MIDI=1 --NO_OPENGL=1 --USE_QTDEBUG=0 --NO_X11=1 --DONT_USE_NETWORK=1 --NOASM=1 gmake

.PHONY: android-mips
android-mips: generate $(PROJECTDIR_SDL)/gmake-android-mips/Makefile
ifndef ANDROID_NDK_MIPS
   $(error ANDROID_NDK_MIPS is not set)
endif
ifndef ANDROID_NDK_ROOT
   $(error ANDROID_NDK_ROOT is not set)
endif
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR_SDL)/gmake-android-mips config=$(CONFIG) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR_SDL)/gmake-android-mips config=$(CONFIG)

#-------------------------------------------------
# android-mips64
#-------------------------------------------------

$(PROJECTDIR_SDL)/gmake-android-mips64/Makefile: makefile $(SCRIPTS) $(GENIE)
ifndef ANDROID_NDK_MIPS64
   $(error ANDROID_NDK_MIPS64 is not set)
endif
ifndef ANDROID_NDK_ROOT
   $(error ANDROID_NDK_ROOT is not set)
endif
   $(SILENT) $(GENIE) $(PARAMS) --gcc=android-mips64 --gcc_version=3.8.0 --osd=sdl --targetos=android --PLATFORM=mips64 --NO_USE_MIDI=1 --NO_OPENGL=1 --USE_QTDEBUG=0 --NO_X11=1 --DONT_USE_NETWORK=1 --NOASM=1 gmake

.PHONY: android-mips64
android-mips64: generate $(PROJECTDIR_SDL)/gmake-android-mips64/Makefile
ifndef ANDROID_NDK_MIPS64
   $(error ANDROID_NDK_MIPS64 is not set)
endif
ifndef ANDROID_NDK_ROOT
   $(error ANDROID_NDK_ROOT is not set)
endif
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR_SDL)/gmake-android-mips64 config=$(CONFIG) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR_SDL)/gmake-android-mips64 config=$(CONFIG)

#-------------------------------------------------
# android-x86
#-------------------------------------------------

$(PROJECTDIR_SDL)/gmake-android-x86/Makefile: makefile $(SCRIPTS) $(GENIE)
ifndef ANDROID_NDK_X86
   $(error ANDROID_NDK_X86 is not set)
endif
ifndef ANDROID_NDK_ROOT
   $(error ANDROID_NDK_ROOT is not set)
endif
   $(SILENT) $(GENIE) $(PARAMS) --gcc=android-x86 --gcc_version=3.8.0 --osd=sdl --targetos=android --PLATFORM=x86 --NO_USE_MIDI=1 --NO_OPENGL=1 --USE_QTDEBUG=0 --NO_X11=1 --DONT_USE_NETWORK=1 gmake

.PHONY: android-x86
android-x86: generate $(PROJECTDIR_SDL)/gmake-android-x86/Makefile
ifndef ANDROID_NDK_X86
   $(error ANDROID_NDK_X86 is not set)
endif
ifndef ANDROID_NDK_ROOT
   $(error ANDROID_NDK_ROOT is not set)
endif
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR_SDL)/gmake-android-x86 config=$(CONFIG) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR_SDL)/gmake-android-x86 config=$(CONFIG)

#-------------------------------------------------
# android-x64
#-------------------------------------------------

$(PROJECTDIR_SDL)/gmake-android-x64/Makefile: makefile $(SCRIPTS) $(GENIE)
ifndef ANDROID_NDK_X64
   $(error ANDROID_NDK_X64 is not set)
endif
ifndef ANDROID_NDK_ROOT
   $(error ANDROID_NDK_ROOT is not set)
endif
   $(SILENT) $(GENIE) $(PARAMS) --gcc=android-x64 --gcc_version=3.8.0 --osd=sdl --targetos=android --PLATFORM=x64 --NO_USE_MIDI=1 --NO_OPENGL=1 --USE_QTDEBUG=0 --NO_X11=1 --DONT_USE_NETWORK=1 gmake

.PHONY: android-x64
android-x64: generate $(PROJECTDIR_SDL)/gmake-android-x64/Makefile
ifndef ANDROID_NDK_X64
   $(error ANDROID_NDK_X64 is not set)
endif
ifndef ANDROID_NDK_ROOT
   $(error ANDROID_NDK_ROOT is not set)
endif
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR_SDL)/gmake-android-x64 config=$(CONFIG) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR_SDL)/gmake-android-x64 config=$(CONFIG)

#-------------------------------------------------
# asmjs / Emscripten
#-------------------------------------------------

$(PROJECTDIR)/gmake-asmjs/Makefile: makefile $(SCRIPTS) $(GENIE)
ifndef EMSCRIPTEN
   $(error EMSCRIPTEN is not set)
endif
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --gcc=asmjs --gcc_version=3.7.0 gmake

.PHONY: asmjs
asmjs: generate $(PROJECTDIR)/gmake-asmjs/Makefile
ifndef EMSCRIPTEN
   $(error EMSCRIPTEN is not set)
endif
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-asmjs config=$(CONFIG) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-asmjs config=$(CONFIG)

#-------------------------------------------------
# gmake-linux
#-------------------------------------------------

$(PROJECTDIR)/gmake-linux/Makefile: makefile $(SCRIPTS) $(GENIE)
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --gcc=linux-gcc --gcc_version=$(GCC_VERSION) gmake

.PHONY: linux_x64
linux_x64: generate $(PROJECTDIR)/gmake-linux/Makefile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)64 precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)64

.PHONY: linux_x86
linux_x86: generate $(PROJECTDIR)/gmake-linux/Makefile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)32 precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)32

.PHONY: linux
linux: generate $(PROJECTDIR)/gmake-linux/Makefile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux config=$(CONFIG)

#-------------------------------------------------
# gmake-linux-clang
#-------------------------------------------------

$(PROJECTDIR)/gmake-linux-clang/Makefile: makefile $(SCRIPTS) $(GENIE)
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --gcc=linux-clang --gcc_version=$(CLANG_VERSION) gmake

.PHONY: linux_x64_clang
linux_x64_clang: generate $(PROJECTDIR)/gmake-linux-clang/Makefile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux-clang config=$(CONFIG)64 precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux-clang config=$(CONFIG)64

.PHONY: linux_x86_clang
linux_x86_clang: generate $(PROJECTDIR)/gmake-linux-clang/Makefile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux-clang config=$(CONFIG)32 precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-linux-clang config=$(CONFIG)32

#-------------------------------------------------
# gmake-osx
#-------------------------------------------------

$(PROJECTDIR)/gmake-osx/Makefile: makefile $(SCRIPTS) $(GENIE)
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --gcc=osx --gcc_version=$(GCC_VERSION) gmake

.PHONY: macosx_x64
macosx_x64: generate $(PROJECTDIR)/gmake-osx/Makefile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx config=$(CONFIG)64 precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx config=$(CONFIG)64

.PHONY: macosx
macosx: macosx_x86

.PHONY: macosx_x86
macosx_x86: generate $(PROJECTDIR)/gmake-osx/Makefile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx config=$(CONFIG)32 precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx config=$(CONFIG)32

#-------------------------------------------------
# gmake-osx-clang
#-------------------------------------------------

$(PROJECTDIR)/gmake-osx-clang/Makefile: makefile $(SCRIPTS) $(GENIE)
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --gcc=osx-clang --gcc_version=$(CLANG_VERSION) gmake

.PHONY: macosx_x64_clang
macosx_x64_clang: generate $(PROJECTDIR)/gmake-osx-clang/Makefile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx-clang config=$(CONFIG)64 precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx-clang config=$(CONFIG)64

.PHONY: macosx_x86_clang
macosx_x86_clang: generate $(PROJECTDIR)/gmake-osx-clang/Makefile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx-clang config=$(CONFIG)32 precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-osx-clang config=$(CONFIG)32

.PHONY: xcode4
xcode4: generate
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --targetos=macosx --xcode=osx xcode4

.PHONY: xcode4-ios
xcode4-ios: generate
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --targetos=macosx --xcode=ios xcode4

#-------------------------------------------------
# gmake-solaris
#-------------------------------------------------


$(PROJECTDIR)/gmake-solaris/Makefile: makefile $(SCRIPTS) $(GENIE)
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --gcc=solaris --gcc_version=$(GCC_VERSION) gmake

.PHONY: solaris_x64
solaris_x64: generate $(PROJECTDIR)/gmake-solaris/Makefile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-solaris config=$(CONFIG)64 precompile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-solaris config=$(CONFIG)64

.PHONY: solaris
solaris: solaris_x86

.PHONY: solaris_x86
solaris_x86: generate $(PROJECTDIR)/gmake-solaris/Makefile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-solaris config=$(CONFIG)32 precompile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-solaris config=$(CONFIG)32


#-------------------------------------------------
# gmake-freebsd
#-------------------------------------------------

$(PROJECTDIR)/gmake-freebsd/Makefile: makefile $(SCRIPTS) $(GENIE)
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --gcc=freebsd --gcc_version=$(GCC_VERSION) gmake

.PHONY: freebsd_x64
freebsd_x64: generate $(PROJECTDIR)/gmake-freebsd/Makefile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-freebsd config=$(CONFIG)64 precompile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-freebsd config=$(CONFIG)64

.PHONY: freebsd
freebsd: freebsd_x86

.PHONY: freebsd_x86
freebsd_x86: generate $(PROJECTDIR)/gmake-freebsd/Makefile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-freebsd config=$(CONFIG)32 precompile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-freebsd config=$(CONFIG)32

#-------------------------------------------------
# gmake-netbsd
#-------------------------------------------------

$(PROJECTDIR)/gmake-netbsd/Makefile: makefile $(SCRIPTS) $(GENIE)
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --gcc=netbsd --gcc_version=$(GCC_VERSION) gmake

.PHONY: netbsd_x64
netbsd_x64: generate $(PROJECTDIR)/gmake-netbsd/Makefile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-netbsd config=$(CONFIG)64 precompile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-netbsd config=$(CONFIG)64

.PHONY: netbsd
netbsd: netbsd_x86

.PHONY: netbsd_x86
netbsd_x86: generate $(PROJECTDIR)/gmake-netbsd/Makefile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-netbsd config=$(CONFIG)32 precompile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-netbsd config=$(CONFIG)32

#-------------------------------------------------
# gmake-openbsd
#-------------------------------------------------

$(PROJECTDIR)/gmake-openbsd/Makefile: makefile $(SCRIPTS) $(GENIE)
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --gcc=openbsd --gcc_version=$(GCC_VERSION) gmake

.PHONY: openbsd_x64
openbsd_x64: generate $(PROJECTDIR)/gmake-openbsd/Makefile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-openbsd config=$(CONFIG)64 precompile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-openbsd config=$(CONFIG)64

.PHONY: openbsd
openbsd: openbsd_x86

.PHONY: openbsd_x86
openbsd_x86: generate $(PROJECTDIR)/gmake-openbsd/Makefile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-openbsd config=$(CONFIG)32 precompile
   $(SILENT) $(MAKE) -C $(PROJECTDIR)/gmake-openbsd config=$(CONFIG)32

#-------------------------------------------------
# gmake-steamlink
#-------------------------------------------------

$(PROJECTDIR)/gmake-steamlink/Makefile: makefile $(SCRIPTS) $(GENIE)
ifndef MARVELL_SDK_PATH
   $(error MARVELL_SDK_PATH is not set)
endif
ifndef MARVELL_ROOTFS
   $(error MARVELL_ROOTFS is not set)
endif
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --gcc=steamlink --gcc_version=$(GCC_VERSION) --NO_OPENGL=1 --NO_USE_MIDI=1 --NO_X11=1 --NOASM=1 --SDL_INSTALL_ROOT=$(MARVELL_ROOTFS)/usr  gmake

.PHONY: steamlink
steamlink: generate $(PROJECTDIR)/gmake-steamlink/Makefile
ifndef MARVELL_SDK_PATH
   $(error MARVELL_SDK_PATH is not set)
endif
ifndef MARVELL_ROOTFS
   $(error MARVELL_ROOTFS is not set)
endif
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-steamlink config=$(CONFIG) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR)/gmake-steamlink config=$(CONFIG)

#-------------------------------------------------
# gmake-rpi
#-------------------------------------------------

$(PROJECTDIR_SDL)/gmake-rpi/Makefile: makefile $(SCRIPTS) $(GENIE)
ifndef RASPBERRY_SDK_PATH
   $(error RASPBERRY_SDK_PATH is not set)
endif
ifndef RASPBERRY_SYSROOT
   $(error RASPBERRY_SYSROOT is not set)
endif
   $(SILENT) $(GENIE) $(PARAMS) --gcc=rpi --gcc_version=4.9.2 --osd=sdl --targetos=rpi --targetos=rpi --NO_USE_MIDI=1 --PLATFORM=arm --NOASM=1 --USE_QTDEBUG=0 --SDL_INSTALL_ROOT=$(RASPBERRY_SYSROOT)/usr  gmake

.PHONY: rpi
rpi: generate $(PROJECTDIR_SDL)/gmake-rpi/Makefile
ifndef RASPBERRY_SDK_PATH
   $(error RASPBERRY_SDK_PATH is not set)
endif
ifndef RASPBERRY_SYSROOT
   $(error RASPBERRY_SYSROOT is not set)
endif
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR_SDL)/gmake-rpi config=$(CONFIG) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR_SDL)/gmake-rpi config=$(CONFIG)

#-------------------------------------------------
# gmake-ci20
#-------------------------------------------------

$(PROJECTDIR_SDL)/gmake-ci20/Makefile: makefile $(SCRIPTS) $(GENIE)
ifndef MIPS_LINUXGNU_ROOT
   $(error MIPS_LINUXGNU_ROOT is not set)
endif
ifndef CI20_SYSROOT
   $(error CI20_SYSROOT is not set)
endif
   $(SILENT) $(GENIE) $(PARAMS) --gcc=ci20 --gcc_version=4.9.2 --osd=sdl --targetos=ci20 --targetos=ci20 --NO_USE_MIDI=1  --PLATFORM=arm --NOASM=1 --USE_QTDEBUG=0 --SDL_INSTALL_ROOT=$(RASPBERRY_SYSROOT)/usr  gmake

.PHONY: ci20
ci20: generate $(PROJECTDIR_SDL)/gmake-ci20/Makefile
ifndef MIPS_LINUXGNU_ROOT
   $(error MIPS_LINUXGNU_ROOT is not set)
endif
ifndef CI20_SYSROOT
   $(error CI20_SYSROOT is not set)
endif
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR_SDL)/gmake-ci20 config=$(CONFIG) precompile
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C $(PROJECTDIR_SDL)/gmake-ci20 config=$(CONFIG)

#-------------------------------------------------
# cmake
#-------------------------------------------------
.PHONY: cmake
cmake: generate
   $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) cmake
ifeq ($(OS),windows)
   $(SILENT)echo cmake_minimum_required(VERSION 2.8.4) > CMakeLists.txt
   $(SILENT)echo add_subdirectory($(PROJECTDIR)/cmake) >> CMakeLists.txt
else
   $(SILENT)echo "cmake_minimum_required(VERSION 2.8.4)" > CMakeLists.txt
   $(SILENT)echo "add_subdirectory($(PROJECTDIR)/cmake)" >> CMakeLists.txt
endif

#-------------------------------------------------
# Clean/bootstrap
#-------------------------------------------------

GENIE_SRC=$(wildcard 3rdparty/genie/src/host/*.c)

$(GENIE): $(GENIE_SRC)
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C 3rdparty/genie/build/gmake.$(GENIEOS) -f genie.make

3rdparty/genie/src/hosts/%.c:

.PHONY: genieclean
genieclean:
   $(SILENT) $(MAKE) $(MAKEPARAMS) -C 3rdparty/genie/build/gmake.$(GENIEOS) -f genie.make clean

clean: genieclean
   [USER=325063]@Echo[/USER] Cleaning...
   -@rm -rf $(BUILDDIR)
   $(SILENT) $(MAKE) -C $(SRC)/devices/cpu/m68000 clean
   -@rm -rf 3rdparty/bgfx/.build

GEN_FOLDERS := $(GENDIR)/$(TARGET)/layout/ $(GENDIR)/$(TARGET)/$(SUBTARGET_FULL)/ $(GENDIR)/mame/drivers/

rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))
LAYOUTS=$(wildcard $(SRC)/$(TARGET)/layout/*.lay)

ifneq (,$(wildcard src/osd/$(OSD)/$(OSD).mak))
include src/osd/$(OSD)/$(OSD).mak
endif

ifneq (,$(wildcard src/$(TARGET)/$(TARGET).mak))
include src/$(TARGET)/$(TARGET).mak
endif

$(GEN_FOLDERS):
   -$(call MKDIR,$@)

genie: $(GENIE)

generate: \
       genie \
       $(GEN_FOLDERS) \
       $(patsubst %.po,%.mo,$(call rwildcard, language/, *.po)) \
       $(patsubst $(SRC)/%.lay,$(GENDIR)/%.lh,$(LAYOUTS)) \
       $(GENDIR)/mame/drivers/ymmu100.hxx \
       $(SRC)/devices/cpu/m68000/m68kops.cpp \
       $(GENDIR)/includes/SDL2

$(GENDIR)/includes/SDL2:
   -$(call MKDIR,$@)
   -$(call COPY,3rdparty/SDL2/include/,$(GENDIR)/includes/SDL2)

$(GENDIR)/%.lh: $(SRC)/%.lay scripts/build/complay.py | $(GEN_FOLDERS)
   [USER=325063]@Echo[/USER] Compressing $<...
   $(SILENT)$(PYTHON) scripts/build/complay.py $< $@ layout_$(basename $(notdir $<))

$(GENDIR)/mame/drivers/ymmu100.hxx: $(SRC)/mame/drivers/ymmu100.ppm scripts/build/file2str.py
   [USER=325063]@Echo[/USER] Converting $<...
   $(SILENT)$(PYTHON) scripts/build/file2str.py $< $@ ymmu100_bkg UINT8

$(SRC)/devices/cpu/m68000/m68kops.cpp: $(SRC)/devices/cpu/m68000/m68k_in.cpp $(SRC)/devices/cpu/m68000/m68kmake.cpp
ifeq ($(TARGETOS),asmjs)
   $(SILENT) $(MAKE) -C $(SRC)/devices/cpu/m68000
else
   $(SILENT) $(MAKE) -C $(SRC)/devices/cpu/m68000 CC="$(CC)" CXX="$(CXX)"
endif

%.mo: %.po
   [USER=325063]@Echo[/USER] Converting translation $<...
ifdef IGNORE_BAD_LOCALISATION
   $(SILENT)$(PYTHON) scripts/build/msgfmt.py --output-file $@ $< || exit 0
else
   $(SILENT)$(PYTHON) scripts/build/msgfmt.py --output-file $@ $<
endif
#-------------------------------------------------
# Regression tests
#-------------------------------------------------

include regtests/regtests.mak

.PHONY: tests

tests: $(REGTESTS)

#-------------------------------------------------
# Source cleanup
#-------------------------------------------------

.PHONY: cleansrc

cleansrc:
   [USER=325063]@Echo[/USER] Cleaning up tabs/spaces/end of lines....
ifeq ($(OS),windows)
   $(shell for /r src %%i in (*.c) do srcclean %%i >&2 )
   $(shell for /r src %%i in (*.h) do srcclean %%i >&2 )
   $(shell for /r src %%i in (*.mak) do srcclean %%i >&2 )
   $(shell for /r src %%i in (*.lst) do srcclean %%i >&2 )
   $(shell for /r src %%i in (*.lay) do srcclean %%i >&2 )
   $(shell for /r src %%i in (*.hxx) do srcclean %%i >&2 )
   $(shell for /r hash %%i in (*.xml) do srcclean %%i >&2 )
else
   $(shell find src/ -name *.c -exec ./srcclean {} >&2 ;)
   $(shell find src/ -name *.h -exec ./srcclean {}  >&2 ;)
   $(shell find src/ -name *.mak -exec ./srcclean {} >&2 ;)
   $(shell find src/ -name *.lst -exec ./srcclean {} >&2 ;)
   $(shell find src/ -name *.lay -exec ./srcclean {} >&2 ;)
   $(shell find src/ -name *.hxx -exec ./srcclean {} >&2 ;)
   $(shell find hash/ -name *.xml -exec ./srcclean {} >&2 ;)
endif

#-------------------------------------------------
# Doxygen documentation
#-------------------------------------------------

.PHONY: doxygen

doxygen:
   [USER=325063]@Echo[/USER] Generate Doxygen documentation
   doxygen doxygen/doxygen.config

#-------------------------------------------------
# CppCheck analysis
#-------------------------------------------------

.PHONY: cppcheck

CPPCHECK_PARAMS  = -Isrc/osd
CPPCHECK_PARAMS += -Isrc/emu
CPPCHECK_PARAMS += -Isrc/lib
CPPCHECK_PARAMS += -Isrc/lib/util
CPPCHECK_PARAMS += -Isrc/mame
CPPCHECK_PARAMS += -Isrc/osd/modules/render
CPPCHECK_PARAMS += -Isrc/osd/windows
CPPCHECK_PARAMS += -Isrc/emu/cpu/m68000
CPPCHECK_PARAMS += -I3rdparty
ifndef USE_SYSTEM_LIB_LUA
CPPCHECK_PARAMS += -I3rdparty/lua/src
endif
ifndef USE_SYSTEM_LIB_ZLIB
CPPCHECK_PARAMS += -I3rdparty/zlib
endif
CPPCHECK_PARAMS += -I3rdparty/bgfx/include
CPPCHECK_PARAMS += -I3rdparty/bx/include
CPPCHECK_PARAMS += -I$(BUILDDIR)/generated/emu
CPPCHECK_PARAMS += -I$(BUILDDIR)/generated/emu/layout
CPPCHECK_PARAMS += -I$(BUILDDIR)/generated/mame/layout
CPPCHECK_PARAMS += -DX64_WINDOWS_ABI
CPPCHECK_PARAMS += -DPTR64=1
CPPCHECK_PARAMS += -DMAME_DEBUG
CPPCHECK_PARAMS += -DMAME_PROFILER
CPPCHECK_PARAMS += -DCRLF=3
CPPCHECK_PARAMS += -DLSB_FIRST
ifndef USE_SYSTEM_LIB_FLAC
CPPCHECK_PARAMS += -DFLAC__NO_DLL
endif
CPPCHECK_PARAMS += -DNATIVE_DRC=drcbe_x64
CPPCHECK_PARAMS += -DLUA_COMPAT_APIINTCASTS
CPPCHECK_PARAMS += -DWIN32
CPPCHECK_PARAMS += -D__GNUC__
CPPCHECK_PARAMS += -D__x86_64__
ifndef VERBOSE
CPPCHECK_PARAMS += --quiet
endif

cppcheck:
   [USER=325063]@Echo[/USER] Generate CppCheck analysis report
   cppcheck --enable=all src/ $(CPPCHECK_PARAMS) -j9

#-------------------------------------------------
# BGFX shaders
#-------------------------------------------------

.PHONY: shaders bgfx-tools

bgfx-tools:
   -@rm -rf 3rdparty/bgfx/.build/projects
   $(SILENT) $(MAKE) -C 3rdparty/bgfx -f makefile dist-$(GENIEOS) CC="$(CC)" CXX="$(CXX)" MINGW="$(MINGW)"

shaders: bgfx-tools
   -$(call MKDIR,build/shaders/dx11)
   -$(call MKDIR,build/shaders/dx9)
   -$(call MKDIR,build/shaders/gles)
   -$(call MKDIR,build/shaders/glsl)
   -$(call MKDIR,build/shaders/metal)
   $(SILENT) $(MAKE) -C $(SRC)/osd/modules/render/bgfx/shaders rebuild CHAIN="$(CHAIN)"
 
#-------------------------------------------------
# Translation
#-------------------------------------------------

.PHONY: translation

translation:
   $(SILENT) echo Generating mame.pot
   $(SILENT) find src -iname "*.cpp" | xargs xgettext --from-code=UTF-8 -k_ -k__ -o mame.pot
   $(SILENT) find language -iname "*.po" | xargs -n 1 -I %% msgmerge -U -N %% mame.pot
   $(SILENT) find language -iname "*.po" | xargs -n 1 -I %% msgattrib --clear-fuzzy --empty %% -o %%
Code:
###########################################################################
#
#   Makefile.libretro
#
#   Makefile for building MAME and derivatives as libretro core libraries
#
#   Copyright (C) 2015 Libretro Team.
#   Licensing should be regarded as the same as that of the MAME project,
#   visit http://mamedev.org for more information.
#
#
#   Okay, basically this file exists to do the following:
#
#   1. Determine $ARCH and $platform from the cmdline, the environment, or
#      by figuring them out (as other libretro cores do).
#   2. Disable -Werror.  MAME upstream builds with -Werror, which is great
#      for developers but absolutely frustrating for users.  From our POV,
#      we're effectively users, and users who try to follow the bleeding
#      edge no less.  That means we get cut, and too often it's by some
#      random warning upstream hasn't squashed.
#   3. Set PYTHON_EXECUTABLE on non-Apple platforms.  Upstream assumes
#      python (no prefix) is python2, which basically NEVER happens now on
#      modern Linux systems, and isn't even common on Windows anymore.  It
#      should be python2 pretty much everywhere but Apple, and the exception
#      there is mostly because Apple hates GPLv3.
#   4. Enable VERBOSE.  Yes, MAME builds generate a metric crap-ton of
#      output, but when builds fail it's nice to know why.
#   5. Rename $ARCH and unset it.  Apple has a convention on the Mac of
#      letting you use $ARCH to specify what CPU architectures to build
#      for.  This is at odds to how libretro uses it, and solving that on
#      the libretro end is going to have to wait for a major overhaul of
#      how cores are built.  We're not ready to do that yet.
#
###########################################################################

###########################################################################
#
#   LIBRETRO PREFERRED DEFAULT SETTINGS
#
###########################################################################

# Disable -Werror as libretro is effectively a MAME user, not a developer
NOWERROR ?= 1

# This needs to be python2 at the moment everywhere but OS X (fixed later)
PYTHON_EXECUTABLE ?= python2

# Cause the build system to regenerate itself, in case it changed
REGENIE ?= 1

# Spew much output developers need if MAME's build breaks for some reason
VERBOSE ?= 1

# You probably shouldn't need to set this anymore (find libretro section of
# scripts/toolchain.lua)
# PTR64 = 1

###########################################################################
#
#   LIBRETRO PLATFORM GUESSING
#
#   If the caller doesn't specify $platform and $ARCH, we guess
#
###########################################################################

UNAME_S = $(shell uname -s)
UNAME_M = $(shell uname -m)
ifeq ($(platform),)
   platform = unix
   ifeq ($(UNAME_S),)
       platform = win
   else ifneq ($(findstring MINGW,$(UNAME_S)),)
       platform = win
   else ifneq ($(findstring Darwin,$(UNAME_S)),)
       platform = osx
   else ifneq ($(findstring win,$(UNAME_S)),)
       platform = win
   endif
endif
ifeq ($(ARCH),)
   LIBRETRO_CPU = $(ARCH)
endif
ifeq ($(LIBRETRO_CPU),)
   ifeq ($(UNAME_M),)
       ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
           LIBRETRO_CPU = x86_64
       endif
       ifeq ($(PROCESSOR_ARCHITEW6432),AMD64)
           LIBRETRO_CPU = x86_64
       endif
   else ifeq ($(UNAME_M),amd64)
       LIBRETRO_CPU = x86_64
   else
       LIBRETRO_CPU = $(UNAME_M)
   endif
endif

###########################################################################
#
#   LIBRETRO PLATFORM-SPECIFIC CONFIGURATION
#
#   Settings needed to get MAME to build everywhere we build it
#
###########################################################################

ifeq ($(platform), android)
#   PTR64 = 0
   # FIXME: Pass these to GENie and test...
#   CROSS_BUILD = 1
#   FORCE_DRC_C_BACKEND = 1
else ifeq ($(platform), osx)
   PYTHON_EXECUTABLE = python
else ifneq (,$(findstring ios,$(platform)))
#   PTR64 = 0
        LIBRETRO_CPU=arm
   PYTHON_EXECUTABLE = python
   # FIXME: Pass these to GENie and test...
#   CROSS_BUILD = 1
#   FORCE_DRC_C_BACKEND = 1
endif


###########################################################################
#
#   BUILD FLAGS
#
###########################################################################

BUILDFLAGS = REGENIE=$(REGENIE) VERBOSE=$(VERBOSE) NOWERROR=$(NOWERROR) OSD="retro"
ifneq ($(PYTHON_EXECUTABLE),)
   BUILDFLAGS += PYTHON_EXECUTABLE=$(PYTHON_EXECUTABLE)
endif
ifeq ($(DEBUG),1)
   BUILDFLAGS += CONFIG=libretrodbg
else
   BUILDFLAGS += CONFIG=libretro
endif


###########################################################################
#
#   PLATFORM FLAGS
#
###########################################################################

PLATFLAGS =
ifneq ($(PTR64),)
   PLATFLAGS += PTR64=$(PTR64)
endif
ifneq ($(platform),)
   PLATFLAGS += LIBRETRO_OS="$(platform)"
endif
ifeq ($(platform),win)
   ifeq ($(MSYSTEM),MINGW64)
       MINGW64 ?= /mingw64
       PLATFLAGS += MINGW64="$(MINGW64)"
   else ifeq ($(MSYSTEM),MINGW32)
       MINGW32 ?= /mingw32
       PLATFLAGS += MINGW32="$(MINGW32)"
   endif
endif
ifneq ($(LIBRETRO_CPU),)
   PLATFLAGS += ARCH="" LIBRETRO_CPU="$(LIBRETRO_CPU)"
endif
ifneq ($(FORCE_DRC_C_BACKEND),)
   PLATFLAGS += FORCE_DRC_C_BACKEND="$(FORCE_DRC_C_BACKEND)"
endif

###########################################################################
#
#   TARGET FLAGS
#
###########################################################################

TARGETFLAGS =
ifneq ($(TARGET),)
   TARGETFLAGS += TARGET=$(TARGET)
endif
ifneq ($(SUBTARGET),)
   TARGETFLAGS += SUBTARGET=$(SUBTARGET)
endif


###########################################################################
#
#   MAKE RULES
#
#   We just call upstream GENie here with appropriate args
#
###########################################################################

all: build

build:
   $(MAKE) $(BUILDFLAGS) $(PLATFLAGS) $(TARGETFLAGS)

clean:
   $(MAKE) $(BUILDFLAGS) $(PLATFLAGS) $(TARGETFLAGS) clean

.PHONY: all build clean
Code:
# Nintendo Switch (libnx)
else ifeq ($(platform), switch)
include $(DEVKITPRO)/libnx/switch_rules
    EXT=a
    TARGET := $(TARGET_NAME)_libretro_$(platform).$(EXT)
    DEFINES := -DSWITCH=1 -U__linux__ -U__linux -DRARCH_INTERNAL
    CFLAGS   :=    $(DEFINES) -g \
                -O2 \
               -fPIE -I$(LIBNX)/include/ -ffunction-sections -fdata-sections -ftls-model=local-exec -Wl,--allow-multiple-definition -specs=$(LIBNX)/switch.specs
    CFLAGS += $(INCDIRS)
    CFLAGS   +=   $(INCLUDE)  -D__SWITCH__
    CXXFLAGS := $(ASFLAGS) $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
    CFLAGS += -std=gnu11
    PLATCFLAGS += -Dstricmp=strcasecmp
    STATIC_LINKING = 1
 
Last edited by CatmanFan,
  • Like
Reactions: baretbh

m4xw

Ancient Deity
OP
Developer
Joined
May 25, 2018
Messages
2,442
Trophies
1
Age
119
XP
6,960
Country
Germany
This is so Gold:
2018061100380400-DB1426D1DFD034027CECDE9C2DD914B8.jpg 2018061100382100-DB1426D1DFD034027CECDE9C2DD914B8.jpg 2018061100424900-DB1426D1DFD034027CECDE9C2DD914B8.jpg 2018061100425400-DB1426D1DFD034027CECDE9C2DD914B8.jpg 2018061100430100-DB1426D1DFD034027CECDE9C2DD914B8.jpg 2018061100430600-DB1426D1DFD034027CECDE9C2DD914B8.jpg 2018061100431300-DB1426D1DFD034027CECDE9C2DD914B8.jpg 2018061100431900-DB1426D1DFD034027CECDE9C2DD914B8.jpg 2018061100432500-DB1426D1DFD034027CECDE9C2DD914B8.jpg 2018061100433300-DB1426D1DFD034027CECDE9C2DD914B8.jpg
 

CatmanFan

Anxious and regretful
Member
Joined
Aug 14, 2016
Messages
1,965
Trophies
0
Website
www.youtube.com
XP
2,615
Country
Morocco
Update: Tried to put the LibNX compile code somewhere in Makefile.libretro in the LibRetro Platform-Specific Configuration, but it failed to compile.
Oh well. Nothing lost, nothing gained.
 

Leonidas87

Well-Known Member
Member
Joined
Jul 15, 2014
Messages
651
Trophies
0
Location
Toronto, Ontario
Website
www.youtube.com
XP
960
Country
Canada
its feature testing sunday for me, or rather monday by now :P

I'm actually really surprised at how full screen looks. Thought it would have looked more stretched but the proportions seem great on the display.

I bet the question "when can we get full screen" lmfao has dropped by at least 80%
Not a necessity but I must say threading is definitely a welcome addition. Tearing is basically non existent.

Been playing handheld on the last builds, 4.1.0 and 5.1.0 buttery smooth.

@m4xw fast forward is also working now with threading just to confirm both on VBA and SNES
 
  • Like
Reactions: zaz3300

Syynx

Well-Known Member
Member
Joined
Jun 5, 2018
Messages
129
Trophies
0
Age
36
XP
442
Country
United States
Trying out A Link to the Past, the performance is really awesome now, but the forced fullscreen is awful. Everything's far too wide
 

CatmanFan

Anxious and regretful
Member
Joined
Aug 14, 2016
Messages
1,965
Trophies
0
Website
www.youtube.com
XP
2,615
Country
Morocco
Would be great if the screen size on both SNES and GBA was upscaled until the height fits the Switch screen (i.e. not stretched up to the entire screen but the size is an enlargement which fits the Switch screen height).
 
  • Like
Reactions: SpaceJump

SeongGino

The Average One
Member
Joined
May 20, 2015
Messages
939
Trophies
0
Age
25
Location
Jersey, Jersey
Website
www.twitter.com
XP
1,932
Country
United States
Would be great if the screen size on both SNES and GBA was upscaled until the height fits the Switch screen (i.e. not stretched up to the entire screen but the size is an enlargement which fits the Switch screen height).

Non-integer scaling. Euuugh...
Technically that's the default, if the scaler wasn't perma-set atm to integer. But it looks meeeeeeeh.
 
Status
Not open for further replies.

Site & Scene News

Popular threads in this forum

General chit-chat
Help Users
  • BigOnYa @ BigOnYa:
    If your internet speeds are fast enough. Streaming 4k takes alot. I used to only have 20mb sec, and 4k struggled. Now I have 300mb sec and 4k plays fine.
    +1
  • Xdqwerty @ Xdqwerty:
    @BigOnYa, i only have like 1 or 2 mb sec
  • BigOnYa @ BigOnYa:
    Did you feed the hamster in your internet router? It prob died and is running slow now.
  • Xdqwerty @ Xdqwerty:
    @BigOnYa, why did you start saying my pc has a hamster in the first place?
    +1
  • BigOnYa @ BigOnYa:
    Its actua!ly just a old joke, meaning its slow. Was just kidding around with you.
    +1
  • BigOnYa @ BigOnYa:
    I bet @AncientBoi has some hamsters hidden somewhere tho....
    +2
  • Psionic Roshambo @ Psionic Roshambo:
    I think Game streaming should work like this.... Local Hardware able the run the game fine, game engine and common assets stored locally, all FMV and music and textures could be streaming
    +1
  • Psionic Roshambo @ Psionic Roshambo:
    Some temporary storage
  • Xdqwerty @ Xdqwerty:
    also @BigOnYa im making some progress on my gdevelop project, implemented various mechanics
  • Psionic Roshambo @ Psionic Roshambo:
    They went all in on streaming, should have been more of a hybrid approach
    +1
  • BigOnYa @ BigOnYa:
    Or free government supplied high speed internet be nice also. Like Obama care. Xdqwerty that's cool, its time consuming but rewarding once done or playable, to see what you've made from scratch. Animations take forever, but worth it.
    +1
  • Xdqwerty @ Xdqwerty:
    @BigOnYa, although the bullets are a bit buggy
    +1
  • Psionic Roshambo @ Psionic Roshambo:
    Not to mention this would be a massive pain to pirate
  • Xdqwerty @ Xdqwerty:
    @BigOnYa,
    and the visual aspect of the game is quite crude (the sprite that looks best is that of the protagonist just because he is a stickman with sunglasses)
    +1
  • BigOnYa @ BigOnYa:
    There is a bullets behaviour you assign to your character, that makes the code easier, under "behaviours"
  • Xdqwerty @ Xdqwerty:
    i meant that when the character is pointing to the right, the bullets spawn where they should, but when he is on the right, they move to the right but the spawn point is incorrect
  • BigOnYa @ BigOnYa:
    Itch.io has lots of free assets also. Under the bullets behavior tab, there is a "rotate bullets" option, can try that. Or in the code can try
    - fire bullet Player.X(PlayerDirection)
  • Xdqwerty @ Xdqwerty:
    im taking a break for today anyway
    +1
  • BigOnYa @ BigOnYa:
    YEa gotta after a while, looking at code for long periods will bug your eyes.
    +1
  • BigOnYa @ BigOnYa:
    That's cool tho, I'm proud of you going back to it, not giving up. It is difficult at first to learn, but fun once you get the hang of it. I think I've watched every tutorial video there is, but I still struggle sometimes to get stuff to work right. But gotta keep trying dif things, and eventually you will get it right.
    +1
  • K3Nv2 @ K3Nv2:
    Lol McDonald's has a grandma mcflurry
  • Xdqwerty @ Xdqwerty:
    @K3Nv2, furry grandma?
    Xdqwerty @ Xdqwerty: @K3Nv2, furry grandma?