ios.py 3.6 KB

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