iphone.mk 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. ifeq ($(_THEOS_TARGET_LOADED),)
  2. _THEOS_TARGET_LOADED := 1
  3. THEOS_TARGET_NAME := iphone
  4. _THEOS_TARGET_CC := clang
  5. _THEOS_TARGET_CXX := clang++
  6. _THEOS_TARGET_ARG_ORDER := 1 2
  7. ifeq ($(__THEOS_TARGET_ARG_1),clang)
  8. _THEOS_TARGET_ARG_ORDER := 2 3
  9. else ifeq ($(__THEOS_TARGET_ARG_1),gcc)
  10. _THEOS_TARGET_ARG_ORDER := 2 3
  11. endif
  12. # A version specified as a target argument overrides all previous definitions.
  13. _SDKVERSION := $(or $(__THEOS_TARGET_ARG_$(word 1,$(_THEOS_TARGET_ARG_ORDER))),$(SDKVERSION_$(THEOS_CURRENT_ARCH)),$(SDKVERSION))
  14. _THEOS_TARGET_SDK_VERSION := $(or $(_SDKVERSION),latest)
  15. _THEOS_TARGET_INCLUDE_SDK_VERSION := $(or $(INCLUDE_SDKVERSION),$(INCLUDE_SDKVERSION_$(THEOS_CURRENT_ARCH)),latest)
  16. _SDK_DIR := $(THEOS_PLATFORM_SDK_ROOT)/Platforms/iPhoneOS.platform/Developer/SDKs
  17. _IOS_SDKS := $(sort $(patsubst $(_SDK_DIR)/iPhoneOS%.sdk,%,$(wildcard $(_SDK_DIR)/iPhoneOS*.sdk)))
  18. ifeq ($(words $(_IOS_SDKS)),0)
  19. before-all::
  20. @$(PRINT_FORMAT_ERROR) "You do not have an SDK in $(_SDK_DIR)." >&2; exit 1
  21. endif
  22. _LATEST_SDK := $(lastword $(_IOS_SDKS))
  23. ifeq ($(_THEOS_TARGET_SDK_VERSION),latest)
  24. override _THEOS_TARGET_SDK_VERSION := $(_LATEST_SDK)
  25. endif
  26. ifeq ($(_THEOS_TARGET_INCLUDE_SDK_VERSION),latest)
  27. override _THEOS_TARGET_INCLUDE_SDK_VERSION := $(_LATEST_SDK)
  28. endif
  29. # We have to figure out the target version here, as we need it in the calculation of the deployment version.
  30. _TARGET_VERSION_GE_8_4 = $(call __simplify,_TARGET_VERSION_GE_8_4,$(shell $(THEOS_BIN_PATH)/vercmp.pl $(_THEOS_TARGET_SDK_VERSION) ge 8.4))
  31. _TARGET_VERSION_GE_7_0 = $(call __simplify,_TARGET_VERSION_GE_7_0,$(shell $(THEOS_BIN_PATH)/vercmp.pl $(_THEOS_TARGET_SDK_VERSION) ge 7.0))
  32. _TARGET_VERSION_GE_6_0 = $(call __simplify,_TARGET_VERSION_GE_6_0,$(shell $(THEOS_BIN_PATH)/vercmp.pl $(_THEOS_TARGET_SDK_VERSION) ge 6.0))
  33. _TARGET_VERSION_GE_4_0 = $(call __simplify,_TARGET_VERSION_GE_4_0,$(shell $(THEOS_BIN_PATH)/vercmp.pl $(_THEOS_TARGET_SDK_VERSION) ge 4.0))
  34. _TARGET_VERSION_GE_3_0 = $(call __simplify,_TARGET_VERSION_GE_3_0,$(shell $(THEOS_BIN_PATH)/vercmp.pl $(_THEOS_TARGET_SDK_VERSION) ge 3.0))
  35. ifeq ($(_TARGET_VERSION_GE_7_0),1)
  36. _THEOS_TARGET_DEFAULT_IPHONEOS_DEPLOYMENT_VERSION := 5.0
  37. else
  38. ifeq ($(_TARGET_VERSION_GE_6_0),1)
  39. _THEOS_TARGET_DEFAULT_IPHONEOS_DEPLOYMENT_VERSION := 4.3
  40. else
  41. _THEOS_TARGET_DEFAULT_IPHONEOS_DEPLOYMENT_VERSION := 3.0
  42. endif
  43. endif
  44. _THEOS_TARGET_IPHONEOS_DEPLOYMENT_VERSION := $(or $(__THEOS_TARGET_ARG_$(word 2,$(_THEOS_TARGET_ARG_ORDER))),$(TARGET_IPHONEOS_DEPLOYMENT_VERSION_$(THEOS_CURRENT_ARCH)),$(TARGET_IPHONEOS_DEPLOYMENT_VERSION),$(_SDKVERSION),$(_THEOS_TARGET_DEFAULT_IPHONEOS_DEPLOYMENT_VERSION))
  45. ifeq ($(_THEOS_TARGET_IPHONEOS_DEPLOYMENT_VERSION),latest)
  46. override _THEOS_TARGET_IPHONEOS_DEPLOYMENT_VERSION := $(_LATEST_SDK)
  47. endif
  48. _DEPLOY_VERSION_GE_5_0 = $(call __simplify,_DEPLOY_VERSION_GE_5_0,$(shell $(THEOS_BIN_PATH)/vercmp.pl $(_THEOS_TARGET_IPHONEOS_DEPLOYMENT_VERSION) ge 5.0))
  49. _DEPLOY_VERSION_GE_3_0 = $(call __simplify,_DEPLOY_VERSION_GE_3_0,$(shell $(THEOS_BIN_PATH)/vercmp.pl $(_THEOS_TARGET_IPHONEOS_DEPLOYMENT_VERSION) ge 3.0))
  50. _DEPLOY_VERSION_LT_4_3 = $(call __simplify,_DEPLOY_VERSION_LT_4_3,$(shell $(THEOS_BIN_PATH)/vercmp.pl $(_THEOS_TARGET_IPHONEOS_DEPLOYMENT_VERSION) lt 4.3))
  51. ifeq ($(_TARGET_VERSION_GE_6_0)$(_DEPLOY_VERSION_GE_3_0)$(_DEPLOY_VERSION_LT_4_3),111)
  52. ifeq ($(ARCHS)$(IPHONE_ARCHS)$(_THEOS_TARGET_WARNED_DEPLOY),)
  53. before-all::
  54. @$(PRINT_FORMAT_WARNING) "Deploying to iOS 3.0 while building for 6.0 will generate armv7-only binaries." >&2
  55. export _THEOS_TARGET_WARNED_DEPLOY := 1
  56. endif
  57. endif
  58. ifeq ($(SYSROOT),)
  59. SYSROOT ?= $(THEOS_PLATFORM_SDK_ROOT)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$(_THEOS_TARGET_SDK_VERSION).sdk
  60. ISYSROOT ?= $(THEOS_PLATFORM_SDK_ROOT)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$(_THEOS_TARGET_INCLUDE_SDK_VERSION).sdk
  61. else
  62. ISYSROOT ?= $(SYSROOT)
  63. endif
  64. TARGET_CC ?= xcrun -sdk iphoneos $(_THEOS_TARGET_CC)
  65. TARGET_CXX ?= xcrun -sdk iphoneos $(_THEOS_TARGET_CXX)
  66. TARGET_SWIFT = xcrun -sdk iphoneos swift
  67. TARGET_LD ?= xcrun -sdk iphoneos $(_THEOS_TARGET_CXX)
  68. TARGET_STRIP ?= xcrun -sdk iphoneos strip
  69. TARGET_STRIP_FLAGS ?= -x
  70. TARGET_CODESIGN_ALLOCATE ?= "$(shell xcrun -sdk iphoneos -find codesign_allocate)"
  71. TARGET_CODESIGN ?= ldid2
  72. TARGET_CODESIGN_FLAGS ?= -S
  73. TARGET_PRIVATE_FRAMEWORK_PATH = $(SYSROOT)/System/Library/PrivateFrameworks
  74. TARGET_PRIVATE_FRAMEWORK_INCLUDE_PATH = $(ISYSROOT)/System/Library/PrivateFrameworks
  75. include $(THEOS_MAKE_PATH)/targets/_common/darwin.mk
  76. include $(THEOS_MAKE_PATH)/targets/_common/darwin_flat_bundle.mk
  77. ifeq ($(_TARGET_VERSION_GE_7_0),1) # >= 7.0 {
  78. ARCHS ?= armv7 arm64
  79. else # } < 7.0 {
  80. ifeq ($(_TARGET_VERSION_GE_6_0),1) # >= 6.0 {
  81. ifeq ($(_TARGET_VERSION_GE_7_0)$(_DEPLOY_VERSION_GE_5_0),11) # >= 7.0, Deploy >= 5.0 {
  82. ARCHS ?= armv7 arm64
  83. else # } else {
  84. ARCHS ?= armv7
  85. endif # }
  86. else # } < 6.0 {
  87. ifeq ($(_TARGET_VERSION_GE_3_0),1) # >= 3.0 {
  88. ARCHS ?= armv6 armv7
  89. else # } < 3.0 {
  90. ARCHS ?= armv6
  91. endif # }
  92. endif # }
  93. endif # }
  94. NEUTRAL_ARCH = armv7
  95. ifeq ($(_TARGET_VERSION_GE_8_4),1)
  96. MODULESFLAGS := -fmodules -fcxx-modules -fmodule-name=$(THEOS_CURRENT_INSTANCE) -fbuild-session-file=$(_THEOS_BUILD_SESSION_FILE) -fmodules-prune-after=345600 -fmodules-prune-interval=86400 -fmodules-validate-once-per-build-session
  97. else
  98. MODULESFLAGS :=
  99. endif
  100. # “iOS 9 changed the 32-bit pagesize on 64-bit CPUs from 4096 bytes to 16384:
  101. # all 32-bit binaries must now be compiled with -Wl,-segalign,4000.”
  102. # https://twitter.com/saurik/status/654198997024796672
  103. ifeq ($(THEOS_CURRENT_ARCH),arm64)
  104. LEGACYFLAGS :=
  105. else
  106. LEGACYFLAGS := -Wl,-segalign,4000
  107. endif
  108. SDKFLAGS := -D__IPHONE_OS_VERSION_MIN_REQUIRED=__IPHONE_$(subst .,_,$(_THEOS_TARGET_IPHONEOS_DEPLOYMENT_VERSION))
  109. VERSIONFLAGS := -miphoneos-version-min=$(_THEOS_TARGET_IPHONEOS_DEPLOYMENT_VERSION)
  110. _THEOS_TARGET_CFLAGS := -isysroot "$(ISYSROOT)" $(SDKFLAGS) $(VERSIONFLAGS) $(_THEOS_TARGET_CC_CFLAGS) $(MODULESFLAGS)
  111. _THEOS_TARGET_LDFLAGS := -isysroot "$(SYSROOT)" $(SDKFLAGS) $(VERSIONFLAGS) $(LEGACYFLAGS) -multiply_defined suppress
  112. _THEOS_TARGET_SWIFTFLAGS := -sdk "$(ISYSROOT)" $(SDKFLAGS) $(_THEOS_TARGET_CC_SWIFTFLAGS)
  113. _THEOS_TARGET_SWIFT_TARGET := apple-ios$(_THEOS_TARGET_SDK_VERSION)
  114. _THEOS_TARGET_SWIFT_LDPATH := $(THEOS_PLATFORM_SDK_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos
  115. _THEOS_TARGET_SWIFT_OBJPATH := $(THEOS_PLATFORM_SDK_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift_static/iphoneos
  116. _THEOS_TARGET_SWIFT_VERSION := $(shell $(TARGET_SWIFT) --version | head -1 | cut -d' ' -f4)
  117. TARGET_INSTALL_REMOTE := $(_THEOS_TRUE)
  118. _THEOS_TARGET_DEFAULT_PACKAGE_FORMAT := deb
  119. endif