diff options
author | Michal Klocek <michal.klocek@qt.io> | 2022-01-25 08:44:55 +0100 |
---|---|---|
committer | Michal Klocek <michal.klocek@qt.io> | 2022-02-07 11:58:26 +0000 |
commit | b06559912e89d937def27f84cb9c4ffbf26c1523 (patch) | |
tree | 911e53c0b11ee3ec59c4ddac3ac70bc3ec8d1d7e | |
parent | 1fbc256110da7f87d2b0c526d6e256c4e7ec7d5f (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.cmake | 127 | ||||
-rw-r--r-- | configure.cmake | 12 | ||||
-rw-r--r-- | src/CMakeLists.txt | 8 | ||||
-rw-r--r-- | src/pdf/CMakeLists.txt | 3 |
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 ## |