iphone.mk 5.9 KB

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