summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2022-01-25 08:44:55 +0100
committerMichal Klocek <michal.klocek@qt.io>2022-02-07 11:58:26 +0000
commitb06559912e89d937def27f84cb9c4ffbf26c1523 (patch)
tree911e53c0b11ee3ec59c4ddac3ac70bc3ec8d1d7e
parent1fbc256110da7f87d2b0c526d6e256c4e7ec7d5f (diff)
Add QtPdf iOS build cmake changes
Keeps cmake files in sync across branches, iOS build is not supported since ios changes are not backported from 94-based to 90-based. Task-number: QTBUG-88614 Change-Id: I7775c8b4d1554df497eb61fa6187f12c00b9032d (cherry picked from commit 8998563677e3f308083ba1c4c28efd6fe3d850f7) Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r--cmake/Functions.cmake127
-rw-r--r--configure.cmake12
-rw-r--r--src/CMakeLists.txt8
-rw-r--r--src/pdf/CMakeLists.txt3
4 files changed, 126 insertions, 24 deletions
diff --git a/cmake/Functions.cmake b/cmake/Functions.cmake
index 110df2f0a..320a84a21 100644
--- a/cmake/Functions.cmake
+++ b/cmake/Functions.cmake
@@ -345,6 +345,14 @@ function(get_darwin_sdk_version result)
endif()
endfunction()
+function(get_ios_target_triple_and_sysroot result arch)
+ get_ios_sysroot(sysroot ${arch})
+ set(${result}
+ -target ${arch}-apple-ios${CMAKE_OSX_DEPLOYMENT_TARGET}
+ -isysroot ${sysroot} PARENT_SCOPE
+ )
+endfunction()
+
function(add_ninja_target target cmakeTarget ninjaTarget config arch buildDir)
string(TOUPPER ${config} cfg)
add_custom_target(${target} DEPENDS ${buildDir}/${config}/${arch}/${ninjaTarget}.stamp)
@@ -464,36 +472,86 @@ function(add_rsp_command target buildDir completeStatic)
)
endfunction()
-function(add_lipo_command target buildDir)
+function(add_ios_rsp_command target buildDir completeStatic)
get_target_property(config ${target} CONFIG)
+ get_target_property(arch ${target} ARCH)
+ get_target_property(ninjaTarget ${target} NINJA_TARGET)
get_target_property(cmakeTarget ${target} CMAKE_TARGET)
- set(libs_rsp "${buildDir}/x86_64/${ninjaTarget}_libs.rsp")
- # Lipo the object files together to a single fat archive
- add_library(${cmakeTarget}_${config} STATIC IMPORTED GLOBAL)
+ string(TOUPPER ${config} cfg)
+ get_ios_target_triple_and_sysroot(args ${arch})
+ set(objects_rsp "${buildDir}/${ninjaTarget}_objects.rsp")
+ set(objects_out "${buildDir}/${cmakeTarget}_objects.o")
add_custom_command(
- OUTPUT ${buildDir}/lib${cmakeTarget}.a
- COMMAND lipo -create
- -output ${buildDir}/lib${cmakeTarget}.a
- ARGS
- ${buildDir}/arm64/${cmakeTarget}.a
- ${buildDir}/x86_64/${cmakeTarget}.a
+ OUTPUT ${objects_out}
+ COMMAND clang++ -r -nostdlib
+ ${args}
+ -o ${objects_out}
+ -Wl,-keep_private_externs
+ @${objects_rsp}
DEPENDS
- ${buildDir}/arm64/${cmakeTarget}.a
- ${buildDir}/x86_64/${cmakeTarget}.a
+ ${buildDir}/${ninjaTarget}.stamp
+ WORKING_DIRECTORY "${buildDir}/../../.."
+ COMMENT "Creating intermediate object files for ${cmakeTarget}/${config}/${arch}"
USES_TERMINAL
VERBATIM
+ COMMAND_EXPAND_LISTS
)
+endfunction()
+
+# Lipo the object files together to a single fat archive
+function(create_lipo_command target buildDir fileName)
+ get_target_property(config ${target} CONFIG)
+ get_architectures(archs)
+ foreach(arch ${archs})
+ list(APPEND lipo_objects ${buildDir}/${arch}/${fileName})
+ endforeach()
+ add_custom_command(
+ OUTPUT ${buildDir}/${fileName}
+ COMMAND lipo -create
+ -output ${buildDir}/${fileName}
+ ARGS ${lipo_objects}
+ DEPENDS ${lipo_objects}
+ USES_TERMINAL
+ COMMENT "Running lipo for ${target}/${config}/${arch}"
+ VERBATIM
+ )
+endfunction()
+
+# this function only deals with objects as it is only
+# used by qtpdf and we do not need anything more
+function(add_ios_lipo_command target buildDir)
+ get_target_property(config ${target} CONFIG)
+ get_target_property(cmakeTarget ${target} CMAKE_TARGET)
+ set(fileName ${cmakeTarget}_objects.o)
+ create_lipo_command(${target} ${buildDir} ${fileName})
+ add_custom_target(lipo_${cmakeTarget}_${config} DEPENDS
+ ${buildDir}/${fileName}
+ )
+ add_dependencies(${cmakeTarget} lipo_${cmakeTarget}_${config})
+ qt_internal_get_target_property(options ${cmakeTarget} STATIC_LIBRARY_OPTIONS)
+ set_target_properties(${cmakeTarget} PROPERTIES STATIC_LIBRARY_OPTIONS
+ "${options}$<$<CONFIG:${config}>:${buildDir}/${fileName}>"
+ )
+endfunction()
+
+function(add_lipo_command target buildDir)
+ get_target_property(config ${target} CONFIG)
+ get_target_property(cmakeTarget ${target} CMAKE_TARGET)
+ set(fileName ${cmakeTarget}.a)
+ create_lipo_command(${target} ${buildDir} ${fileName})
+ add_library(${cmakeTarget}_${config} STATIC IMPORTED GLOBAL)
set_property(TARGET ${cmakeTarget}_${config}
- PROPERTY IMPORTED_LOCATION ${buildDir}/lib${cmakeTarget}.a
+ PROPERTY IMPORTED_LOCATION ${buildDir}/${fileName}
)
add_custom_target(lipo_${cmakeTarget}_${config} DEPENDS
- ${buildDir}/lib${cmakeTarget}.a
+ ${buildDir}/${fileName}
)
add_dependencies(${cmakeTarget}_${config} lipo_${cmakeTarget}_${config})
target_link_libraries(${cmakeTarget} PRIVATE ${cmakeTarget}_${config})
# Just link with dynamic libs once
# TODO: this is evil hack, since cmake has no idea about libs
+ set(libs_rsp "${buildDir}/x86_64/${ninjaTarget}_libs.rsp")
target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${libs_rsp}>")
endfunction()
@@ -580,6 +638,19 @@ function(get_gn_is_clang result)
endif()
endfunction()
+function(get_ios_sysroot result arch)
+ if(NOT CMAKE_APPLE_ARCH_SYSROOTS)
+ message(FATAL_ERROR "CMAKE_APPLE_ARCH_SYSROOTS not set.")
+ endif()
+ get_architectures(archs)
+ list(FIND archs ${arch} known_arch)
+ if (known_arch EQUAL "-1")
+ message(FATAL_ERROR "Unknown iOS architecture ${arch}.")
+ endif()
+ list(GET CMAKE_APPLE_ARCH_SYSROOTS ${known_arch} sysroot)
+ set(${result} ${sysroot} PARENT_SCOPE)
+endfunction()
+
function(configure_gn_toolchain name binTargetCpu v8TargetCpu toolchainIn toolchainOut)
set(GN_TOOLCHAIN ${name})
get_gn_os(GN_OS)
@@ -727,7 +798,8 @@ macro(append_build_type_setup)
CONDITION FEATURE_developer_build
)
- if(NOT QT_FEATURE_webengine_full_debug_info)
+ #TODO: refactor to not check for IOS here
+ if(NOT QT_FEATURE_webengine_full_debug_info AND NOT IOS)
list(APPEND gnArgArg blink_symbol_level=0 remove_v8base_debug_symbols=true)
endif()
@@ -779,6 +851,14 @@ macro(append_compiler_linker_sdk_setup)
mac_sdk_min="${macSdkVersion}"
)
endif()
+ if(IOS)
+ list(APPEND gnArgArg
+ use_system_xcode=true
+ enable_ios_bitcode=true
+ ios_deployment_target="${CMAKE_OSX_DEPLOYMENT_TARGET}"
+ ios_enable_code_signing=false
+ )
+ endif()
else()
if(QT_FEATURE_use_lld_linker)
get_filename_component(clangBasePath ${CMAKE_LINKER} DIRECTORY)
@@ -887,6 +967,10 @@ macro(append_toolchain_setup)
else()
get_gn_arch(cpu ${arch})
list(APPEND gnArgArg target_cpu="${cpu}")
+ if(IOS)
+ get_ios_sysroot(sysroot ${arch})
+ list(APPEND gnArgArg target_sysroot="${sysroot}" target_os="ios")
+ endif()
endif()
endmacro()
@@ -932,10 +1016,10 @@ function(get_configs result)
endfunction()
function(get_architectures result)
- if(NOT QT_IS_MACOS_UNIVERSAL)
- set(${result} ${CMAKE_SYSTEM_PROCESSOR} PARENT_SCOPE)
- else()
+ if(QT_IS_MACOS_UNIVERSAL OR IOS)
set(${result} ${CMAKE_OSX_ARCHITECTURES} PARENT_SCOPE)
+ else()
+ set(${result} ${CMAKE_SYSTEM_PROCESSOR} PARENT_SCOPE)
endif()
endfunction()
@@ -967,6 +1051,8 @@ function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget module buildDi
)
if(QT_IS_MACOS_UNIVERSAL)
add_rsp_command(${target} ${buildDir}/${config}/${arch} ${completeStatic})
+ elseif(IOS)
+ add_ios_rsp_command(${target} ${buildDir}/${config}/${arch} ${completeStatic})
else()
extend_cmake_target(${target} ${buildDir}/${config}/${arch} ${completeStatic})
endif()
@@ -976,6 +1062,11 @@ function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget module buildDi
set(target ${ninjaTarget}_${config}_${arch})
add_lipo_command(${target} ${buildDir}/${config})
endif()
+ if(IOS)
+ list(GET archs 0 arch)
+ set(target ${ninjaTarget}_${config}_${arch})
+ add_ios_lipo_command(${target} ${buildDir}/${config})
+ endif()
endforeach()
endfunction()
diff --git a/configure.cmake b/configure.cmake
index 015bcd121..0c6a052de 100644
--- a/configure.cmake
+++ b/configure.cmake
@@ -361,10 +361,15 @@ assertTargets(
TARGETS Gui Quick Qml
)
add_check_for_support(
- MODULES QtWebEngine QtPdf
+ MODULES QtWebEngine
CONDITION LINUX OR (WIN32 AND NOT WIN_ARM_64) OR (MACOS AND NOT CMAKE_CROSSCOMPILING)
MESSAGE "Build can be done only on Linux, Windows or macOS."
)
+add_check_for_support(
+ MODULES QtPdf
+ CONDITION LINUX OR (WIN32 AND NOT WIN_ARM_64) OR (MACOS AND NOT CMAKE_CROSSCOMPILING) OR IOS
+ MESSAGE "Build can be done only on Linux, Windows, macOS or iOS."
+)
if(LINUX AND CMAKE_CROSSCOMPILING)
get_gn_arch(testArch ${TEST_architecture_arch})
add_check_for_support(
@@ -374,7 +379,7 @@ if(LINUX AND CMAKE_CROSSCOMPILING)
)
endif()
add_check_for_support(
- MODULES QtWebEngine QtPdf
+ MODULES QtWebEngine
CONDITION NOT QT_FEATURE_static
MESSAGE "Static build is not supported."
)
@@ -461,7 +466,8 @@ add_check_for_support(
(WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL MSVC) OR
(WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL Clang AND
CMAKE_CXX_SIMULATE_ID STREQUAL MSVC) OR
- (MACOS AND CMAKE_CXX_COMPILER_ID STREQUAL AppleClang)
+ (MACOS AND CMAKE_CXX_COMPILER_ID STREQUAL AppleClang) OR
+ (APPLE AND CMAKE_CXX_COMPILER_ID STREQUAL AppleClang)
MESSAGE "${CMAKE_CXX_COMPILER_ID} compiler is not supported."
)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5ba4cb1c6..227e1186e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -117,6 +117,10 @@ endif()
# GN PROJECT
##
+if(CMAKE_CROSSCOMPILING AND NOT Gn_FOUND)
+ message(FATAL_ERROR "No gn found for cross-compilation")
+endif()
+
if(NOT Gn_FOUND)
externalproject_add(gn
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/gn
@@ -145,7 +149,7 @@ endif()
# HOST PROJECT
##
-if(CMAKE_CROSSCOMPILING)
+if(CMAKE_CROSSCOMPILING AND NOT IOS)
if(NOT Gn_FOUND)
message(FATAL_ERROR "\nHost gn not found - cross compilation not possible")
@@ -175,7 +179,7 @@ if(CMAKE_CROSSCOMPILING)
endif()
# install gn for cross build
-if(LINUX AND INSTALL_GN)
+if((LINUX OR MACOS) AND INSTALL_GN)
get_install_config(installConfig)
install(
PROGRAMS ${installDir}/bin/gn
diff --git a/src/pdf/CMakeLists.txt b/src/pdf/CMakeLists.txt
index d7038d06f..794865137 100644
--- a/src/pdf/CMakeLists.txt
+++ b/src/pdf/CMakeLists.txt
@@ -8,7 +8,6 @@ if(PkgConfig_FOUND)
endif()
set(buildDir "${CMAKE_CURRENT_BINARY_DIR}")
-add_subdirectory(plugins/imageformats/pdf)
##
# PDF MODULE
@@ -41,6 +40,8 @@ qt_internal_add_module(Pdf
Qt::Gui
)
+add_subdirectory(plugins/imageformats/pdf)
+
##
# PDF DOCS
##