|
|
@ -32,6 +32,8 @@ ANDROID_64BIT_API_MIN = 21 # minimal API level that supports 64-bit targets |
|
|
|
|
|
|
|
|
|
|
|
NSWITCH_ENVVARS = ['DEVKITPRO'] |
|
|
|
NSWITCH_ENVVARS = ['DEVKITPRO'] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PSVITA_ENVVARS = ['VITASDK'] |
|
|
|
|
|
|
|
|
|
|
|
# This class does support ONLY r10e and r19c/r20 NDK |
|
|
|
# This class does support ONLY r10e and r19c/r20 NDK |
|
|
|
class Android: |
|
|
|
class Android: |
|
|
|
ctx = None # waf context |
|
|
|
ctx = None # waf context |
|
|
@ -399,7 +401,7 @@ class NintendoSwitch: |
|
|
|
return self.gen_gcc_toolchain_path() + 'strip' |
|
|
|
return self.gen_gcc_toolchain_path() + 'strip' |
|
|
|
|
|
|
|
|
|
|
|
def pkgconfig(self): |
|
|
|
def pkgconfig(self): |
|
|
|
# counter-intuitively, this motherfucker is in portlibs/switch/bin |
|
|
|
# counter-intuitively, this motherfucker is in $DEVKITPRO/portlibs/switch/bin |
|
|
|
return os.path.join(self.portlibs_dir, 'bin', self.gen_toolchain_prefix() + 'pkg-config') |
|
|
|
return os.path.join(self.portlibs_dir, 'bin', self.gen_toolchain_prefix() + 'pkg-config') |
|
|
|
|
|
|
|
|
|
|
|
def cflags(self, cxx = False): |
|
|
|
def cflags(self, cxx = False): |
|
|
@ -410,10 +412,8 @@ class NintendoSwitch: |
|
|
|
cflags += ['-ffunction-sections', '-fdata-sections'] |
|
|
|
cflags += ['-ffunction-sections', '-fdata-sections'] |
|
|
|
# base include dirs |
|
|
|
# base include dirs |
|
|
|
cflags += ['-isystem %s/include' % self.libnx_dir, '-I%s/include' % self.portlibs_dir] |
|
|
|
cflags += ['-isystem %s/include' % self.libnx_dir, '-I%s/include' % self.portlibs_dir] |
|
|
|
if cxx: |
|
|
|
|
|
|
|
# while these are supported, they could fuck up the crappy dynamic linker |
|
|
|
|
|
|
|
cflags += ['-fno-exceptions', '-fno-rtti'] |
|
|
|
|
|
|
|
# the game wants GNU extensions |
|
|
|
# the game wants GNU extensions |
|
|
|
|
|
|
|
if cxx: |
|
|
|
cflags += ['-std=gnu++17', '-D_GNU_SOURCE'] |
|
|
|
cflags += ['-std=gnu++17', '-D_GNU_SOURCE'] |
|
|
|
else: |
|
|
|
else: |
|
|
|
cflags += ['-std=gnu11', '-D_GNU_SOURCE'] |
|
|
|
cflags += ['-std=gnu11', '-D_GNU_SOURCE'] |
|
|
@ -434,6 +434,75 @@ class NintendoSwitch: |
|
|
|
ldflags = [] # ['-lm', '-lstdc++'] |
|
|
|
ldflags = [] # ['-lm', '-lstdc++'] |
|
|
|
return ldflags |
|
|
|
return ldflags |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PSVita: |
|
|
|
|
|
|
|
ctx = None # waf context |
|
|
|
|
|
|
|
arch ='armeabi-v7a-hard' |
|
|
|
|
|
|
|
vitasdk_dir = None |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, ctx): |
|
|
|
|
|
|
|
self.ctx = ctx |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for i in PSVITA_ENVVARS: |
|
|
|
|
|
|
|
self.vitasdk_dir = os.getenv(i) |
|
|
|
|
|
|
|
if self.vitasdk_dir != None: |
|
|
|
|
|
|
|
break |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
ctx.fatal('Set %s environment variable pointing to the VitaSDK directory!' % |
|
|
|
|
|
|
|
' or '.join(PSVITA_ENVVARS)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def gen_toolchain_prefix(self): |
|
|
|
|
|
|
|
return 'arm-vita-eabi-' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def gen_gcc_toolchain_path(self): |
|
|
|
|
|
|
|
return os.path.join(self.vitasdk_dir, 'bin', self.gen_toolchain_prefix()) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def cc(self): |
|
|
|
|
|
|
|
return self.gen_gcc_toolchain_path() + 'gcc' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def cxx(self): |
|
|
|
|
|
|
|
return self.gen_gcc_toolchain_path() + 'g++' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def strip(self): |
|
|
|
|
|
|
|
return self.gen_gcc_toolchain_path() + 'strip' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def ar(self): |
|
|
|
|
|
|
|
return self.gen_gcc_toolchain_path() + 'ar' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def pkgconfig(self): |
|
|
|
|
|
|
|
return self.gen_gcc_toolchain_path() + 'pkg-config' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def cflags(self, cxx = False): |
|
|
|
|
|
|
|
cflags = [] |
|
|
|
|
|
|
|
# arch flags |
|
|
|
|
|
|
|
cflags += ['-D__vita__', '-mtune=cortex-a9', '-mfpu=neon'] |
|
|
|
|
|
|
|
# necessary linker flags |
|
|
|
|
|
|
|
cflags += ['-Wl,-q', '-Wl,-z,nocopyreloc'] |
|
|
|
|
|
|
|
# this optimization is broken in vitasdk |
|
|
|
|
|
|
|
cflags += ['-fno-optimize-sibling-calls'] |
|
|
|
|
|
|
|
# disable some ARM bullshit |
|
|
|
|
|
|
|
cflags += ['-fsigned-char', '-fno-short-enums', '-Wno-attributes'] |
|
|
|
|
|
|
|
# base include dir |
|
|
|
|
|
|
|
cflags += ['-isystem %s/arm-vita-eabi/include' % self.vitasdk_dir] |
|
|
|
|
|
|
|
# SDL include dir |
|
|
|
|
|
|
|
cflags += ['-I%s/arm-vita-eabi/include/SDL2' % self.vitasdk_dir] |
|
|
|
|
|
|
|
# the game wants GNU extensions |
|
|
|
|
|
|
|
if cxx: |
|
|
|
|
|
|
|
cflags += ['-std=gnu++17', '-D_GNU_SOURCE'] |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
cflags += ['-std=gnu11', '-D_GNU_SOURCE'] |
|
|
|
|
|
|
|
return cflags |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# they go before object list |
|
|
|
|
|
|
|
def linkflags(self): |
|
|
|
|
|
|
|
linkflags = ['-Wl,--hash-style=sysv', '-Wl,-q', '-Wl,-z,nocopyreloc', '-mtune=cortex-a9', '-mfpu=neon'] |
|
|
|
|
|
|
|
# enforce no-short-enums again |
|
|
|
|
|
|
|
linkflags += ['-Wl,-no-enum-size-warning', '-fno-short-enums'] |
|
|
|
|
|
|
|
return linkflags |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def ldflags(self): |
|
|
|
|
|
|
|
ldflags = [] |
|
|
|
|
|
|
|
return ldflags |
|
|
|
|
|
|
|
|
|
|
|
def options(opt): |
|
|
|
def options(opt): |
|
|
|
xc = opt.add_option_group('Cross compile options') |
|
|
|
xc = opt.add_option_group('Cross compile options') |
|
|
|
xc.add_option('--android', action='store', dest='ANDROID_OPTS', default=None, |
|
|
|
xc.add_option('--android', action='store', dest='ANDROID_OPTS', default=None, |
|
|
@ -444,6 +513,8 @@ def options(opt): |
|
|
|
help='enable building with MSVC using Wine [default: %default]') |
|
|
|
help='enable building with MSVC using Wine [default: %default]') |
|
|
|
xc.add_option('--nswitch', action='store_true', dest='NSWITCH', default = False, |
|
|
|
xc.add_option('--nswitch', action='store_true', dest='NSWITCH', default = False, |
|
|
|
help ='enable building for Nintendo Switch [default: %default]') |
|
|
|
help ='enable building for Nintendo Switch [default: %default]') |
|
|
|
|
|
|
|
xc.add_option('--psvita', action='store_true', dest='PSVITA', default = False, |
|
|
|
|
|
|
|
help ='enable building for PlayStation Vita [default: %default]') |
|
|
|
|
|
|
|
|
|
|
|
def configure(conf): |
|
|
|
def configure(conf): |
|
|
|
if conf.options.ANDROID_OPTS: |
|
|
|
if conf.options.ANDROID_OPTS: |
|
|
@ -509,10 +580,25 @@ def configure(conf): |
|
|
|
conf.env.HAVE_M = True |
|
|
|
conf.env.HAVE_M = True |
|
|
|
conf.env.LIB_M = ['m'] |
|
|
|
conf.env.LIB_M = ['m'] |
|
|
|
conf.env.DEST_OS = 'nswitch' |
|
|
|
conf.env.DEST_OS = 'nswitch' |
|
|
|
|
|
|
|
elif conf.options.PSVITA: |
|
|
|
|
|
|
|
conf.psvita = psvita = PSVita(conf) |
|
|
|
|
|
|
|
conf.environ['CC'] = psvita.cc() |
|
|
|
|
|
|
|
conf.environ['CXX'] = psvita.cxx() |
|
|
|
|
|
|
|
conf.environ['STRIP'] = psvita.strip() |
|
|
|
|
|
|
|
conf.environ['AR'] = psvita.ar() |
|
|
|
|
|
|
|
conf.env.PKGCONFIG = psvita.pkgconfig() |
|
|
|
|
|
|
|
conf.env.CFLAGS += psvita.cflags() |
|
|
|
|
|
|
|
conf.env.CXXFLAGS += psvita.cflags(True) |
|
|
|
|
|
|
|
conf.env.LINKFLAGS += psvita.linkflags() |
|
|
|
|
|
|
|
conf.env.LDFLAGS += psvita.ldflags() |
|
|
|
|
|
|
|
conf.env.HAVE_M = True |
|
|
|
|
|
|
|
conf.env.LIB_M = ['m'] |
|
|
|
|
|
|
|
conf.env.VRTLD = ['vrtld'] |
|
|
|
|
|
|
|
conf.env.DEST_OS = 'psvita' |
|
|
|
|
|
|
|
|
|
|
|
conf.env.MAGX = conf.options.MAGX |
|
|
|
conf.env.MAGX = conf.options.MAGX |
|
|
|
conf.env.MSVC_WINE = conf.options.MSVC_WINE |
|
|
|
conf.env.MSVC_WINE = conf.options.MSVC_WINE |
|
|
|
MACRO_TO_DESTOS = OrderedDict({ '__ANDROID__' : 'android', '__SWITCH__' : 'nswitch' }) |
|
|
|
MACRO_TO_DESTOS = OrderedDict({ '__ANDROID__' : 'android', '__SWITCH__' : 'nswitch', '__vita__' : 'psvita' }) |
|
|
|
for k in c_config.MACRO_TO_DESTOS: |
|
|
|
for k in c_config.MACRO_TO_DESTOS: |
|
|
|
MACRO_TO_DESTOS[k] = c_config.MACRO_TO_DESTOS[k] # ordering is important |
|
|
|
MACRO_TO_DESTOS[k] = c_config.MACRO_TO_DESTOS[k] # ordering is important |
|
|
|
c_config.MACRO_TO_DESTOS = MACRO_TO_DESTOS |
|
|
|
c_config.MACRO_TO_DESTOS = MACRO_TO_DESTOS |
|
|
|