ios.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import codecs
  2. import os
  3. import subprocess
  4. import sys
  5. import common_compiler_flags
  6. from SCons.Variables import BoolVariable
  7. def has_ios_osxcross():
  8. return "OSXCROSS_IOS" in os.environ
  9. def options(opts):
  10. opts.Add(BoolVariable("ios_simulator", "Target iOS Simulator", False))
  11. opts.Add("ios_min_version", "Target minimum iphoneos/iphonesimulator version", "12.0")
  12. opts.Add(
  13. "IOS_TOOLCHAIN_PATH",
  14. "Path to iOS toolchain",
  15. "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain",
  16. )
  17. opts.Add("IOS_SDK_PATH", "Path to the iOS SDK", "")
  18. if has_ios_osxcross():
  19. opts.Add("ios_triple", "Triple for ios toolchain", "")
  20. def exists(env):
  21. return sys.platform == "darwin" or has_ios_osxcross()
  22. def generate(env):
  23. if env["arch"] not in ("universal", "arm64", "x86_64"):
  24. raise ValueError("Only universal, arm64, and x86_64 are supported on iOS. Exiting.")
  25. if env["ios_simulator"]:
  26. sdk_name = "iphonesimulator"
  27. env.Append(CCFLAGS=["-mios-simulator-version-min=" + env["ios_min_version"]])
  28. else:
  29. sdk_name = "iphoneos"
  30. env.Append(CCFLAGS=["-miphoneos-version-min=" + env["ios_min_version"]])
  31. if sys.platform == "darwin":
  32. if env["IOS_SDK_PATH"] == "":
  33. try:
  34. env["IOS_SDK_PATH"] = codecs.utf_8_decode(
  35. subprocess.check_output(["xcrun", "--sdk", sdk_name, "--show-sdk-path"]).strip()
  36. )[0]
  37. except (subprocess.CalledProcessError, OSError):
  38. raise ValueError(
  39. "Failed to find SDK path while running xcrun --sdk {} --show-sdk-path.".format(sdk_name)
  40. )
  41. compiler_path = env["IOS_TOOLCHAIN_PATH"] + "/usr/bin/"
  42. env["CC"] = compiler_path + "clang"
  43. env["CXX"] = compiler_path + "clang++"
  44. env["AR"] = compiler_path + "ar"
  45. env["RANLIB"] = compiler_path + "ranlib"
  46. env["SHLIBSUFFIX"] = ".dylib"
  47. env["ENV"]["PATH"] = env["IOS_TOOLCHAIN_PATH"] + "/Developer/usr/bin/:" + env["ENV"]["PATH"]
  48. else:
  49. # OSXCross
  50. compiler_path = "$IOS_TOOLCHAIN_PATH/usr/bin/${ios_triple}"
  51. env["CC"] = compiler_path + "clang"
  52. env["CXX"] = compiler_path + "clang++"
  53. env["AR"] = compiler_path + "ar"
  54. env["RANLIB"] = compiler_path + "ranlib"
  55. env["SHLIBSUFFIX"] = ".dylib"
  56. env.Prepend(
  57. CPPPATH=[
  58. "$IOS_SDK_PATH/usr/include",
  59. "$IOS_SDK_PATH/System/Library/Frameworks/AudioUnit.framework/Headers",
  60. ]
  61. )
  62. env.Append(CCFLAGS=["-stdlib=libc++"])
  63. binpath = os.path.join(env["IOS_TOOLCHAIN_PATH"], "usr", "bin")
  64. if binpath not in env["ENV"]["PATH"]:
  65. env.PrependENVPath("PATH", binpath)
  66. if env["arch"] == "universal":
  67. if env["ios_simulator"]:
  68. env.Append(LINKFLAGS=["-arch", "x86_64", "-arch", "arm64"])
  69. env.Append(CCFLAGS=["-arch", "x86_64", "-arch", "arm64"])
  70. else:
  71. env.Append(LINKFLAGS=["-arch", "arm64"])
  72. env.Append(CCFLAGS=["-arch", "arm64"])
  73. else:
  74. env.Append(LINKFLAGS=["-arch", env["arch"]])
  75. env.Append(CCFLAGS=["-arch", env["arch"]])
  76. env.Append(CCFLAGS=["-isysroot", env["IOS_SDK_PATH"]])
  77. env.Append(LINKFLAGS=["-isysroot", env["IOS_SDK_PATH"], "-F" + env["IOS_SDK_PATH"]])
  78. env.Append(CPPDEFINES=["IOS_ENABLED", "UNIX_ENABLED"])
  79. common_compiler_flags.generate(env)