ios.py 3.5 KB

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