diff options
Diffstat (limited to 'platform/ios/detect.py')
-rw-r--r-- | platform/ios/detect.py | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/platform/ios/detect.py b/platform/ios/detect.py new file mode 100644 index 0000000000..67c90b10a0 --- /dev/null +++ b/platform/ios/detect.py @@ -0,0 +1,152 @@ +import os +import sys +from methods import detect_darwin_sdk_path + + +def is_active(): + return True + + +def get_name(): + return "iOS" + + +def can_build(): + if sys.platform == "darwin" or ("OSXCROSS_IOS" in os.environ): + return True + + return False + + +def get_opts(): + from SCons.Variables import BoolVariable + + return [ + ( + "IOS_TOOLCHAIN_PATH", + "Path to iOS toolchain", + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain", + ), + ("IOS_SDK_PATH", "Path to the iOS SDK", ""), + BoolVariable("ios_simulator", "Build for iOS Simulator", False), + BoolVariable("ios_exceptions", "Enable exceptions", False), + ("ios_triple", "Triple for ios toolchain", ""), + ] + + +def get_flags(): + return [ + ("tools", False), + ("use_volk", False), + ] + + +def configure(env): + ## Build type + + if env["target"].startswith("release"): + env.Append(CPPDEFINES=["NDEBUG", ("NS_BLOCK_ASSERTIONS", 1)]) + if env["optimize"] == "speed": # optimize for speed (default) + # `-O2` is more friendly to debuggers than `-O3`, leading to better crash backtraces + # when using `target=release_debug`. + opt = "-O3" if env["target"] == "release" else "-O2" + env.Append(CCFLAGS=[opt, "-ftree-vectorize", "-fomit-frame-pointer"]) + env.Append(LINKFLAGS=[opt]) + elif env["optimize"] == "size": # optimize for size + env.Append(CCFLAGS=["-Os", "-ftree-vectorize"]) + env.Append(LINKFLAGS=["-Os"]) + + elif env["target"] == "debug": + env.Append(CCFLAGS=["-gdwarf-2", "-O0"]) + env.Append(CPPDEFINES=["_DEBUG", ("DEBUG", 1)]) + + if env["use_lto"]: + env.Append(CCFLAGS=["-flto"]) + env.Append(LINKFLAGS=["-flto"]) + + ## Architecture + env["bits"] = "64" + if env["arch"] != "x86_64": + env["arch"] = "arm64" + + ## Compiler configuration + + # Save this in environment for use by other modules + if "OSXCROSS_IOS" in os.environ: + env["osxcross"] = True + + env["ENV"]["PATH"] = env["IOS_TOOLCHAIN_PATH"] + "/Developer/usr/bin/:" + env["ENV"]["PATH"] + + compiler_path = "$IOS_TOOLCHAIN_PATH/usr/bin/${ios_triple}" + s_compiler_path = "$IOS_TOOLCHAIN_PATH/Developer/usr/bin/" + + ccache_path = os.environ.get("CCACHE") + if ccache_path is 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" + + ## Compile flags + + if env["ios_simulator"]: + detect_darwin_sdk_path("iossimulator", env) + env.Append(ASFLAGS=["-mios-simulator-version-min=13.0"]) + env.Append(CCFLAGS=["-mios-simulator-version-min=13.0"]) + env.extra_suffix = ".simulator" + env.extra_suffix + else: + detect_darwin_sdk_path("ios", env) + env.Append(ASFLAGS=["-miphoneos-version-min=11.0"]) + env.Append(CCFLAGS=["-miphoneos-version-min=11.0"]) + + if env["arch"] == "x86_64": + env["ENV"]["MACOSX_DEPLOYMENT_TARGET"] = "10.9" + env.Append( + CCFLAGS=( + "-fobjc-arc -arch x86_64" + " -fobjc-abi-version=2 -fobjc-legacy-dispatch -fmessage-length=0 -fpascal-strings -fblocks" + " -fasm-blocks -isysroot $IOS_SDK_PATH" + ).split() + ) + env.Append(ASFLAGS=["-arch", "x86_64"]) + elif env["arch"] == "arm64": + env.Append( + CCFLAGS=( + "-fobjc-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" + " -isysroot $IOS_SDK_PATH".split() + ) + ) + env.Append(ASFLAGS=["-arch", "arm64"]) + env.Append(CPPDEFINES=["NEED_LONG_INT"]) + + # Disable exceptions on non-tools (template) builds + if not env["tools"]: + if env["ios_exceptions"]: + env.Append(CCFLAGS=["-fexceptions"]) + else: + env.Append(CCFLAGS=["-fno-exceptions"]) + + # Temp fix for ABS/MAX/MIN macros in iOS SDK blocking compilation + env.Append(CCFLAGS=["-Wno-ambiguous-macro"]) + + env.Prepend( + CPPPATH=[ + "$IOS_SDK_PATH/usr/include", + "$IOS_SDK_PATH/System/Library/Frameworks/AudioUnit.framework/Headers", + ] + ) + + env.Prepend(CPPPATH=["#platform/ios"]) + env.Append(CPPDEFINES=["IOS_ENABLED", "UNIX_ENABLED", "COREAUDIO_ENABLED"]) + + if env["vulkan"]: + env.Append(CPPDEFINES=["VULKAN_ENABLED"]) |