diff --git a/SConstruct b/SConstruct index 136abcde..881b44dc 100644 --- a/SConstruct +++ b/SConstruct @@ -2,6 +2,15 @@ import os import sys +import subprocess + +if sys.version_info < (3,): + def decode_utf8(x): + return x +else: + import codecs + def decode_utf8(x): + return codecs.utf_8_decode(x)[0] # Workaround for MinGW. See: # http://www.scons.org/wiki/LongCmdLinesOnWin32 @@ -64,7 +73,7 @@ opts.Add(EnumVariable( 'platform', 'Target platform', host_platform, - allowed_values=('linux', 'osx', 'windows', 'android'), + allowed_values=('linux', 'osx', 'windows', 'android', 'ios'), ignorecase=2 )) opts.Add(EnumVariable( @@ -114,6 +123,17 @@ opts.Add(EnumVariable( 'armv7', ['armv7','arm64v8','x86','x86_64'] )) +opts.Add(EnumVariable( + 'ios_arch', + 'Target iOS architecture', + 'arm64', + ['armv7', 'arm64', 'x86_64'] +)) +opts.Add( + 'IPHONEPATH', + 'Path to iPhone toolchain', + '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain', +) opts.Add( 'android_api_level', 'Target Android API level', @@ -194,6 +214,43 @@ elif env['platform'] == 'osx': elif env['target'] == 'release': env.Append(CCFLAGS=['-O3']) +elif env['platform'] == 'ios': + if env['ios_arch'] == 'x86_64': + sdk_name = 'iphonesimulator' + env.Append(CCFLAGS=['-mios-simulator-version-min=10.0']) + else: + sdk_name = 'iphoneos' + env.Append(CCFLAGS=['-miphoneos-version-min=10.0']) + + try: + sdk_path = decode_utf8(subprocess.check_output(['xcrun', '--sdk', sdk_name, '--show-sdk-path']).strip()) + except (subprocess.CalledProcessError, OSError): + raise ValueError("Failed to find SDK path while running xcrun --sdk {} --show-sdk-path.".format(sdk_name)) + + compiler_path = env['IPHONEPATH'] + '/usr/bin/' + env['ENV']['PATH'] = env['IPHONEPATH'] + "/Developer/usr/bin/:" + env['ENV']['PATH'] + + env['CC'] = compiler_path + 'clang' + env['CXX'] = compiler_path + 'clang++' + env['AR'] = compiler_path + 'ar' + env['RANLIB'] = compiler_path + 'ranlib' + + env.Append(CCFLAGS=['-g', '-std=c++14', '-arch', env['ios_arch'], '-isysroot', sdk_path]) + env.Append(LINKFLAGS=[ + '-arch', + env['ios_arch'], + '-framework', + 'Cocoa', + '-Wl,-undefined,dynamic_lookup', + '-isysroot', sdk_path, + '-F' + sdk_path + ]) + + if env['target'] == 'debug': + env.Append(CCFLAGS=['-Og']) + elif env['target'] == 'release': + env.Append(CCFLAGS=['-O3']) + elif env['platform'] == 'windows': if host_platform == 'windows' and not env['use_mingw']: # MSVC @@ -312,11 +369,17 @@ sources = [] add_sources(sources, 'src/core', 'cpp') add_sources(sources, 'src/gen', 'cpp') +arch_suffix = env['bits'] +if env['platform'] == 'android': + arch_suffix = env['android_arch'] +if env['platform'] == 'ios': + arch_suffix = env['ios_arch'] + library = env.StaticLibrary( target='bin/' + 'libgodot-cpp.{}.{}.{}{}'.format( env['platform'], env['target'], - env['bits'] if env['platform'] != 'android' else env['android_arch'], + arch_suffix, env['LIBSUFFIX'] ), source=sources )