#
# CMake Script by Olivier Le Doeuff
# Copyright (c) 2019 - All Right Reserved
# add_qt_ios_app help you deploy iOs application with Qt.
#
cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)
# find the Qt root directoryn might break in future release
# Dependant on Qt5
if(NOT Qt5Core_DIR)
find_package(Qt5Core REQUIRED)
endif()
get_filename_component(QT_IOS_QT_ROOT "${Qt5Core_DIR}/../../.." ABSOLUTE)
if(QT_IOS_QT_ROOT)
message(STATUS "Found Qt Sdk for Ios: ${QT_IOS_QT_ROOT}")
else()
message(FATAL_ERROR "Fail to find Qt Sdk path.")
endif()
# Keep track of our own directory for future use (and default value of plist.in)
set(QT_IOS_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR})
# This little macro lets you set any Xcode specific property.
# This is from iOs CMake Toolchain
macro(qt_ios_set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE XCODE_RELVERSION)
set(XCODE_RELVERSION_I "${XCODE_RELVERSION}")
if(XCODE_RELVERSION_I STREQUAL "All")
set_property(TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY} "${XCODE_VALUE}")
else()
set_property(TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY}[variant=${XCODE_RELVERSION_I}] "${XCODE_VALUE}")
endif()
endmacro() # qt_ios_set_xcode_property
# We need that to parse arguments
include(CMakeParseArguments)
# Usage :
# add_qt_ios_app(MyApp
# NAME "My App"
# BUNDLE_IDENTIFIER "com.company.app"
# VERSION "1.2.3"
# SHORT_VERSION "1.2.3"
# LONG_VERSION "1.2.3.456"
# CUSTOM_PLIST "path/to/Info.plist.in"
# CODE_SIGN_IDENTITY "iPhone Developer"
# TEAM_ID "AAAAAAAA"
# PROVISIONING_PROFILE_SPECIFIER "profile-name"
# COPYRIGHT "My Cool Copyright"
# QML_DIR "${QT_IOS_QT_ROOT}/qml"
# ASSET_DIR "path/to/Assets.xcassets"
# MAIN_STORYBOARD "/path/to/Main.storyboard"
# LAUNCHSCREEN_STORYBOARD "path/to/LaunchScreen.storyboard"
# CATALOG_APPICON "AppIcon"
# CATALOG_LAUNCHIMAGE "LaunchImage"
# ORIENTATION_PORTRAIT
# ORIENTATION_PORTRAIT_UPDOWN
# ORIENTATION_LANDSCAPE_LEFT
# ORIENTATION_LANDSCAPE_RIGHT
# PHOTO_LIBRARY_USAGE_DESCRIPTION "My App needs to access your photo library."
# SUPPORT_IPHONE
# SUPPORT_IPAD
# REQUIRES_FULL_SCREEN
# HIDDEN_STATUS_BAR
# IPA
# UPLOAD_SYMBOL
# DISTRIBUTION_METHOD "app-store"
# VERBOSE
# )
function(add_qt_ios_app TARGET)
set(QT_IOS_OPTIONS VERBOSE
ORIENTATION_PORTRAIT
ORIENTATION_PORTRAIT_UPDOWN
ORIENTATION_LANDSCAPE_LEFT
ORIENTATION_LANDSCAPE_RIGHT
SUPPORT_IPHONE
SUPPORT_IPAD
REQUIRES_FULL_SCREEN
HIDDEN_STATUS_BAR
IPA
UPLOAD_SYMBOL
ITS_ENCRYPTION_EXPORT_COMPLIANCE_CODE
)
set(QT_IOS_ONE_VALUE_ARG NAME
BUNDLE_IDENTIFIER
VERSION
SHORT_VERSION
LONG_VERSION
CUSTOM_PLIST
CODE_SIGN_IDENTITY
TEAM_ID
PROVISIONING_PROFILE_SPECIFIER
COPYRIGHT
QML_DIR
ASSET_DIR
LAUNCHSCREEN_STORYBOARD
MAIN_STORYBOARD
CATALOG_APPICON
CATALOG_LAUNCHIMAGE
DISTRIBUTION_METHOD
PHOTO_LIBRARY_USAGE_DESCRIPTION
)
set(QT_IOS_MULTI_VALUE_ARG
RESOURCE_FILES
)
# parse the macro arguments
cmake_parse_arguments(ARGIOS "${QT_IOS_OPTIONS}" "${QT_IOS_ONE_VALUE_ARG}" "${QT_IOS_MULTI_VALUE_ARG}" ${ARGN})
# Copy arg variables to local variables
set(QT_IOS_TARGET ${TARGET})
set(QT_IOS_NAME ${ARGIOS_NAME})
set(QT_IOS_BUNDLE_IDENTIFIER ${ARGIOS_BUNDLE_IDENTIFIER})
set(QT_IOS_VERSION ${ARGIOS_VERSION})
set(QT_IOS_SHORT_VERSION ${ARGIOS_SHORT_VERSION})
set(QT_IOS_LONG_VERSION ${ARGIOS_LONG_VERSION})
set(QT_IOS_CUSTOM_PLIST ${ARGIOS_CUSTOM_PLIST})
if(NOT QT_IOS_CODE_SIGN_IDENTITY)
set(QT_IOS_CODE_SIGN_IDENTITY ${ARGIOS_CODE_SIGN_IDENTITY})
endif()
if("${QT_IOS_CODE_SIGN_IDENTITY}" STREQUAL "")
set(QT_IOS_CODE_SIGN_IDENTITY "iPhone Developer")
endif()
if(NOT QT_IOS_TEAM_ID)
set(QT_IOS_TEAM_ID ${ARGIOS_TEAM_ID})
endif()
if(NOT QT_IOS_PROVISIONING_PROFILE_SPECIFIER AND ARGIOS_PROVISIONING_PROFILE_SPECIFIER)
set(QT_IOS_PROVISIONING_PROFILE_SPECIFIER ${ARGIOS_PROVISIONING_PROFILE_SPECIFIER})
endif()
set(QT_IOS_COPYRIGHT ${ARGIOS_COPYRIGHT})
set(QT_IOS_QML_DIR ${ARGIOS_QML_DIR})
set(QT_IOS_ASSET_DIR ${ARGIOS_ASSET_DIR})
set(QT_IOS_LAUNCHSCREEN_STORYBOARD ${ARGIOS_LAUNCHSCREEN_STORYBOARD})
set(QT_IOS_MAIN_STORYBOARD ${ARGIOS_MAIN_STORYBOARD})
set(QT_IOS_CATALOG_APPICON ${ARGIOS_CATALOG_APPICON})
set(QT_IOS_CATALOG_LAUNCHIMAGE ${ARGIOS_CATALOG_LAUNCHIMAGE})
set(QT_IOS_RESOURCE_FILES "${ARGIOS_RESOURCE_FILES}")
set(QT_IOS_ORIENTATION_PORTRAIT ${ARGIOS_ORIENTATION_PORTRAIT})
set(QT_IOS_ORIENTATION_PORTRAIT_UPDOWN ${ARGIOS_ORIENTATION_PORTRAIT_UPDOWN})
set(QT_IOS_ORIENTATION_LANDSCAPE_LEFT ${ARGIOS_ORIENTATION_LANDSCAPE_LEFT})
set(QT_IOS_ORIENTATION_LANDSCAPE_RIGHT ${ARGIOS_ORIENTATION_LANDSCAPE_RIGHT})
set(QT_IOS_SUPPORT_IPHONE ${ARGIOS_SUPPORT_IPHONE})
set(QT_IOS_SUPPORT_IPAD ${ARGIOS_SUPPORT_IPAD})
set(QT_IOS_REQUIRES_FULL_SCREEN ${ARGIOS_REQUIRES_FULL_SCREEN})
set(QT_IOS_HIDDEN_STATUS_BAR ${ARGIOS_HIDDEN_STATUS_BAR})
set(QT_IOS_PHOTO_LIBRARY_USAGE_DESCRIPTION ${ARGIOS_PHOTO_LIBRARY_USAGE_DESCRIPTION})
set(QT_IOS_IPA ${ARGIOS_IPA})
set(QT_IOS_UPLOAD_SYMBOL ${ARGIOS_UPLOAD_SYMBOL})
if(NOT QT_IOS_DISTRIBUTION_METHOD)
set(QT_IOS_DISTRIBUTION_METHOD ${ARGIOS_DISTRIBUTION_METHOD})
endif()
if("${QT_IOS_DISTRIBUTION_METHOD}" STREQUAL "")
set(QT_IOS_DISTRIBUTION_METHOD "app-store")
endif()
# Allow user to override QT_IOS_ITS_ENCRYPTION_EXPORT_COMPLIANCE_CODE from cache/command line
if(NOT QT_IOS_ITS_ENCRYPTION_EXPORT_COMPLIANCE_CODE)
set(QT_IOS_ITS_ENCRYPTION_EXPORT_COMPLIANCE_CODE ${ARGIOS_ITS_ENCRYPTION_EXPORT_COMPLIANCE_CODE})
endif()
# QT_IOS_ITS_ENCRYPTION_KEYS is used in Info.plist.in
if(QT_IOS_ITS_ENCRYPTION_EXPORT_COMPLIANCE_CODE)
set(QT_IOS_ITS_ENCRYPTION_KEYS "ITSAppUsesNonExemptEncryption\n ITSEncryptionExportComplianceCode\n ${QT_IOS_ITS_ENCRYPTION_EXPORT_COMPLIANCE_CODE}" PARENT_SCOPE)
else()
set(QT_IOS_ITS_ENCRYPTION_KEYS "ITSAppUsesNonExemptEncryption" PARENT_SCOPE)
endif()
set(QT_IOS_VERBOSE ${ARGIOS_VERBOSE})
if(NOT ARGIOS_NAME)
if(QT_IOS_VERBOSE)
message(STATUS "NAME not provided when calling add_qt_ios_app. Name will be default to ${QT_IOS_TARGET}")
endif()
set(QT_IOS_NAME ${QT_IOS_TARGET})
endif()
# Warning if no default BUNDLE_IDENTIFIER is set
if(NOT ARGIOS_BUNDLE_IDENTIFIER)
if(QT_IOS_VERBOSE)
message(STATUS "BUNDLE_IDENTIFIER not set when calling add_qt_ios_app. "
"You can fix this by hand in XCode. "
"The BUNDLE_IDENTIFIER is defaulted to ${CMAKE_PROJECT_NAME}")
endif() # QT_IOS_VERBOSE
set(QT_IOS_BUNDLE_IDENTIFIER ${CMAKE_PROJECT_NAME}.${QT_IOS_TARGET})
endif() # NOT ARGIOS_BUNDLE_IDENTIFIER
# Warning if no version
if(NOT ARGIOS_VERSION)
set(QT_IOS_VERSION ${CMAKE_PROJECT_VERSION})
if("${QT_IOS_VERSION}" STREQUAL "")
set(QT_IOS_VERSION "1.0.0")
endif()
if(QT_IOS_VERBOSE)
message(STATUS "VERSION not set when calling add_qt_ios_app. "
"Default VERSION to ${QT_IOS_VERSION}")
endif() # QT_IOS_VERBOSE
endif() # NOT ARGIOS_VERSION
# Default value for SHORT_VERSION
if(NOT QT_IOS_SHORT_VERSION)
if(QT_IOS_VERBOSE)
message(STATUS "SHORT_VERSION not specified, default to ${QT_IOS_VERSION}")
endif() # QT_IOS_VERBOSE
set(QT_IOS_SHORT_VERSION ${QT_IOS_VERSION})
endif() # NOT QT_IOS_SHORT_VERSION
# Default value for long version
if(NOT QT_IOS_LONG_VERSION)
if(QT_IOS_VERBOSE)
message(STATUS "LONG_VERSION not specified, default to ${QT_IOS_VERSION}")
endif() # QT_IOS_VERBOSE
set(QT_IOS_LONG_VERSION ${QT_IOS_VERSION})
endif() # NOT QT_IOS_LONG_VERSION
# Default value for plist file
if(NOT QT_IOS_CUSTOM_PLIST)
set(QT_IOS_CUSTOM_PLIST ${QT_IOS_SOURCE_DIR}/Info.plist.in)
if(QT_IOS_VERBOSE)
message(STATUS "CUSTOM_PLIST not specified, default to ${QT_IOS_CUSTOM_PLIST}")
endif() # QT_IOS_VERBOSE
endif() # NOT QT_IOS_CUSTOM_PLIST
# Default for qml dir set to qt sdk root
if(NOT QT_IOS_QML_DIR)
set(QT_IOS_QML_DIR "${QT_IOS_QT_ROOT}/qml")
if(QT_IOS_VERBOSE)
message(STATUS "QML_DIR not specified, default to ${QT_IOS_QML_DIR}")
endif() # QT_IOS_VERBOSE
endif() # NOT QT_IOS_QML_DIR
if(NOT QT_IOS_CATALOG_APPICON)
set(QT_IOS_CATALOG_APPICON "AppIcon")
if(QT_IOS_VERBOSE)
message(STATUS "CATALOG_APPICON not specified, default to ${QT_IOS_CATALOG_APPICON}.")
endif() # QT_IOS_VERBOSE
endif() # NOT QT_IOS_CATALOG_APPICON
# Print macro configuration
if(QT_IOS_VERBOSE)
message(STATUS "------ QtIosCMake Configuration ------")
message(STATUS "TARGET : ${QT_IOS_TARGET}")
message(STATUS "NAME : ${QT_IOS_NAME}")
message(STATUS "BUNDLE_IDENTIFIER : ${QT_IOS_BUNDLE_IDENTIFIER}")
message(STATUS "VERSION : ${QT_IOS_VERSION}")
message(STATUS "SHORT_VERSION : ${QT_IOS_SHORT_VERSION}")
message(STATUS "LONG_VERSION : ${QT_IOS_LONG_VERSION}")
message(STATUS "CUSTOM_PLIST : ${QT_IOS_CUSTOM_PLIST}")
message(STATUS "CODE_SIGN_IDENTITY : ${QT_IOS_CODE_SIGN_IDENTITY}")
message(STATUS "TEAM_ID : ${QT_IOS_TEAM_ID}")
if(QT_IOS_PROVISIONING_PROFILE_SPECIFIER)
message(STATUS "PROVISIONING_PROFILE_SPECIFIER : ${QT_IOS_PROVISIONING_PROFILE_SPECIFIER}")
endif()
message(STATUS "COPYRIGHT : ${QT_IOS_COPYRIGHT}")
message(STATUS "QML_DIR : ${QT_IOS_QML_DIR}")
message(STATUS "ASSET_DIR : ${QT_IOS_ASSET_DIR}")
message(STATUS "CATALOG_APPICON : ${QT_IOS_CATALOG_APPICON}")
message(STATUS "CATALOG_LAUNCHIMAGE : ${QT_IOS_CATALOG_LAUNCHIMAGE}")
message(STATUS "LAUNCHSCREEN_STORYBOARD : ${QT_IOS_LAUNCHSCREEN_STORYBOARD}")
message(STATUS "MAIN_STORYBOARD : ${QT_IOS_MAIN_STORYBOARD}")
message(STATUS "ORIENTATION_PORTRAIT : ${QT_IOS_ORIENTATION_PORTRAIT}")
message(STATUS "ORIENTATION_PORTRAIT_UPDOWN : ${QT_IOS_ORIENTATION_PORTRAIT_UPDOWN}")
message(STATUS "ORIENTATION_LANDSCAPE_LEFT : ${QT_IOS_ORIENTATION_LANDSCAPE_LEFT}")
message(STATUS "ORIENTATION_LANDSCAPE_RIGHT : ${QT_IOS_ORIENTATION_LANDSCAPE_RIGHT}")
if(QT_IOS_PHOTO_LIBRARY_USAGE_DESCRIPTION)
message(STATUS "PHOTO_LIBRARY_USAGE_DESCRIPTION : ${QT_IOS_PHOTO_LIBRARY_USAGE_DESCRIPTION}")
endif()
message(STATUS "SUPPORT_IPHONE : ${QT_IOS_SUPPORT_IPHONE}")
message(STATUS "SUPPORT_IPAD : ${QT_IOS_SUPPORT_IPAD}")
message(STATUS "REQUIRES_FULL_SCREEN : ${QT_IOS_REQUIRES_FULL_SCREEN}")
message(STATUS "HIDDEN_STATUS_BAR : ${QT_IOS_HIDDEN_STATUS_BAR}")
message(STATUS "IPA : ${QT_IOS_IPA}")
message(STATUS "UPLOAD_SYMBOL : ${QT_IOS_UPLOAD_SYMBOL}")
message(STATUS "DISTRIBUTION_METHOD : ${QT_IOS_DISTRIBUTION_METHOD}")
message(STATUS "RESOURCE_FILES : ${QT_IOS_RESOURCE_FILES}")
message(STATUS "------ QtIosCMake END Configuration ------")
endif() # QT_IOS_VERBOSE
# Bundle executable.
if(QT_IOS_VERBOSE)
message(STATUS "Set property MACOSX_BUNDLE to ${QT_IOS_TARGET}")
endif() # QT_IOS_VERBOSE
set_target_properties(${QT_IOS_TARGET} PROPERTIES MACOSX_BUNDLE ON)
# Qt Mess
function(qt_ios_clean_paths)
foreach(_path_group ${ARGN})
foreach(_path ${${_path_group}})
get_filename_component(_path_cleaned ${_path} REALPATH)
file(TO_NATIVE_PATH ${_path_cleaned} _path_cleaned)
set(_path_group_cleaned ${_path_group_cleaned} ${_path_cleaned})
endforeach()
set(${_path_group} ${_path_group_cleaned} PARENT_SCOPE)
endforeach()
endfunction()
macro(qt_ios_handle_cyclical_linking LIBS)
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT APPLE))
set(${LIBS} -Wl,--start-group ${${LIBS}} -Wl,--end-group)
endif()
endmacro()
# 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
# a 'foreach' is used because 'target_link_libraries' doesn't handle lists correctly (the ; messes it up and nothing actually gets linked against)
if(QT_IOS_TARGET_IS_WINDOWS)
set(_DEBUG_SUFFIX d)
elseif(QT_IOS_TARGET_IS_IOS OR QT_IOS_TARGET_IS_MAC)
set(_DEBUG_SUFFIX _debug)
else()
set(_DEBUG_SUFFIX)
endif()
set(_LIBS_BASE_DIR "${QT_IOS_QT_ROOT}/lib")
qt_ios_clean_paths(_LIBS_BASE_DIR)
file(GLOB_RECURSE _QT_LIBS "${_LIBS_BASE_DIR}/*${CMAKE_STATIC_LIBRARY_SUFFIX}")
foreach(_QT_LIB ${_QT_LIBS})
string(REGEX MATCH ".*${_DEBUG_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_DEBUG_LIB ${_QT_LIB})
string(REGEX MATCH ".*_iphonesimulator${_DEBUG_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_DEBUG_SIM_LIB ${_QT_LIB})
string(REGEX MATCH ".*_iphonesimulator${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_SIM_LIB ${_QT_LIB})
string(REGEX MATCH ".*Qt5Bootstrap.*" _IS_BOOTSTRAP ${_QT_LIB})
string(REGEX MATCH ".*Qt5QmlDevTools.*" _IS_DEVTOOLS ${_QT_LIB})
if(NOT _IS_BOOTSTRAP AND NOT _IS_DEVTOOLS AND NOT _IS_DEBUG_SIM_LIB AND NOT _IS_SIM_LIB)
if(_IS_DEBUG_LIB OR NOT _DEBUG_SUFFIX)
set(QT_EXTRA_LIBS ${QT_EXTRA_LIBS} debug "${_QT_LIB}")
endif()
if(NOT _IS_DEBUG_LIB OR NOT _DEBUG_SUFFIX)
set(QT_EXTRA_LIBS ${QT_EXTRA_LIBS} optimized "${_QT_LIB}")
endif()
endif()
endforeach()
set(_QML_BASE_DIR "${QT_IOS_QML_DIR}")
qt_ios_clean_paths(_QML_BASE_DIR)
file(GLOB_RECURSE _QML_PLUGINS "${_QML_BASE_DIR}/*${CMAKE_STATIC_LIBRARY_SUFFIX}")
foreach(_QML_PLUGIN ${_QML_PLUGINS})
string(REGEX MATCH ".*${_DEBUG_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_DEBUG_LIB ${_QML_PLUGIN})
string(REGEX MATCH ".*_iphonesimulator${_DEBUG_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_DEBUG_SIM_LIB ${_QML_PLUGIN})
string(REGEX MATCH ".*_iphonesimulator${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_SIM_LIB ${_QML_PLUGIN})
if(NOT _IS_DEBUG_SIM_LIB AND NOT _IS_SIM_LIB)
if(_IS_DEBUG_LIB OR NOT _DEBUG_SUFFIX)
set(QT_EXTRA_LIBS ${QT_EXTRA_LIBS} debug "${_QML_PLUGIN}")
endif()
if(NOT _IS_DEBUG_LIB OR NOT _DEBUG_SUFFIX)
set(QT_EXTRA_LIBS ${QT_EXTRA_LIBS} optimized "${_QML_PLUGIN}")
endif()
endif()
endforeach()
set(_PLUGINS_BASE_DIR "${QT_IOS_QT_ROOT}/plugins")
qt_ios_clean_paths(_PLUGINS_BASE_DIR)
file(GLOB_RECURSE _QT_PLUGINS "${_PLUGINS_BASE_DIR}/*${CMAKE_STATIC_LIBRARY_SUFFIX}")
foreach(_QT_PLUGIN ${_QT_PLUGINS})
string(REGEX MATCH ".*${_DEBUG_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_DEBUG_LIB ${_QT_PLUGIN})
string(REGEX MATCH ".*_iphonesimulator${_DEBUG_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_DEBUG_SIM_LIB ${_QT_PLUGIN})
string(REGEX MATCH ".*_iphonesimulator${CMAKE_STATIC_LIBRARY_SUFFIX}$" _IS_SIM_LIB ${_QT_PLUGIN})
if(NOT _IS_DEBUG_SIM_LIB AND NOT _IS_SIM_LIB)
if(_IS_DEBUG_LIB OR NOT _DEBUG_SUFFIX)
set(QT_EXTRA_LIBS ${QT_EXTRA_LIBS} debug "${_QT_PLUGIN}")
endif()
if(NOT _IS_DEBUG_LIB OR NOT _DEBUG_SUFFIX)
set(QT_EXTRA_LIBS ${QT_EXTRA_LIBS} optimized "${_QT_PLUGIN}")
endif()
endif()
endforeach()
# static linking
set(QT_LIBRARIES ${QT_LIBRARIES} ${QT_EXTRA_LIBS})
qt_ios_handle_cyclical_linking(QT_LIBRARIES)
# Define entry point for correct initialization.
# Maybe set this optionnal in the future if user wants to set his own entry point ?
if(QT_IOS_VERBOSE)
message(STATUS "Add -e _qt_main_wrapper linker flag to ${QT_IOS_TARGET} to change application entry point to create UIApplication before QApplication")
endif() # QT_IOS_VERBOSE
target_link_libraries(${QT_IOS_TARGET} PUBLIC ${QT_LIBRARIES} "-e _qt_main_wrapper")
# Set XCode property for automatic code sign
if(QT_IOS_CODE_SIGN_IDENTITY)
qt_ios_set_xcode_property(${QT_IOS_TARGET} CODE_SIGN_IDENTITY ${QT_IOS_CODE_SIGN_IDENTITY} "All")
endif()
if(QT_IOS_TEAM_ID)
qt_ios_set_xcode_property(${QT_IOS_TARGET} DEVELOPMENT_TEAM ${QT_IOS_TEAM_ID} "All")
set(CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM ${QT_IOS_TEAM_ID} CACHE INTERNAL "" FORCE)
endif()
if(QT_IOS_PROVISIONING_PROFILE_SPECIFIER)
qt_ios_set_xcode_property(${QT_IOS_TARGET} PROVISIONING_PROFILE_SPECIFIER ${QT_IOS_PROVISIONING_PROFILE_SPECIFIER} "All")
endif()
# Ugly but working
if(QT_IOS_SUPPORT_IPAD AND QT_IOS_SUPPORT_IPHONE)
qt_ios_set_xcode_property(${QT_IOS_TARGET} TARGETED_DEVICE_FAMILY "1,2" "All")
elseif(QT_IOS_SUPPORT_IPAD)
qt_ios_set_xcode_property(${QT_IOS_TARGET} TARGETED_DEVICE_FAMILY "2" "All")
elseif(QT_IOS_SUPPORT_IPHONE)
qt_ios_set_xcode_property(${QT_IOS_TARGET} TARGETED_DEVICE_FAMILY "1" "All")
else()
if(QT_IOS_VERBOSE)
message(STATUS "None of SUPPORT_IPHONE or SUPPORT_IPAD are set. Support both by default.")
endif()
qt_ios_set_xcode_property(${QT_IOS_TARGET} TARGETED_DEVICE_FAMILY "1,2" "All")
endif()
# Set AppIcon Catalog
if(QT_IOS_CATALOG_APPICON)
qt_ios_set_xcode_property (${QT_IOS_TARGET} ASSETCATALOG_COMPILER_APPICON_NAME ${QT_IOS_CATALOG_APPICON} "All")
endif()
# Set LaunchImage Catalog
if(QT_IOS_CATALOG_LAUNCHIMAGE)
qt_ios_set_xcode_property (${QT_IOS_TARGET} ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME ${QT_IOS_CATALOG_LAUNCHIMAGE} "All")
endif()
# Make sure a publish dialog is set in XCode.
# If INSTALL_PATH is empty it won't be possible to deploy to App Store
qt_ios_set_xcode_property(${QT_IOS_TARGET} INSTALL_PATH "/Applications" "All")
# Set CMake variables for plist
set(MACOSX_BUNDLE_EXECUTABLE_NAME ${QT_IOS_NAME} PARENT_SCOPE)
set(MACOSX_BUNDLE_INFO_STRING ${QT_IOS_NAME} PARENT_SCOPE)
set(MACOSX_BUNDLE_GUI_IDENTIFIER ${QT_IOS_BUNDLE_IDENTIFIER} PARENT_SCOPE)
set(MACOSX_BUNDLE_BUNDLE_NAME ${QT_IOS_NAME} PARENT_SCOPE)
#set(MACOSX_BUNDLE_ICON_FILE "${PROJECT_SOURCE_DIR} PARENT_SCOPE/platform/ios/Assets.xcassets/AppIcon.appiconset")
set(MACOSX_BUNDLE_BUNDLE_VERSION ${QT_IOS_VERSION} PARENT_SCOPE)
set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${QT_IOS_SHORT_VERSION} PARENT_SCOPE)
set(MACOSX_BUNDLE_LONG_VERSION_STRING ${QT_IOS_LONG_VERSION} PARENT_SCOPE)
set(MACOSX_BUNDLE_COPYRIGHT ${QT_IOS_COPYRIGHT} PARENT_SCOPE)
# Set require full screen
if(QT_IOS_REQUIRES_FULL_SCREEN)
set(MACOSX_BUNDLE_REQUIRES_FULL_SCREEN "YES" PARENT_SCOPE)
if(QT_IOS_VERBOSE)
message(STATUS "Add UIRequiresFullScreen flag to Info.pList")
endif() # QT_IOS_VERBOSE
else() # QT_IOS_REQUIRES_FULL_SCREEN
set(MACOSX_BUNDLE_REQUIRES_FULL_SCREEN "NO" PARENT_SCOPE)
endif() # QT_IOS_REQUIRES_FULL_SCREEN
# Set hidden status bar
if(QT_IOS_HIDDEN_STATUS_BAR)
set(MACOSX_BUNDLE_HIDDEN_STATUS_BAR "true" PARENT_SCOPE)
if(QT_IOS_VERBOSE)
message(STATUS "Add UIStatusBarHidden flag to Info.pList")
endif() # QT_IOS_VERBOSE
else() # QT_IOS_HIDDEN_STATUS_BAR
set(MACOSX_BUNDLE_HIDDEN_STATUS_BAR "false" PARENT_SCOPE)
endif() # QT_IOS_HIDDEN_STATUS_BAR
# Add orientation flags
if(QT_IOS_ORIENTATION_PORTRAIT)
set(MACOSX_BUNDLE_PORTRAIT "UIInterfaceOrientationPortrait" PARENT_SCOPE)
if(QT_IOS_VERBOSE)
message(STATUS "Add UIInterfaceOrientationPortrait flag to Info.pList")
endif() # QT_IOS_VERBOSE
endif()
if(QT_IOS_ORIENTATION_PORTRAIT_UPDOWN)
set(MACOSX_BUNDLE_PORTRAITUPDOWN "UIInterfaceOrientationPortraitUpsideDown" PARENT_SCOPE)
if(QT_IOS_VERBOSE)
message(STATUS "Add UIInterfaceOrientationPortraitUpsideDown flag to Info.pList")
endif() # QT_IOS_VERBOSE
endif()
if(QT_IOS_ORIENTATION_LANDSCAPE_LEFT)
set(MACOSX_BUNDLE_LANDSCAPELEFT "UIInterfaceOrientationLandscapeLeft" PARENT_SCOPE)
if(QT_IOS_VERBOSE)
message(STATUS "Add UIInterfaceOrientationLandscapeLeft flag to Info.pList")
endif() # QT_IOS_VERBOSE
endif()
if(QT_IOS_ORIENTATION_LANDSCAPE_RIGHT)
set(MACOSX_BUNDLE_LANDSCAPERIGHT "UIInterfaceOrientationLandscapeRight" PARENT_SCOPE)
if(QT_IOS_VERBOSE)
message(STATUS "Add UIInterfaceOrientationLandscapeRight flag to Info.pList")
endif() # QT_IOS_VERBOSE
endif()
if(NOT QT_IOS_ORIENTATION_PORTRAIT AND
NOT QT_IOS_ORIENTATION_PORTRAIT_UPDOWN AND
NOT QT_IOS_ORIENTATION_LANDSCAPE_LEFT AND
NOT QT_IOS_ORIENTATION_LANDSCAPE_RIGHT)
set(MACOSX_BUNDLE_PORTRAIT "UIInterfaceOrientationPortrait" PARENT_SCOPE)
if(QT_IOS_VERBOSE)
message(STATUS "Add UIInterfaceOrientationPortrait as default to Info.pList becayse nothing was set by user in the list"
"{ORIENTATION_PORTRAIT, ORIENTATION_PORTRAIT_UPDOWN, ORIENTATION_LANDSCAPE_LEFT, ORIENTATION_LANDSCAPE_RIGHT}")
endif() # QT_IOS_VERBOSE
endif()
# Set Custom pList
set_target_properties(${QT_IOS_TARGET} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${QT_IOS_CUSTOM_PLIST})
# Add asset dir as ressource
if(QT_IOS_ASSET_DIR)
target_sources(${QT_IOS_TARGET} PRIVATE ${QT_IOS_ASSET_DIR})
set_source_files_properties(${QT_IOS_ASSET_DIR} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
else(QT_IOS_ASSET_DIR)
if(QT_IOS_VERBOSE)
message(STATUS "No Asset dir specified. This is the recommanded way to add Icons and LaunchImage")
endif() # QT_IOS_VERBOSE
endif() # QT_IOS_ASSET_DIR
foreach(_resource IN LISTS QT_IOS_RESOURCE_FILES)
if(QT_IOS_VERBOSE)
message(STATUS "Add resource: ${_resource}")
endif()
target_sources(${QT_IOS_TARGET} PRIVATE ${_resource})
set_source_files_properties(${_resource} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
endforeach()
# Add Launchscreen storyboard as ressource
if(QT_IOS_LAUNCHSCREEN_STORYBOARD)
target_sources(${QT_IOS_TARGET} PRIVATE ${QT_IOS_LAUNCHSCREEN_STORYBOARD})
set_source_files_properties(${QT_IOS_LAUNCHSCREEN_STORYBOARD} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
get_filename_component(STORYBOARD_FILE_NAME ${QT_IOS_LAUNCHSCREEN_STORYBOARD} NAME_WE)
if(QT_IOS_VERBOSE)
message(STATUS "Add UILaunchStoryboardName key with value ${STORYBOARD_FILE_NAME} in Info.pList")
endif() # QT_IOS_VERBOSE
set(MACOSX_BUNDLE_LAUNCHSCREEN_STORYBOARD ${STORYBOARD_FILE_NAME} PARENT_SCOPE)
else() # QT_IOS_LAUNCHSCREEN_STORYBOARD
if(QT_IOS_VERBOSE)
if(NOT QT_IOS_REQUIRES_FULL_SCREEN)
message(WARNING "LaunchScreen.storyboard isn't specified, it's is now recommanded to have one if you don't set REQUIRES_FULL_SCREEN")
endif() # NOT QT_IOS_REQUIRES_FULL_SCREEN
endif() # QT_IOS_VERBOSE
endif() # QT_IOS_LAUNCHSCREEN_STORYBOARD
# Add Main storyboard as ressource
if(QT_IOS_MAIN_STORYBOARD)
target_sources(${QT_IOS_TARGET} PRIVATE ${QT_IOS_MAIN_STORYBOARD})
set_source_files_properties(${QT_IOS_MAIN_STORYBOARD} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
# We just need to set the filename without extension
string(REGEX MATCH "([a-zA-Z0-9 \\-_]*)\\.storyboard" STORYBOARD_FILE_NAME ${QT_IOS_MAIN_STORYBOARD})
if(QT_IOS_VERBOSE)
message(STATUS "Add UIMainStoryboardFile key with value ${CMAKE_MATCH_1} in Info.pList")
endif() # QT_IOS_VERBOSE
set(MACOSX_BUNDLE_MAIN_STORYBOARD ${CMAKE_MATCH_1} PARENT_SCOPE)
endif(QT_IOS_MAIN_STORYBOARD)
if(${PLATFORM_INT} MATCHES ".*SIMULATOR.*" AND QT_IOS_IPA)
unset(QT_IOS_IPA)
message(WARNING "Ipa can't be enabled for simulator.")
endif()
if(QT_IOS_IPA)
set(QT_IOS_TARGET_ARCHIVE ${QT_IOS_TARGET}Archive)
set(QT_IOS_TARGET_IPA ${QT_IOS_TARGET}Ipa)
set(QT_IOS_TARGET_ARCHIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${QT_IOS_TARGET}.xcarchive)
set(QT_IOS_TARGET_IPA_PATH ${CMAKE_CURRENT_BINARY_DIR}/${QT_IOS_TARGET_IPA})
# Generate archive
add_custom_target(${QT_IOS_TARGET_ARCHIVE}
ALL
DEPENDS ${QT_IOS_TARGET}
COMMAND xcodebuild
-project ${PROJECT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.xcodeproj
-scheme ${QT_IOS_TARGET}
-archivePath ${QT_IOS_TARGET_ARCHIVE_PATH}
archive
)
# Generate IPA
if(QT_IOS_PROVISIONING_PROFILE_SPECIFIER)
set(QT_IOS_EXPORT_SIGNING_TYPE "manual")
else()
set(QT_IOS_EXPORT_SIGNING_TYPE "automatic")
endif()
set(QT_IOS_PROVISIONING_PROFILES_KEY
"provisioningProfiles\n \n ${QT_IOS_BUNDLE_IDENTIFIER}\n ${QT_IOS_PROVISIONING_PROFILE_SPECIFIER}\n \n"
)
if(ENABLE_BITCODE)
set(QT_IOS_ENABLE_BITCODE TRUE)
endif()
if(QT_IOS_ENABLE_BITCODE)
set(QT_IOS_ENABLE_BITCODE_KEY "compileBitcode")
else()
set(QT_IOS_ENABLE_BITCODE_KEY "")
endif()
if(QT_IOS_UPLOAD_SYMBOL)
set(QT_IOS_UPLOAD_SYMBOL_KEY "uploadSymbols")
else()
set(QT_IOS_UPLOAD_SYMBOL_KEY "")
endif()
if(QT_IOS_PHOTO_LIBRARY_USAGE_DESCRIPTION)
set(MACOSX_BUNDLE_PHOTO_LIBRARY_USAGE_DESCRIPTION "NSPhotoLibraryUsageDescription ${QT_IOS_PHOTO_LIBRARY_USAGE_DESCRIPTION}" PARENT_SCOPE)
endif()
set(QT_IOS_EXPORT_OPTIONS_FILE ${CMAKE_CURRENT_BINARY_DIR}/${QT_IOS_TARGET}ExportOptions.plist)
configure_file(${QT_IOS_SOURCE_DIR}/ExportOptions.plist.in ${QT_IOS_EXPORT_OPTIONS_FILE})
add_custom_target(${QT_IOS_TARGET_IPA}
ALL
DEPENDS ${QT_IOS_TARGET_ARCHIVE}
COMMAND xcodebuild -exportArchive
-archivePath ${QT_IOS_TARGET_ARCHIVE_PATH}
-exportOptionsPlist ${QT_IOS_EXPORT_OPTIONS_FILE}
-exportPath ${QT_IOS_TARGET_IPA_PATH}
${QT_IOS_EXPORT_ARCHIVE_XCODEBUILD_FLAGS}
)
endif()
endfunction()