2014-02-10 09:10:30 +08:00
import os
2017-07-01 01:21:38 +08:00
import string
2014-02-10 09:10:30 +08:00
import sys
def is_active ( ) :
2016-10-31 01:44:57 +08:00
return True
2014-05-01 20:53:37 +08:00
2016-10-31 02:05:14 +08:00
2014-02-10 09:10:30 +08:00
def get_name ( ) :
2016-10-31 01:44:57 +08:00
return " iOS "
2014-02-10 09:10:30 +08:00
2016-10-31 02:05:14 +08:00
2014-02-10 09:10:30 +08:00
def can_build ( ) :
2017-08-27 00:53:49 +08:00
if sys . platform == ' darwin ' or ( " OSXCROSS_IOS " in os . environ ) :
2016-10-31 01:44:57 +08:00
return True
2014-02-10 09:10:30 +08:00
2016-10-31 01:44:57 +08:00
return False
2014-02-10 09:10:30 +08:00
2016-10-31 02:05:14 +08:00
2014-02-10 09:10:30 +08:00
def get_opts ( ) :
2017-09-25 12:37:17 +08:00
from SCons . Variables import BoolVariable
2016-10-31 01:44:57 +08:00
return [
2017-07-01 01:21:38 +08:00
( ' IPHONEPLATFORM ' , ' Name of the iPhone platform ' , ' iPhoneOS ' ) ,
( ' IPHONEPATH ' , ' Path to iPhone toolchain ' , ' /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain ' ) ,
( ' IPHONESDK ' , ' Path to the iPhone SDK ' , ' /Applications/Xcode.app/Contents/Developer/Platforms/$ {IPHONEPLATFORM} .platform/Developer/SDKs/$ {IPHONEPLATFORM} .sdk/ ' ) ,
2017-09-25 12:37:17 +08:00
BoolVariable ( ' game_center ' , ' Support for game center ' , True ) ,
BoolVariable ( ' store_kit ' , ' Support for in-app store ' , True ) ,
BoolVariable ( ' icloud ' , ' Support for iCloud ' , True ) ,
BoolVariable ( ' ios_exceptions ' , ' Enable exceptions ' , False ) ,
2016-10-31 01:44:57 +08:00
( ' ios_triple ' , ' Triple for ios toolchain ' , ' ' ) ,
2017-09-25 12:37:17 +08:00
BoolVariable ( ' ios_sim ' , ' Build simulator binary ' , False ) ,
2016-10-31 01:44:57 +08:00
]
2014-02-10 09:10:30 +08:00
2016-10-31 02:05:14 +08:00
2014-02-10 09:10:30 +08:00
def get_flags ( ) :
2016-10-31 01:44:57 +08:00
return [
2017-09-25 12:04:49 +08:00
( ' tools ' , False ) ,
2016-10-31 01:44:57 +08:00
]
2014-02-10 09:10:30 +08:00
def configure ( env ) :
2017-07-01 01:21:38 +08:00
## Build type
2016-10-31 01:44:57 +08:00
2017-07-01 01:21:38 +08:00
if ( env [ " target " ] . startswith ( " release " ) ) :
env . Append ( CPPFLAGS = [ ' -DNDEBUG ' , ' -DNS_BLOCK_ASSERTIONS=1 ' ] )
2017-11-02 16:11:29 +08:00
env . Append ( CPPFLAGS = [ ' -O2 ' , ' -ftree-vectorize ' , ' -fomit-frame-pointer ' , ' -ffast-math ' , ' -funsafe-math-optimizations ' ] )
env . Append ( LINKFLAGS = [ ' -O2 ' ] )
2016-10-31 01:44:57 +08:00
2017-07-01 01:21:38 +08:00
if env [ " target " ] == " release_debug " :
env . Append ( CPPFLAGS = [ ' -DDEBUG_ENABLED ' ] )
elif ( env [ " target " ] == " debug " ) :
env . Append ( CPPFLAGS = [ ' -D_DEBUG ' , ' -DDEBUG=1 ' , ' -gdwarf-2 ' , ' -O0 ' , ' -DDEBUG_ENABLED ' , ' -DDEBUG_MEMORY_ENABLED ' ] )
2017-11-02 16:11:29 +08:00
if ( env [ " use_lto " ] ) :
env . Append ( CPPFLAGS = [ ' -flto ' ] )
env . Append ( LINKFLAGS = [ ' -flto ' ] )
2017-07-01 01:21:38 +08:00
## Architecture
2017-10-02 23:01:43 +08:00
if env [ " ios_sim " ] and not ( " arch " in env ) :
env [ " arch " ] = " x86 "
2016-10-31 01:44:57 +08:00
2017-10-02 23:01:43 +08:00
if env [ " arch " ] == " x86 " : # i386, simulator
2016-10-31 01:57:40 +08:00
env [ " bits " ] = " 32 "
2017-10-02 23:01:43 +08:00
elif env [ " arch " ] == " x86_64 " :
env [ " bits " ] = " 64 "
2017-05-23 21:14:20 +08:00
elif ( env [ " arch " ] == " arm " or env [ " arch " ] == " arm32 " or env [ " arch " ] == " armv7 " or env [ " bits " ] == " 32 " ) : # arm
env [ " arch " ] = " arm "
env [ " bits " ] = " 32 "
else : # armv64
env [ " arch " ] = " arm64 "
2016-10-31 01:44:57 +08:00
env [ " bits " ] = " 64 "
2017-07-01 01:21:38 +08:00
## Compiler configuration
env [ ' ENV ' ] [ ' PATH ' ] = env [ ' IPHONEPATH ' ] + " /Developer/usr/bin/: " + env [ ' ENV ' ] [ ' PATH ' ]
2017-11-10 08:07:28 +08:00
compiler_path = ' $IPHONEPATH/usr/bin/$ {ios_triple} '
s_compiler_path = ' $IPHONEPATH/Developer/usr/bin/ '
ccache_path = os . environ . get ( " CCACHE " )
if ccache_path == None :
env [ ' CC ' ] = compiler_path + ' clang '
env [ ' CXX ' ] = compiler_path + ' clang++ '
env [ ' S_compiler ' ] = s_compiler_path + ' gcc '
else :
# there aren't any ccache wrappers available for iOS,
# to enable caching we need to prepend the path to the ccache binary
env [ ' CC ' ] = ccache_path + ' ' + compiler_path + ' clang '
env [ ' CXX ' ] = ccache_path + ' ' + compiler_path + ' clang++ '
env [ ' S_compiler ' ] = ccache_path + ' ' + s_compiler_path + ' gcc '
env [ ' AR ' ] = compiler_path + ' ar '
env [ ' RANLIB ' ] = compiler_path + ' ranlib '
2017-07-01 01:21:38 +08:00
## Compile flags
2017-10-02 23:01:43 +08:00
if ( env [ " arch " ] == " x86 " or env [ " arch " ] == " x86_64 " ) :
2017-07-01 01:21:38 +08:00
env [ ' IPHONEPLATFORM ' ] = ' iPhoneSimulator '
2017-10-02 23:01:43 +08:00
env [ ' ENV ' ] [ ' MACOSX_DEPLOYMENT_TARGET ' ] = ' 10.9 '
arch_flag = " i386 " if env [ " arch " ] == " x86 " else env [ " arch " ]
env . Append ( CCFLAGS = ( ' -arch ' + arch_flag + ' -fobjc-abi-version=2 -fobjc-legacy-dispatch -fmessage-length=0 -fpascal-strings -fblocks -fasm-blocks -isysroot $IPHONESDK -mios-simulator-version-min=9.0 -DCUSTOM_MATRIX_TRANSFORM_H= \\ \" build/iphone/matrix4_iphone.h \\ \" -DCUSTOM_VECTOR3_TRANSFORM_H= \\ \" build/iphone/vector3_iphone.h \\ \" ' ) . split ( ) )
2017-07-01 01:21:38 +08:00
elif ( env [ " arch " ] == " arm " ) :
2017-08-27 00:53:49 +08:00
env . Append ( CCFLAGS = ' -fno-objc-arc -arch armv7 -fmessage-length=0 -fno-strict-aliasing -fdiagnostics-print-source-range-info -fdiagnostics-show-category=id -fdiagnostics-parseable-fixits -fpascal-strings -fblocks -isysroot $IPHONESDK -fvisibility=hidden -mthumb " -DIBOutlet=__attribute__((iboutlet)) " " -DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName))) " " -DIBAction=void)__attribute__((ibaction) " -miphoneos-version-min=9.0 -MMD -MT dependencies ' . split ( ) )
2017-07-01 01:21:38 +08:00
elif ( env [ " arch " ] == " arm64 " ) :
2017-08-27 00:53:49 +08:00
env . Append ( CCFLAGS = ' -fno-objc-arc -arch arm64 -fmessage-length=0 -fno-strict-aliasing -fdiagnostics-print-source-range-info -fdiagnostics-show-category=id -fdiagnostics-parseable-fixits -fpascal-strings -fblocks -fvisibility=hidden -MMD -MT dependencies -miphoneos-version-min=9.0 -isysroot $IPHONESDK ' . split ( ) )
2016-10-31 01:44:57 +08:00
env . Append ( CPPFLAGS = [ ' -DNEED_LONG_INT ' ] )
env . Append ( CPPFLAGS = [ ' -DLIBYUV_DISABLE_NEON ' ] )
2017-09-25 12:37:17 +08:00
if env [ ' ios_exceptions ' ] :
2017-07-01 01:21:38 +08:00
env . Append ( CPPFLAGS = [ ' -fexceptions ' ] )
else :
env . Append ( CPPFLAGS = [ ' -fno-exceptions ' ] )
## Link flags
2017-10-02 23:01:43 +08:00
if ( env [ " arch " ] == " x86 " or env [ " arch " ] == " x86_64 " ) :
arch_flag = " i386 " if env [ " arch " ] == " x86 " else env [ " arch " ]
env . Append ( LINKFLAGS = [ ' -arch ' , arch_flag , ' -mios-simulator-version-min=9.0 ' ,
2016-10-31 01:44:57 +08:00
' -isysroot ' , ' $IPHONESDK ' ,
' -Xlinker ' ,
' -objc_abi_version ' ,
' -Xlinker ' , ' 2 ' ,
' -F$IPHONESDK ' ,
] )
2017-07-01 01:21:38 +08:00
elif ( env [ " arch " ] == " arm " ) :
env . Append ( LINKFLAGS = [ ' -arch ' , ' armv7 ' , ' -Wl,-dead_strip ' , ' -miphoneos-version-min=9.0 ' ] )
if ( env [ " arch " ] == " arm64 " ) :
env . Append ( LINKFLAGS = [ ' -arch ' , ' arm64 ' , ' -Wl,-dead_strip ' , ' -miphoneos-version-min=9.0 ' ] )
env . Append ( LINKFLAGS = [ ' -isysroot ' , ' $IPHONESDK ' ,
' -framework ' , ' AudioToolbox ' ,
' -framework ' , ' AVFoundation ' ,
' -framework ' , ' CoreAudio ' ,
' -framework ' , ' CoreGraphics ' ,
' -framework ' , ' CoreMedia ' ,
' -framework ' , ' CoreMotion ' ,
' -framework ' , ' Foundation ' ,
' -framework ' , ' GameController ' ,
' -framework ' , ' MediaPlayer ' ,
' -framework ' , ' OpenGLES ' ,
' -framework ' , ' QuartzCore ' ,
' -framework ' , ' Security ' ,
' -framework ' , ' SystemConfiguration ' ,
' -framework ' , ' UIKit ' ,
] )
# Feature options
2017-09-25 12:37:17 +08:00
if env [ ' game_center ' ] :
2017-05-27 10:40:39 +08:00
env . Append ( CPPFLAGS = [ ' -DGAME_CENTER_ENABLED ' ] )
2016-10-31 01:44:57 +08:00
env . Append ( LINKFLAGS = [ ' -framework ' , ' GameKit ' ] )
2017-09-25 12:37:17 +08:00
if env [ ' store_kit ' ] :
2016-10-31 01:44:57 +08:00
env . Append ( CPPFLAGS = [ ' -DSTOREKIT_ENABLED ' ] )
env . Append ( LINKFLAGS = [ ' -framework ' , ' StoreKit ' ] )
2017-09-25 12:37:17 +08:00
if env [ ' icloud ' ] :
2016-10-31 01:44:57 +08:00
env . Append ( CPPFLAGS = [ ' -DICLOUD_ENABLED ' ] )
2017-07-01 01:21:38 +08:00
env . Append ( CPPPATH = [ ' $IPHONESDK/usr/include ' ,
' $IPHONESDK/System/Library/Frameworks/OpenGLES.framework/Headers ' ,
' $IPHONESDK/System/Library/Frameworks/AudioUnit.framework/Headers ' ,
] )
2016-10-31 01:44:57 +08:00
env [ ' ENV ' ] [ ' CODESIGN_ALLOCATE ' ] = ' /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate '
2017-07-01 01:21:38 +08:00
env . Append ( CPPPATH = [ ' #platform/iphone ' ] )
2017-11-20 00:52:18 +08:00
env . Append ( CPPFLAGS = [ ' -DIPHONE_ENABLED ' , ' -DUNIX_ENABLED ' , ' -DGLES_ENABLED ' , ' -DMPC_FIXED_POINT ' , ' -DCOREAUDIO_ENABLED ' ] )
2016-10-31 01:44:57 +08:00
# TODO: Move that to opus module's config
2017-09-25 12:27:32 +08:00
if ' module_opus_enabled ' in env and env [ ' module_opus_enabled ' ] :
2016-10-31 01:57:40 +08:00
env . opus_fixed_point = " yes "
2017-07-01 01:21:38 +08:00
if ( env [ " arch " ] == " arm " ) :
2016-10-31 01:44:57 +08:00
env . Append ( CFLAGS = [ " -DOPUS_ARM_OPT " ] )
2017-07-01 01:21:38 +08:00
elif ( env [ " arch " ] == " arm64 " ) :
env . Append ( CFLAGS = [ " -DOPUS_ARM64_OPT " ] )