ios.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import os
  2. import sys
  3. import subprocess
  4. import ios_osxcross
  5. from SCons.Variables import *
  6. if sys.version_info < (3,):
  7. def decode_utf8(x):
  8. return x
  9. else:
  10. import codecs
  11. def decode_utf8(x):
  12. return codecs.utf_8_decode(x)[0]
  13. def options(opts):
  14. opts.Add(BoolVariable("ios_simulator", "Target iOS Simulator", False))
  15. opts.Add("ios_min_version", "Target minimum iphoneos/iphonesimulator version", "10.0")
  16. opts.Add(
  17. "IOS_TOOLCHAIN_PATH",
  18. "Path to iOS toolchain",
  19. "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain",
  20. )
  21. opts.Add("IOS_SDK_PATH", "Path to the iOS SDK", "")
  22. ios_osxcross.options(opts)
  23. def exists(env):
  24. return sys.platform == "darwin" or ios_osxcross.exists(env)
  25. def generate(env):
  26. if env["arch"] not in ("universal", "arm64", "x86_64"):
  27. print("Only universal, arm64, and x86_64 are supported on iOS. Exiting.")
  28. Exit()
  29. if env["ios_simulator"]:
  30. sdk_name = "iphonesimulator"
  31. env.Append(CCFLAGS=["-mios-simulator-version-min=" + env["ios_min_version"]])
  32. else:
  33. sdk_name = "iphoneos"
  34. env.Append(CCFLAGS=["-miphoneos-version-min=" + env["ios_min_version"]])
  35. if sys.platform == "darwin":
  36. if env["IOS_SDK_PATH"] == "":
  37. try:
  38. env["IOS_SDK_PATH"] = decode_utf8(
  39. subprocess.check_output(["xcrun", "--sdk", sdk_name, "--show-sdk-path"]).strip()
  40. )
  41. except (subprocess.CalledProcessError, OSError):
  42. raise ValueError(
  43. "Failed to find SDK path while running xcrun --sdk {} --show-sdk-path.".format(sdk_name)
  44. )
  45. compiler_path = env["IOS_TOOLCHAIN_PATH"] + "/usr/bin/"
  46. env["CC"] = compiler_path + "clang"
  47. env["CXX"] = compiler_path + "clang++"
  48. env["AR"] = compiler_path + "ar"
  49. env["RANLIB"] = compiler_path + "ranlib"
  50. env["SHLIBSUFFIX"] = ".dylib"
  51. env["ENV"]["PATH"] = env["IOS_TOOLCHAIN_PATH"] + "/Developer/usr/bin/:" + env["ENV"]["PATH"]
  52. else:
  53. ios_osxcross.generate(env)
  54. if env["arch"] == "universal":
  55. if env["ios_simulator"]:
  56. env.Append(LINKFLAGS=["-arch", "x86_64", "-arch", "arm64"])
  57. env.Append(CCFLAGS=["-arch", "x86_64", "-arch", "arm64"])
  58. else:
  59. env.Append(LINKFLAGS=["-arch", "arm64"])
  60. env.Append(CCFLAGS=["-arch", "arm64"])
  61. else:
  62. env.Append(LINKFLAGS=["-arch", env["arch"]])
  63. env.Append(CCFLAGS=["-arch", env["arch"]])
  64. env.Append(CCFLAGS=["-isysroot", env["IOS_SDK_PATH"]])
  65. env.Append(LINKFLAGS=["-isysroot", env["IOS_SDK_PATH"], "-F" + env["IOS_SDK_PATH"]])
  66. if env["target"] == "debug":
  67. env.Append(CCFLAGS=["-Og", "-g"])
  68. elif env["target"] == "release":
  69. env.Append(CCFLAGS=["-O3"])