AddQtIosApp.cmake 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. #
  2. # CMake Script by Olivier Le Doeuff
  3. # Copyright (c) 2019 - All Right Reserved
  4. # add_qt_ios_app help you deploy iOs application with Qt.
  5. #
  6. cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)
  7. # find the Qt root directoryn might break in future release
  8. # Dependant on Qt5
  9. if(NOT Qt5Core_DIR)
  10. find_package(Qt5Core REQUIRED)
  11. endif()
  12. get_filename_component(QT_IOS_QT_ROOT "${Qt5Core_DIR}/../../.." ABSOLUTE)
  13. if(QT_IOS_QT_ROOT)
  14. message(STATUS "Found Qt Sdk for Ios: ${QT_IOS_QT_ROOT}")
  15. else()
  16. message(FATAL_ERROR "Fail to find Qt Sdk path.")
  17. endif()
  18. # Keep track of our own directory for future use (and default value of plist.in)
  19. set(QT_IOS_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR})
  20. # This little macro lets you set any Xcode specific property.
  21. # This is from iOs CMake Toolchain
  22. macro(qt_ios_set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE XCODE_RELVERSION)
  23. set(XCODE_RELVERSION_I "${XCODE_RELVERSION}")
  24. if(XCODE_RELVERSION_I STREQUAL "All")
  25. set_property(TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY} "${XCODE_VALUE}")
  26. else()
  27. set_property(TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY}[variant=${XCODE_RELVERSION_I}] "${XCODE_VALUE}")
  28. endif()
  29. endmacro() # qt_ios_set_xcode_property
  30. # We need that to parse arguments
  31. include(CMakeParseArguments)
  32. # Usage :
  33. # add_qt_ios_app(MyApp
  34. # NAME "My App"
  35. # BUNDLE_IDENTIFIER "com.company.app"
  36. # VERSION "1.2.3"
  37. # SHORT_VERSION "1.2.3"
  38. # LONG_VERSION "1.2.3.456"
  39. # CUSTOM_PLIST "path/to/Info.plist.in"
  40. # CODE_SIGN_IDENTITY "iPhone Developer"
  41. # TEAM_ID "AAAAAAAA"
  42. # PROVISIONING_PROFILE_SPECIFIER "profile-name"
  43. # COPYRIGHT "My Cool Copyright"
  44. # QML_DIR "${QT_IOS_QT_ROOT}/qml"
  45. # ASSET_DIR "path/to/Assets.xcassets"
  46. # MAIN_STORYBOARD "/path/to/Main.storyboard"
  47. # LAUNCHSCREEN_STORYBOARD "path/to/LaunchScreen.storyboard"
  48. # CATALOG_APPICON "AppIcon"
  49. # CATALOG_LAUNCHIMAGE "LaunchImage"
  50. # ORIENTATION_PORTRAIT
  51. # ORIENTATION_PORTRAIT_UPDOWN
  52. # ORIENTATION_LANDSCAPE_LEFT
  53. # ORIENTATION_LANDSCAPE_RIGHT
  54. # PHOTO_LIBRARY_USAGE_DESCRIPTION "My App needs to access your photo library."
  55. # SUPPORT_IPHONE
  56. # SUPPORT_IPAD
  57. # REQUIRES_FULL_SCREEN
  58. # HIDDEN_STATUS_BAR
  59. # IPA
  60. # UPLOAD_SYMBOL
  61. # DISTRIBUTION_METHOD "app-store"
  62. # VERBOSE
  63. # )
  64. function(add_qt_ios_app TARGET)
  65. set(QT_IOS_OPTIONS VERBOSE
  66. ORIENTATION_PORTRAIT
  67. ORIENTATION_PORTRAIT_UPDOWN
  68. ORIENTATION_LANDSCAPE_LEFT
  69. ORIENTATION_LANDSCAPE_RIGHT
  70. SUPPORT_IPHONE
  71. SUPPORT_IPAD
  72. REQUIRES_FULL_SCREEN
  73. HIDDEN_STATUS_BAR
  74. IPA
  75. UPLOAD_SYMBOL
  76. ITS_ENCRYPTION_EXPORT_COMPLIANCE_CODE
  77. )
  78. set(QT_IOS_ONE_VALUE_ARG NAME
  79. BUNDLE_IDENTIFIER
  80. VERSION
  81. SHORT_VERSION
  82. LONG_VERSION
  83. CUSTOM_PLIST
  84. CODE_SIGN_IDENTITY
  85. TEAM_ID
  86. PROVISIONING_PROFILE_SPECIFIER
  87. COPYRIGHT
  88. QML_DIR
  89. ASSET_DIR
  90. LAUNCHSCREEN_STORYBOARD
  91. MAIN_STORYBOARD
  92. CATALOG_APPICON
  93. CATALOG_LAUNCHIMAGE
  94. DISTRIBUTION_METHOD
  95. PHOTO_LIBRARY_USAGE_DESCRIPTION
  96. )
  97. set(QT_IOS_MULTI_VALUE_ARG
  98. RESOURCE_FILES
  99. )
  100. # parse the macro arguments
  101. cmake_parse_arguments(ARGIOS "${QT_IOS_OPTIONS}" "${QT_IOS_ONE_VALUE_ARG}" "${QT_IOS_MULTI_VALUE_ARG}" ${ARGN})
  102. # Copy arg variables to local variables
  103. set(QT_IOS_TARGET ${TARGET})
  104. set(QT_IOS_NAME ${ARGIOS_NAME})
  105. set(QT_IOS_BUNDLE_IDENTIFIER ${ARGIOS_BUNDLE_IDENTIFIER})
  106. set(QT_IOS_VERSION ${ARGIOS_VERSION})
  107. set(QT_IOS_SHORT_VERSION ${ARGIOS_SHORT_VERSION})
  108. set(QT_IOS_LONG_VERSION ${ARGIOS_LONG_VERSION})
  109. set(QT_IOS_CUSTOM_PLIST ${ARGIOS_CUSTOM_PLIST})
  110. if(NOT QT_IOS_CODE_SIGN_IDENTITY)
  111. set(QT_IOS_CODE_SIGN_IDENTITY ${ARGIOS_CODE_SIGN_IDENTITY})
  112. endif()
  113. if("${QT_IOS_CODE_SIGN_IDENTITY}" STREQUAL "")
  114. set(QT_IOS_CODE_SIGN_IDENTITY "iPhone Developer")
  115. endif()
  116. if(NOT QT_IOS_TEAM_ID)
  117. set(QT_IOS_TEAM_ID ${ARGIOS_TEAM_ID})
  118. endif()
  119. if(NOT QT_IOS_PROVISIONING_PROFILE_SPECIFIER AND ARGIOS_PROVISIONING_PROFILE_SPECIFIER)
  120. set(QT_IOS_PROVISIONING_PROFILE_SPECIFIER ${ARGIOS_PROVISIONING_PROFILE_SPECIFIER})
  121. endif()
  122. set(QT_IOS_COPYRIGHT ${ARGIOS_COPYRIGHT})
  123. set(QT_IOS_QML_DIR ${ARGIOS_QML_DIR})
  124. set(QT_IOS_ASSET_DIR ${ARGIOS_ASSET_DIR})
  125. set(QT_IOS_LAUNCHSCREEN_STORYBOARD ${ARGIOS_LAUNCHSCREEN_STORYBOARD})
  126. set(QT_IOS_MAIN_STORYBOARD ${ARGIOS_MAIN_STORYBOARD})
  127. set(QT_IOS_CATALOG_APPICON ${ARGIOS_CATALOG_APPICON})
  128. set(QT_IOS_CATALOG_LAUNCHIMAGE ${ARGIOS_CATALOG_LAUNCHIMAGE})
  129. set(QT_IOS_RESOURCE_FILES "${ARGIOS_RESOURCE_FILES}")
  130. set(QT_IOS_ORIENTATION_PORTRAIT ${ARGIOS_ORIENTATION_PORTRAIT})
  131. set(QT_IOS_ORIENTATION_PORTRAIT_UPDOWN ${ARGIOS_ORIENTATION_PORTRAIT_UPDOWN})
  132. set(QT_IOS_ORIENTATION_LANDSCAPE_LEFT ${ARGIOS_ORIENTATION_LANDSCAPE_LEFT})
  133. set(QT_IOS_ORIENTATION_LANDSCAPE_RIGHT ${ARGIOS_ORIENTATION_LANDSCAPE_RIGHT})
  134. set(QT_IOS_SUPPORT_IPHONE ${ARGIOS_SUPPORT_IPHONE})
  135. set(QT_IOS_SUPPORT_IPAD ${ARGIOS_SUPPORT_IPAD})
  136. set(QT_IOS_REQUIRES_FULL_SCREEN ${ARGIOS_REQUIRES_FULL_SCREEN})
  137. set(QT_IOS_HIDDEN_STATUS_BAR ${ARGIOS_HIDDEN_STATUS_BAR})
  138. set(QT_IOS_PHOTO_LIBRARY_USAGE_DESCRIPTION ${ARGIOS_PHOTO_LIBRARY_USAGE_DESCRIPTION})
  139. set(QT_IOS_IPA ${ARGIOS_IPA})
  140. set(QT_IOS_UPLOAD_SYMBOL ${ARGIOS_UPLOAD_SYMBOL})
  141. if(NOT QT_IOS_DISTRIBUTION_METHOD)
  142. set(QT_IOS_DISTRIBUTION_METHOD ${ARGIOS_DISTRIBUTION_METHOD})
  143. endif()
  144. if("${QT_IOS_DISTRIBUTION_METHOD}" STREQUAL "")
  145. set(QT_IOS_DISTRIBUTION_METHOD "app-store")
  146. endif()
  147. # Allow user to override QT_IOS_ITS_ENCRYPTION_EXPORT_COMPLIANCE_CODE from cache/command line
  148. if(NOT QT_IOS_ITS_ENCRYPTION_EXPORT_COMPLIANCE_CODE)
  149. set(QT_IOS_ITS_ENCRYPTION_EXPORT_COMPLIANCE_CODE ${ARGIOS_ITS_ENCRYPTION_EXPORT_COMPLIANCE_CODE})
  150. endif()
  151. # QT_IOS_ITS_ENCRYPTION_KEYS is used in Info.plist.in
  152. if(QT_IOS_ITS_ENCRYPTION_EXPORT_COMPLIANCE_CODE)
  153. set(QT_IOS_ITS_ENCRYPTION_KEYS "<key>ITSAppUsesNonExemptEncryption</key><true/>\n <key>ITSEncryptionExportComplianceCode</key>\n <string>${QT_IOS_ITS_ENCRYPTION_EXPORT_COMPLIANCE_CODE}</string>" PARENT_SCOPE)
  154. else()
  155. set(QT_IOS_ITS_ENCRYPTION_KEYS "<key>ITSAppUsesNonExemptEncryption</key><false/>" PARENT_SCOPE)
  156. endif()
  157. set(QT_IOS_VERBOSE ${ARGIOS_VERBOSE})
  158. if(NOT ARGIOS_NAME)
  159. if(QT_IOS_VERBOSE)
  160. message(STATUS "NAME not provided when calling add_qt_ios_app. Name will be default to ${QT_IOS_TARGET}")
  161. endif()
  162. set(QT_IOS_NAME ${QT_IOS_TARGET})
  163. endif()
  164. # Warning if no default BUNDLE_IDENTIFIER is set
  165. if(NOT ARGIOS_BUNDLE_IDENTIFIER)
  166. if(QT_IOS_VERBOSE)
  167. message(STATUS "BUNDLE_IDENTIFIER not set when calling add_qt_ios_app. "
  168. "You can fix this by hand in XCode. "
  169. "The BUNDLE_IDENTIFIER is defaulted to ${CMAKE_PROJECT_NAME}")
  170. endif() # QT_IOS_VERBOSE
  171. set(QT_IOS_BUNDLE_IDENTIFIER ${CMAKE_PROJECT_NAME}.${QT_IOS_TARGET})
  172. endif() # NOT ARGIOS_BUNDLE_IDENTIFIER
  173. # Warning if no version
  174. if(NOT ARGIOS_VERSION)
  175. set(QT_IOS_VERSION ${CMAKE_PROJECT_VERSION})
  176. if("${QT_IOS_VERSION}" STREQUAL "")
  177. set(QT_IOS_VERSION "1.0.0")
  178. endif()
  179. if(QT_IOS_VERBOSE)
  180. message(STATUS "VERSION not set when calling add_qt_ios_app. "
  181. "Default VERSION to ${QT_IOS_VERSION}")
  182. endif() # QT_IOS_VERBOSE
  183. endif() # NOT ARGIOS_VERSION
  184. # Default value for SHORT_VERSION
  185. if(NOT QT_IOS_SHORT_VERSION)
  186. if(QT_IOS_VERBOSE)
  187. message(STATUS "SHORT_VERSION not specified, default to ${QT_IOS_VERSION}")
  188. endif() # QT_IOS_VERBOSE
  189. set(QT_IOS_SHORT_VERSION ${QT_IOS_VERSION})
  190. endif() # NOT QT_IOS_SHORT_VERSION
  191. # Default value for long version
  192. if(NOT QT_IOS_LONG_VERSION)
  193. if(QT_IOS_VERBOSE)
  194. message(STATUS "LONG_VERSION not specified, default to ${QT_IOS_VERSION}")
  195. endif() # QT_IOS_VERBOSE
  196. set(QT_IOS_LONG_VERSION ${QT_IOS_VERSION})
  197. endif() # NOT QT_IOS_LONG_VERSION
  198. # Default value for plist file
  199. if(NOT QT_IOS_CUSTOM_PLIST)
  200. set(QT_IOS_CUSTOM_PLIST ${QT_IOS_SOURCE_DIR}/Info.plist.in)
  201. if(QT_IOS_VERBOSE)
  202. message(STATUS "CUSTOM_PLIST not specified, default to ${QT_IOS_CUSTOM_PLIST}")
  203. endif() # QT_IOS_VERBOSE
  204. endif() # NOT QT_IOS_CUSTOM_PLIST
  205. # Default for qml dir set to qt sdk root
  206. if(NOT QT_IOS_QML_DIR)
  207. set(QT_IOS_QML_DIR "${QT_IOS_QT_ROOT}/qml")
  208. if(QT_IOS_VERBOSE)
  209. message(STATUS "QML_DIR not specified, default to ${QT_IOS_QML_DIR}")
  210. endif() # QT_IOS_VERBOSE
  211. endif() # NOT QT_IOS_QML_DIR
  212. if(NOT QT_IOS_CATALOG_APPICON)
  213. set(QT_IOS_CATALOG_APPICON "AppIcon")
  214. if(QT_IOS_VERBOSE)
  215. message(STATUS "CATALOG_APPICON not specified, default to ${QT_IOS_CATALOG_APPICON}.")
  216. endif() # QT_IOS_VERBOSE
  217. endif() # NOT QT_IOS_CATALOG_APPICON
  218. # Print macro configuration
  219. if(QT_IOS_VERBOSE)
  220. message(STATUS "------ QtIosCMake Configuration ------")
  221. message(STATUS "TARGET : ${QT_IOS_TARGET}")
  222. message(STATUS "NAME : ${QT_IOS_NAME}")
  223. message(STATUS "BUNDLE_IDENTIFIER : ${QT_IOS_BUNDLE_IDENTIFIER}")
  224. message(STATUS "VERSION : ${QT_IOS_VERSION}")
  225. message(STATUS "SHORT_VERSION : ${QT_IOS_SHORT_VERSION}")
  226. message(STATUS "LONG_VERSION : ${QT_IOS_LONG_VERSION}")
  227. message(STATUS "CUSTOM_PLIST : ${QT_IOS_CUSTOM_PLIST}")
  228. message(STATUS "CODE_SIGN_IDENTITY : ${QT_IOS_CODE_SIGN_IDENTITY}")
  229. message(STATUS "TEAM_ID : ${QT_IOS_TEAM_ID}")
  230. if(QT_IOS_PROVISIONING_PROFILE_SPECIFIER)
  231. message(STATUS "PROVISIONING_PROFILE_SPECIFIER : ${QT_IOS_PROVISIONING_PROFILE_SPECIFIER}")
  232. endif()
  233. message(STATUS "COPYRIGHT : ${QT_IOS_COPYRIGHT}")
  234. message(STATUS "QML_DIR : ${QT_IOS_QML_DIR}")
  235. message(STATUS "ASSET_DIR : ${QT_IOS_ASSET_DIR}")
  236. message(STATUS "CATALOG_APPICON : ${QT_IOS_CATALOG_APPICON}")
  237. message(STATUS "CATALOG_LAUNCHIMAGE : ${QT_IOS_CATALOG_LAUNCHIMAGE}")
  238. message(STATUS "LAUNCHSCREEN_STORYBOARD : ${QT_IOS_LAUNCHSCREEN_STORYBOARD}")
  239. message(STATUS "MAIN_STORYBOARD : ${QT_IOS_MAIN_STORYBOARD}")
  240. message(STATUS "ORIENTATION_PORTRAIT : ${QT_IOS_ORIENTATION_PORTRAIT}")
  241. message(STATUS "ORIENTATION_PORTRAIT_UPDOWN : ${QT_IOS_ORIENTATION_PORTRAIT_UPDOWN}")
  242. message(STATUS "ORIENTATION_LANDSCAPE_LEFT : ${QT_IOS_ORIENTATION_LANDSCAPE_LEFT}")
  243. message(STATUS "ORIENTATION_LANDSCAPE_RIGHT : ${QT_IOS_ORIENTATION_LANDSCAPE_RIGHT}")
  244. if(QT_IOS_PHOTO_LIBRARY_USAGE_DESCRIPTION)
  245. message(STATUS "PHOTO_LIBRARY_USAGE_DESCRIPTION : ${QT_IOS_PHOTO_LIBRARY_USAGE_DESCRIPTION}")
  246. endif()
  247. message(STATUS "SUPPORT_IPHONE : ${QT_IOS_SUPPORT_IPHONE}")
  248. message(STATUS "SUPPORT_IPAD : ${QT_IOS_SUPPORT_IPAD}")
  249. message(STATUS "REQUIRES_FULL_SCREEN : ${QT_IOS_REQUIRES_FULL_SCREEN}")
  250. message(STATUS "HIDDEN_STATUS_BAR : ${QT_IOS_HIDDEN_STATUS_BAR}")
  251. message(STATUS "IPA : ${QT_IOS_IPA}")
  252. message(STATUS "UPLOAD_SYMBOL : ${QT_IOS_UPLOAD_SYMBOL}")
  253. message(STATUS "DISTRIBUTION_METHOD : ${QT_IOS_DISTRIBUTION_METHOD}")
  254. message(STATUS "RESOURCE_FILES : ${QT_IOS_RESOURCE_FILES}")
  255. message(STATUS "------ QtIosCMake END Configuration ------")
  256. endif() # QT_IOS_VERBOSE
  257. # Bundle executable.
  258. if(QT_IOS_VERBOSE)
  259. message(STATUS "Set property MACOSX_BUNDLE to ${QT_IOS_TARGET}")
  260. endif() # QT_IOS_VERBOSE
  261. set_target_properties(${QT_IOS_TARGET} PROPERTIES MACOSX_BUNDLE ON)
  262. # Qt Mess
  263. function(qt_ios_clean_paths)
  264. foreach(_path_group ${ARGN})
  265. foreach(_path ${${_path_group}})
  266. get_filename_component(_path_cleaned ${_path} REALPATH)
  267. file(TO_NATIVE_PATH ${_path_cleaned} _path_cleaned)
  268. set(_path_group_cleaned ${_path_group_cleaned} ${_path_cleaned})
  269. endforeach()
  270. set(${_path_group} ${_path_group_cleaned} PARENT_SCOPE)
  271. endforeach()
  272. endfunction()
  273. macro(qt_ios_handle_cyclical_linking LIBS)
  274. if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT APPLE))
  275. set(${LIBS} -Wl,--start-group ${${LIBS}} -Wl,--end-group)
  276. endif()
  277. endmacro()
  278. # let's not be picky, just throw all the available static libraries at the linker and let it figure out which ones are actually needed
  279. # a 'foreach' is used because 'target_link_libraries' doesn't handle lists correctly (the ; messes it up and nothing actually gets linked against)
  280. if(QT_IOS_TARGET_IS_WINDOWS)
  281. set(_DEBUG_SUFFIX d)
  282. elseif(QT_IOS_TARGET_IS_IOS OR QT_IOS_TARGET_IS_MAC)
  283. set(_DEBUG_SUFFIX _debug)
  284. else()
  285. set(_DEBUG_SUFFIX)
  286. endif()
  287. set(_LIBS_BASE_DIR "${QT_IOS_QT_ROOT}/lib")
  288. qt_ios_clean_paths(_LIBS_BASE_DIR)
  289. file(GLOB_RECURSE _QT_LIBS "${_LIBS_BASE_DIR}/*${CMAKE_STATIC_LIBRARY_SUFFIX}")
  290. foreach(_QT_LIB ${_QT_LIBS})
  291. string(REGEX MATCH ".*${_DEBUG_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_DEBUG_LIB ${_QT_LIB})
  292. string(REGEX MATCH ".*_iphonesimulator${_DEBUG_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_DEBUG_SIM_LIB ${_QT_LIB})
  293. string(REGEX MATCH ".*_iphonesimulator${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_SIM_LIB ${_QT_LIB})
  294. string(REGEX MATCH ".*Qt5Bootstrap.*" _IS_BOOTSTRAP ${_QT_LIB})
  295. string(REGEX MATCH ".*Qt5QmlDevTools.*" _IS_DEVTOOLS ${_QT_LIB})
  296. if(NOT _IS_BOOTSTRAP AND NOT _IS_DEVTOOLS AND NOT _IS_DEBUG_SIM_LIB AND NOT _IS_SIM_LIB)
  297. if(_IS_DEBUG_LIB OR NOT _DEBUG_SUFFIX)
  298. set(QT_EXTRA_LIBS ${QT_EXTRA_LIBS} debug "${_QT_LIB}")
  299. endif()
  300. if(NOT _IS_DEBUG_LIB OR NOT _DEBUG_SUFFIX)
  301. set(QT_EXTRA_LIBS ${QT_EXTRA_LIBS} optimized "${_QT_LIB}")
  302. endif()
  303. endif()
  304. endforeach()
  305. set(_QML_BASE_DIR "${QT_IOS_QML_DIR}")
  306. qt_ios_clean_paths(_QML_BASE_DIR)
  307. file(GLOB_RECURSE _QML_PLUGINS "${_QML_BASE_DIR}/*${CMAKE_STATIC_LIBRARY_SUFFIX}")
  308. foreach(_QML_PLUGIN ${_QML_PLUGINS})
  309. string(REGEX MATCH ".*${_DEBUG_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_DEBUG_LIB ${_QML_PLUGIN})
  310. string(REGEX MATCH ".*_iphonesimulator${_DEBUG_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_DEBUG_SIM_LIB ${_QML_PLUGIN})
  311. string(REGEX MATCH ".*_iphonesimulator${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_SIM_LIB ${_QML_PLUGIN})
  312. if(NOT _IS_DEBUG_SIM_LIB AND NOT _IS_SIM_LIB)
  313. if(_IS_DEBUG_LIB OR NOT _DEBUG_SUFFIX)
  314. set(QT_EXTRA_LIBS ${QT_EXTRA_LIBS} debug "${_QML_PLUGIN}")
  315. endif()
  316. if(NOT _IS_DEBUG_LIB OR NOT _DEBUG_SUFFIX)
  317. set(QT_EXTRA_LIBS ${QT_EXTRA_LIBS} optimized "${_QML_PLUGIN}")
  318. endif()
  319. endif()
  320. endforeach()
  321. set(_PLUGINS_BASE_DIR "${QT_IOS_QT_ROOT}/plugins")
  322. qt_ios_clean_paths(_PLUGINS_BASE_DIR)
  323. file(GLOB_RECURSE _QT_PLUGINS "${_PLUGINS_BASE_DIR}/*${CMAKE_STATIC_LIBRARY_SUFFIX}")
  324. foreach(_QT_PLUGIN ${_QT_PLUGINS})
  325. string(REGEX MATCH ".*${_DEBUG_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_DEBUG_LIB ${_QT_PLUGIN})
  326. string(REGEX MATCH ".*_iphonesimulator${_DEBUG_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_DEBUG_SIM_LIB ${_QT_PLUGIN})
  327. string(REGEX MATCH ".*_iphonesimulator${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_SIM_LIB ${_QT_PLUGIN})
  328. if(NOT _IS_DEBUG_SIM_LIB AND NOT _IS_SIM_LIB)
  329. if(_IS_DEBUG_LIB OR NOT _DEBUG_SUFFIX)
  330. set(QT_EXTRA_LIBS ${QT_EXTRA_LIBS} debug "${_QT_PLUGIN}")
  331. endif()
  332. if(NOT _IS_DEBUG_LIB OR NOT _DEBUG_SUFFIX)
  333. set(QT_EXTRA_LIBS ${QT_EXTRA_LIBS} optimized "${_QT_PLUGIN}")
  334. endif()
  335. endif()
  336. endforeach()
  337. # static linking
  338. set(QT_LIBRARIES ${QT_LIBRARIES} ${QT_EXTRA_LIBS})
  339. qt_ios_handle_cyclical_linking(QT_LIBRARIES)
  340. # Define entry point for correct initialization.
  341. # Maybe set this optionnal in the future if user wants to set his own entry point ?
  342. if(QT_IOS_VERBOSE)
  343. message(STATUS "Add -e _qt_main_wrapper linker flag to ${QT_IOS_TARGET} to change application entry point to create UIApplication before QApplication")
  344. endif() # QT_IOS_VERBOSE
  345. target_link_libraries(${QT_IOS_TARGET} PUBLIC ${QT_LIBRARIES} "-e _qt_main_wrapper")
  346. # Set XCode property for automatic code sign
  347. if(QT_IOS_CODE_SIGN_IDENTITY)
  348. qt_ios_set_xcode_property(${QT_IOS_TARGET} CODE_SIGN_IDENTITY ${QT_IOS_CODE_SIGN_IDENTITY} "All")
  349. endif()
  350. if(QT_IOS_TEAM_ID)
  351. qt_ios_set_xcode_property(${QT_IOS_TARGET} DEVELOPMENT_TEAM ${QT_IOS_TEAM_ID} "All")
  352. set(CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM ${QT_IOS_TEAM_ID} CACHE INTERNAL "" FORCE)
  353. endif()
  354. if(QT_IOS_PROVISIONING_PROFILE_SPECIFIER)
  355. qt_ios_set_xcode_property(${QT_IOS_TARGET} PROVISIONING_PROFILE_SPECIFIER ${QT_IOS_PROVISIONING_PROFILE_SPECIFIER} "All")
  356. endif()
  357. # Ugly but working
  358. if(QT_IOS_SUPPORT_IPAD AND QT_IOS_SUPPORT_IPHONE)
  359. qt_ios_set_xcode_property(${QT_IOS_TARGET} TARGETED_DEVICE_FAMILY "1,2" "All")
  360. elseif(QT_IOS_SUPPORT_IPAD)
  361. qt_ios_set_xcode_property(${QT_IOS_TARGET} TARGETED_DEVICE_FAMILY "2" "All")
  362. elseif(QT_IOS_SUPPORT_IPHONE)
  363. qt_ios_set_xcode_property(${QT_IOS_TARGET} TARGETED_DEVICE_FAMILY "1" "All")
  364. else()
  365. if(QT_IOS_VERBOSE)
  366. message(STATUS "None of SUPPORT_IPHONE or SUPPORT_IPAD are set. Support both by default.")
  367. endif()
  368. qt_ios_set_xcode_property(${QT_IOS_TARGET} TARGETED_DEVICE_FAMILY "1,2" "All")
  369. endif()
  370. # Set AppIcon Catalog
  371. if(QT_IOS_CATALOG_APPICON)
  372. qt_ios_set_xcode_property (${QT_IOS_TARGET} ASSETCATALOG_COMPILER_APPICON_NAME ${QT_IOS_CATALOG_APPICON} "All")
  373. endif()
  374. # Set LaunchImage Catalog
  375. if(QT_IOS_CATALOG_LAUNCHIMAGE)
  376. qt_ios_set_xcode_property (${QT_IOS_TARGET} ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME ${QT_IOS_CATALOG_LAUNCHIMAGE} "All")
  377. endif()
  378. # Make sure a publish dialog is set in XCode.
  379. # If INSTALL_PATH is empty it won't be possible to deploy to App Store
  380. qt_ios_set_xcode_property(${QT_IOS_TARGET} INSTALL_PATH "/Applications" "All")
  381. # Set CMake variables for plist
  382. set(MACOSX_BUNDLE_EXECUTABLE_NAME ${QT_IOS_NAME} PARENT_SCOPE)
  383. set(MACOSX_BUNDLE_INFO_STRING ${QT_IOS_NAME} PARENT_SCOPE)
  384. set(MACOSX_BUNDLE_GUI_IDENTIFIER ${QT_IOS_BUNDLE_IDENTIFIER} PARENT_SCOPE)
  385. set(MACOSX_BUNDLE_BUNDLE_NAME ${QT_IOS_NAME} PARENT_SCOPE)
  386. #set(MACOSX_BUNDLE_ICON_FILE "${PROJECT_SOURCE_DIR} PARENT_SCOPE/platform/ios/Assets.xcassets/AppIcon.appiconset")
  387. set(MACOSX_BUNDLE_BUNDLE_VERSION ${QT_IOS_VERSION} PARENT_SCOPE)
  388. set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${QT_IOS_SHORT_VERSION} PARENT_SCOPE)
  389. set(MACOSX_BUNDLE_LONG_VERSION_STRING ${QT_IOS_LONG_VERSION} PARENT_SCOPE)
  390. set(MACOSX_BUNDLE_COPYRIGHT ${QT_IOS_COPYRIGHT} PARENT_SCOPE)
  391. # Set require full screen
  392. if(QT_IOS_REQUIRES_FULL_SCREEN)
  393. set(MACOSX_BUNDLE_REQUIRES_FULL_SCREEN "YES" PARENT_SCOPE)
  394. if(QT_IOS_VERBOSE)
  395. message(STATUS "Add UIRequiresFullScreen flag to Info.pList")
  396. endif() # QT_IOS_VERBOSE
  397. else() # QT_IOS_REQUIRES_FULL_SCREEN
  398. set(MACOSX_BUNDLE_REQUIRES_FULL_SCREEN "NO" PARENT_SCOPE)
  399. endif() # QT_IOS_REQUIRES_FULL_SCREEN
  400. # Set hidden status bar
  401. if(QT_IOS_HIDDEN_STATUS_BAR)
  402. set(MACOSX_BUNDLE_HIDDEN_STATUS_BAR "true" PARENT_SCOPE)
  403. if(QT_IOS_VERBOSE)
  404. message(STATUS "Add UIStatusBarHidden flag to Info.pList")
  405. endif() # QT_IOS_VERBOSE
  406. else() # QT_IOS_HIDDEN_STATUS_BAR
  407. set(MACOSX_BUNDLE_HIDDEN_STATUS_BAR "false" PARENT_SCOPE)
  408. endif() # QT_IOS_HIDDEN_STATUS_BAR
  409. # Add orientation flags
  410. if(QT_IOS_ORIENTATION_PORTRAIT)
  411. set(MACOSX_BUNDLE_PORTRAIT "UIInterfaceOrientationPortrait" PARENT_SCOPE)
  412. if(QT_IOS_VERBOSE)
  413. message(STATUS "Add UIInterfaceOrientationPortrait flag to Info.pList")
  414. endif() # QT_IOS_VERBOSE
  415. endif()
  416. if(QT_IOS_ORIENTATION_PORTRAIT_UPDOWN)
  417. set(MACOSX_BUNDLE_PORTRAITUPDOWN "UIInterfaceOrientationPortraitUpsideDown" PARENT_SCOPE)
  418. if(QT_IOS_VERBOSE)
  419. message(STATUS "Add UIInterfaceOrientationPortraitUpsideDown flag to Info.pList")
  420. endif() # QT_IOS_VERBOSE
  421. endif()
  422. if(QT_IOS_ORIENTATION_LANDSCAPE_LEFT)
  423. set(MACOSX_BUNDLE_LANDSCAPELEFT "UIInterfaceOrientationLandscapeLeft" PARENT_SCOPE)
  424. if(QT_IOS_VERBOSE)
  425. message(STATUS "Add UIInterfaceOrientationLandscapeLeft flag to Info.pList")
  426. endif() # QT_IOS_VERBOSE
  427. endif()
  428. if(QT_IOS_ORIENTATION_LANDSCAPE_RIGHT)
  429. set(MACOSX_BUNDLE_LANDSCAPERIGHT "UIInterfaceOrientationLandscapeRight" PARENT_SCOPE)
  430. if(QT_IOS_VERBOSE)
  431. message(STATUS "Add UIInterfaceOrientationLandscapeRight flag to Info.pList")
  432. endif() # QT_IOS_VERBOSE
  433. endif()
  434. if(NOT QT_IOS_ORIENTATION_PORTRAIT AND
  435. NOT QT_IOS_ORIENTATION_PORTRAIT_UPDOWN AND
  436. NOT QT_IOS_ORIENTATION_LANDSCAPE_LEFT AND
  437. NOT QT_IOS_ORIENTATION_LANDSCAPE_RIGHT)
  438. set(MACOSX_BUNDLE_PORTRAIT "UIInterfaceOrientationPortrait" PARENT_SCOPE)
  439. if(QT_IOS_VERBOSE)
  440. message(STATUS "Add UIInterfaceOrientationPortrait as default to Info.pList becayse nothing was set by user in the list"
  441. "{ORIENTATION_PORTRAIT, ORIENTATION_PORTRAIT_UPDOWN, ORIENTATION_LANDSCAPE_LEFT, ORIENTATION_LANDSCAPE_RIGHT}")
  442. endif() # QT_IOS_VERBOSE
  443. endif()
  444. # Set Custom pList
  445. set_target_properties(${QT_IOS_TARGET} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${QT_IOS_CUSTOM_PLIST})
  446. # Add asset dir as ressource
  447. if(QT_IOS_ASSET_DIR)
  448. target_sources(${QT_IOS_TARGET} PRIVATE ${QT_IOS_ASSET_DIR})
  449. set_source_files_properties(${QT_IOS_ASSET_DIR} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
  450. else(QT_IOS_ASSET_DIR)
  451. if(QT_IOS_VERBOSE)
  452. message(STATUS "No Asset dir specified. This is the recommanded way to add Icons and LaunchImage")
  453. endif() # QT_IOS_VERBOSE
  454. endif() # QT_IOS_ASSET_DIR
  455. foreach(_resource IN LISTS QT_IOS_RESOURCE_FILES)
  456. if(QT_IOS_VERBOSE)
  457. message(STATUS "Add resource: ${_resource}")
  458. endif()
  459. target_sources(${QT_IOS_TARGET} PRIVATE ${_resource})
  460. set_source_files_properties(${_resource} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
  461. endforeach()
  462. # Add Launchscreen storyboard as ressource
  463. if(QT_IOS_LAUNCHSCREEN_STORYBOARD)
  464. target_sources(${QT_IOS_TARGET} PRIVATE ${QT_IOS_LAUNCHSCREEN_STORYBOARD})
  465. set_source_files_properties(${QT_IOS_LAUNCHSCREEN_STORYBOARD} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
  466. get_filename_component(STORYBOARD_FILE_NAME ${QT_IOS_LAUNCHSCREEN_STORYBOARD} NAME_WE)
  467. if(QT_IOS_VERBOSE)
  468. message(STATUS "Add UILaunchStoryboardName key with value ${STORYBOARD_FILE_NAME} in Info.pList")
  469. endif() # QT_IOS_VERBOSE
  470. set(MACOSX_BUNDLE_LAUNCHSCREEN_STORYBOARD ${STORYBOARD_FILE_NAME} PARENT_SCOPE)
  471. else() # QT_IOS_LAUNCHSCREEN_STORYBOARD
  472. if(QT_IOS_VERBOSE)
  473. if(NOT QT_IOS_REQUIRES_FULL_SCREEN)
  474. message(WARNING "LaunchScreen.storyboard isn't specified, it's is now recommanded to have one if you don't set REQUIRES_FULL_SCREEN")
  475. endif() # NOT QT_IOS_REQUIRES_FULL_SCREEN
  476. endif() # QT_IOS_VERBOSE
  477. endif() # QT_IOS_LAUNCHSCREEN_STORYBOARD
  478. # Add Main storyboard as ressource
  479. if(QT_IOS_MAIN_STORYBOARD)
  480. target_sources(${QT_IOS_TARGET} PRIVATE ${QT_IOS_MAIN_STORYBOARD})
  481. set_source_files_properties(${QT_IOS_MAIN_STORYBOARD} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
  482. # We just need to set the filename without extension
  483. string(REGEX MATCH "([a-zA-Z0-9 \\-_]*)\\.storyboard" STORYBOARD_FILE_NAME ${QT_IOS_MAIN_STORYBOARD})
  484. if(QT_IOS_VERBOSE)
  485. message(STATUS "Add UIMainStoryboardFile key with value ${CMAKE_MATCH_1} in Info.pList")
  486. endif() # QT_IOS_VERBOSE
  487. set(MACOSX_BUNDLE_MAIN_STORYBOARD ${CMAKE_MATCH_1} PARENT_SCOPE)
  488. endif(QT_IOS_MAIN_STORYBOARD)
  489. if(${PLATFORM_INT} MATCHES ".*SIMULATOR.*" AND QT_IOS_IPA)
  490. unset(QT_IOS_IPA)
  491. message(WARNING "Ipa can't be enabled for simulator.")
  492. endif()
  493. if(QT_IOS_IPA)
  494. set(QT_IOS_TARGET_ARCHIVE ${QT_IOS_TARGET}Archive)
  495. set(QT_IOS_TARGET_IPA ${QT_IOS_TARGET}Ipa)
  496. set(QT_IOS_TARGET_ARCHIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${QT_IOS_TARGET}.xcarchive)
  497. set(QT_IOS_TARGET_IPA_PATH ${CMAKE_CURRENT_BINARY_DIR}/${QT_IOS_TARGET_IPA})
  498. # Generate archive
  499. add_custom_target(${QT_IOS_TARGET_ARCHIVE}
  500. ALL
  501. DEPENDS ${QT_IOS_TARGET}
  502. COMMAND xcodebuild
  503. -project ${PROJECT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.xcodeproj
  504. -scheme ${QT_IOS_TARGET}
  505. -archivePath ${QT_IOS_TARGET_ARCHIVE_PATH}
  506. archive
  507. )
  508. # Generate IPA
  509. if(QT_IOS_PROVISIONING_PROFILE_SPECIFIER)
  510. set(QT_IOS_EXPORT_SIGNING_TYPE "manual")
  511. else()
  512. set(QT_IOS_EXPORT_SIGNING_TYPE "automatic")
  513. endif()
  514. set(QT_IOS_PROVISIONING_PROFILES_KEY
  515. "<key>provisioningProfiles</key>\n <dict>\n <key>${QT_IOS_BUNDLE_IDENTIFIER}</key>\n <string>${QT_IOS_PROVISIONING_PROFILE_SPECIFIER}</string>\n </dict>\n"
  516. )
  517. if(ENABLE_BITCODE)
  518. set(QT_IOS_ENABLE_BITCODE TRUE)
  519. endif()
  520. if(QT_IOS_ENABLE_BITCODE)
  521. set(QT_IOS_ENABLE_BITCODE_KEY "<key>compileBitcode</key><true/>")
  522. else()
  523. set(QT_IOS_ENABLE_BITCODE_KEY "")
  524. endif()
  525. if(QT_IOS_UPLOAD_SYMBOL)
  526. set(QT_IOS_UPLOAD_SYMBOL_KEY "<key>uploadSymbols</key><true/>")
  527. else()
  528. set(QT_IOS_UPLOAD_SYMBOL_KEY "")
  529. endif()
  530. if(QT_IOS_PHOTO_LIBRARY_USAGE_DESCRIPTION)
  531. set(MACOSX_BUNDLE_PHOTO_LIBRARY_USAGE_DESCRIPTION "<key>NSPhotoLibraryUsageDescription</key> <string>${QT_IOS_PHOTO_LIBRARY_USAGE_DESCRIPTION}</string>" PARENT_SCOPE)
  532. endif()
  533. set(QT_IOS_EXPORT_OPTIONS_FILE ${CMAKE_CURRENT_BINARY_DIR}/${QT_IOS_TARGET}ExportOptions.plist)
  534. configure_file(${QT_IOS_SOURCE_DIR}/ExportOptions.plist.in ${QT_IOS_EXPORT_OPTIONS_FILE})
  535. add_custom_target(${QT_IOS_TARGET_IPA}
  536. ALL
  537. DEPENDS ${QT_IOS_TARGET_ARCHIVE}
  538. COMMAND xcodebuild -exportArchive
  539. -archivePath ${QT_IOS_TARGET_ARCHIVE_PATH}
  540. -exportOptionsPlist ${QT_IOS_EXPORT_OPTIONS_FILE}
  541. -exportPath ${QT_IOS_TARGET_IPA_PATH}
  542. ${QT_IOS_EXPORT_ARCHIVE_XCODEBUILD_FLAGS}
  543. )
  544. endif()
  545. endfunction()