summaryrefslogtreecommitdiffstats
path: root/cmake/Functions.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/Functions.cmake')
-rw-r--r--cmake/Functions.cmake418
1 files changed, 279 insertions, 139 deletions
diff --git a/cmake/Functions.cmake b/cmake/Functions.cmake
index e66aa0694..6cc8a401e 100644
--- a/cmake/Functions.cmake
+++ b/cmake/Functions.cmake
@@ -1,7 +1,12 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
function(assertTargets)
- qt_parse_all_arguments(arg "add_check_for_support"
- "" "" "MODULES;TARGETS" "${ARGN}"
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "" "" "MODULES;TARGETS"
)
+ _qt_internal_validate_all_args_are_parsed(arg)
+
foreach(module ${arg_MODULES})
if(NOT DEFINED ${module}_SUPPORT)
set(${module}_SUPPORT ON PARENT_SCOPE)
@@ -19,30 +24,20 @@ function(assertTargets)
endforeach()
endfunction()
-#TODO: remove me
-function(add_implicit_dependencies target)
- if(TARGET ${target})
- list(REMOVE_ITEM ARGN ${target})
- foreach(qtTarget IN ITEMS ${ARGN})
- if(TARGET Qt::${qtTarget})
- add_dependencies(${target} Qt::${qtTarget})
- endif()
- endforeach()
- endif()
-endfunction()
-
# TODO: this should be idealy in qtbase
function(add_check_for_support)
- qt_parse_all_arguments(arg "add_check_for_support"
- "" "" "MODULES;MESSAGE;CONDITION" "${ARGN}"
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "" "" "MODULES;MESSAGE;CONDITION"
)
+ _qt_internal_validate_all_args_are_parsed(arg)
+
foreach(module ${arg_MODULES})
if(NOT DEFINED ${module}_SUPPORT)
set(${module}_SUPPORT ON PARENT_SCOPE)
set(${module}_SUPPORT ON)
endif()
if(${module}_SUPPORT)
- if("x${arg_CONDITION}" STREQUAL x)
+ if("x${arg_CONDITION}" STREQUAL "x")
set(arg_CONDITION ON)
endif()
qt_evaluate_config_expression(result ${arg_CONDITION})
@@ -58,23 +53,6 @@ function(add_check_for_support)
endforeach()
endfunction()
-function(get_qt_features outList module)
- get_cmake_property(variableList VARIABLES)
- set(_featureList "")
- foreach (variableKey ${variableList})
- unset(FOUND)
- string(REGEX MATCH QT_FEATURE_${module} FOUND ${variableKey})
- if(FOUND)
- list(APPEND _featureList "${variableKey}=${${variableKey}}")
- endif()
- endforeach()
- if("${${outList}}" STREQUAL "")
- set(${outList} ${_featureList} PARENT_SCOPE)
- else()
- set(${outList} "${${outList}}" "${_featureList}" PARENT_SCOPE)
- endif()
-endfunction()
-
function(create_cxx_config cmakeTarget arch configFileName)
if(NOT QT_SUPERBUILD AND QT_WILL_INSTALL)
get_target_property(mocFilePath Qt6::moc IMPORTED_LOCATION)
@@ -178,8 +156,10 @@ endmacro()
function(extend_gn_target target)
get_target_property(elements ${target} ELEMENTS)
- qt_parse_all_arguments(GN "extend_gn_target" "" "" "CONDITION;${elements}" "${ARGN}")
- if("x${GN_CONDITION}" STREQUAL x)
+ cmake_parse_arguments(PARSE_ARGV 1 GN "" "" "CONDITION;${elements}")
+ _qt_internal_validate_all_args_are_parsed(GN)
+
+ if("x${GN_CONDITION}" STREQUAL "x")
set(GN_CONDITION ON)
endif()
qt_evaluate_config_expression(result ${GN_CONDITION})
@@ -190,8 +170,10 @@ function(extend_gn_target target)
endfunction()
function(extend_gn_list outList)
- qt_parse_all_arguments(GN "extend_gn_list" "" "" "ARGS;CONDITION" "${ARGN}")
- if("x${GN_CONDITION}" STREQUAL x)
+ cmake_parse_arguments(PARSE_ARGV 1 GN "" "" "ARGS;CONDITION")
+ _qt_internal_validate_all_args_are_parsed(GN)
+
+ if("x${GN_CONDITION}" STREQUAL "x")
set(GN_CONDITION ON)
endif()
qt_evaluate_config_expression(result ${GN_CONDITION})
@@ -211,10 +193,15 @@ function(configure_gn_target sourceDir inFilePath outFilePath)
# FIXME: GN_CONFIG
set(GN_CONFIG NOTUSED)
+ set(path_mode REALPATH)
+ if(APPLE AND QT_ALLOW_SYMLINK_IN_PATHS)
+ set(path_mode ABSOLUTE)
+ endif()
+
# GN_SOURCES GN_HEADERS
get_property(gnSources DIRECTORY PROPERTY GN_SOURCES)
foreach(gnSourceFile ${gnSources})
- get_filename_component(gnSourcePath ${sourceDir}/${gnSourceFile} REALPATH)
+ get_filename_component(gnSourcePath ${sourceDir}/${gnSourceFile} ${path_mode})
list(APPEND sourceList \"${gnSourcePath}\")
endforeach()
set(GN_HEADERS ${sourceList})
@@ -234,7 +221,7 @@ function(configure_gn_target sourceDir inFilePath outFilePath)
get_property(gnIncludes DIRECTORY PROPERTY GN_INCLUDES)
list(REMOVE_DUPLICATES gnIncludes)
foreach(gnInclude ${gnIncludes})
- get_filename_component(gnInclude ${gnInclude} REALPATH)
+ get_filename_component(gnInclude ${gnInclude} ${path_mode})
list(APPEND GN_ARGS_INCLUDES \"-I${gnInclude}\")
list(APPEND GN_INCLUDE_DIRS \"${gnInclude}\")
endforeach()
@@ -258,7 +245,7 @@ function(configure_gn_target sourceDir inFilePath outFilePath)
list(REMOVE_DUPLICATES GN_CFLAGS_C)
# GN_SOURCE_ROOT
- get_filename_component(GN_SOURCE_ROOT "${sourceDir}" REALPATH)
+ get_filename_component(GN_SOURCE_ROOT "${sourceDir}" ${path_mode})
if(APPLE) # this runs in scrpit mode without qt-cmake so on MACOS here
recoverFrameworkBuild(GN_INCLUDE_DIRS GN_CFLAGS_C)
@@ -300,7 +287,7 @@ function(get_install_config result)
set(${result} "Release" PARENT_SCOPE)
elseif("RelWithDebInfo" IN_LIST CMAKE_CONFIGURATION_TYPES)
set(${result} "RelWithDebInfo" PARENT_SCOPE)
- elseif("Debug" IN_LIST CMAKE_CONFIGURATION_TYPE)
+ elseif("Debug" IN_LIST CMAKE_CONFIGURATION_TYPES)
set(${result} "Debug" PARENT_SCOPE)
else()
# assume MinSizeRel ?
@@ -309,13 +296,6 @@ function(get_install_config result)
endif()
endfunction()
-macro(assertRunAsTopLevelBuild)
- if(NOT DEFINED WEBENGINE_REPO_BUILD)
- message(FATAL_ERROR "This cmake file should run as top level build.")
- return()
- endif()
-endmacro()
-
# we need to pass -F or -iframework in case of frameworks builds, which gn treats as
# compiler flag and cmake as include dir, so swap it.
function(recoverFrameworkBuild includeDirs compilerFlags)
@@ -373,14 +353,20 @@ function(get_ios_target_triple_and_sysroot result arch)
)
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)
- set_target_properties(${target} PROPERTIES
- CONFIG ${config}
- ARCH ${arch}
- CMAKE_TARGET ${cmakeTarget}
- NINJA_TARGET ${ninjaTarget}
+function(add_ninja_target)
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "" "TARGET;CMAKE_TARGET;NINJA_TARGET;BUILDDIR;NINJA_STAMP;NINJA_DATA_STAMP;CONFIG;ARCH" ""
+ )
+ _qt_internal_validate_all_args_are_parsed(arg)
+ set(stamps ${arg_NINJA_STAMP} ${arg_NINJA_DATA_STAMP})
+ list(TRANSFORM stamps PREPEND "${arg_BUILDDIR}/${arg_CONFIG}/${arg_ARCH}/")
+ add_custom_target(${arg_TARGET} DEPENDS ${stamps})
+ set_target_properties(${arg_TARGET} PROPERTIES
+ CONFIG ${arg_CONFIG}
+ ARCH ${arg_ARCH}
+ CMAKE_TARGET ${arg_CMAKE_TARGET}
+ NINJA_TARGET ${arg_NINJA_TARGET}
+ NINJA_STAMP ${arg_NINJA_STAMP}
)
endfunction()
@@ -428,29 +414,46 @@ function(add_linker_options target buildDir completeStatic)
set(objects_rsp "${buildDir}/${ninjaTarget}_objects.rsp")
set(archives_rsp "${buildDir}/${ninjaTarget}_archives.rsp")
set(libs_rsp "${buildDir}/${ninjaTarget}_libs.rsp")
+ set(ldir_rsp "${buildDir}/${ninjaTarget}_ldir.rsp")
set_target_properties(${cmakeTarget} PROPERTIES STATIC_LIBRARY_OPTIONS "@${objects_rsp}")
- if(LINUX)
+ if(LINUX OR ANDROID)
+ get_gn_arch(cpu ${TEST_architecture_arch})
+ if(CMAKE_CROSSCOMPILING AND cpu STREQUAL "arm" AND ${config} STREQUAL "Debug")
+ target_link_options(${cmakeTarget} PRIVATE "LINKER:--long-plt")
+ endif()
target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${objects_rsp}>")
+ # Chromium is meant for linking with gc-sections, which seems to not always get applied otherwise
+ target_link_options(${cmakeTarget} PRIVATE "-Wl,--gc-sections")
if(NOT completeStatic)
target_link_libraries(${cmakeTarget} PRIVATE
"$<1:-Wl,--start-group $<$<CONFIG:${config}>:@${archives_rsp}> -Wl,--end-group>"
)
endif()
+
# linker here options are just to prevent processing it by cmake
target_link_libraries(${cmakeTarget} PRIVATE
- "$<1:-Wl,--no-fatal-warnings $<$<CONFIG:${config}>:@${libs_rsp}> -Wl,--no-fatal-warnings>"
+ "$<1:-Wl,--no-fatal-warnings $<$<CONFIG:${config}>:@${ldir_rsp}> $<$<CONFIG:${config}>:@${libs_rsp}> -Wl,--no-fatal-warnings>"
)
-
+ unset(cpu)
endif()
if(MACOS)
target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${objects_rsp}>")
if(NOT completeStatic)
target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${archives_rsp}>")
endif()
- target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${libs_rsp}>")
+ target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${ldir_rsp}>" "$<$<CONFIG:${config}>:@${libs_rsp}>")
endif()
if(WIN32)
get_copy_of_response_file(objects_rsp ${target} objects)
+ if(NOT MINGW)
+ target_link_options(${cmakeTarget}
+ PRIVATE /DELAYLOAD:mf.dll /DELAYLOAD:mfplat.dll /DELAYLOAD:mfreadwrite.dll /DELAYLOAD:winmm.dll
+ )
+ # enable larger PDBs if webenginecore debug build
+ if(cmakeTarget STREQUAL "WebEngineCore")
+ target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:Debug>:/pdbpagesize:8192>")
+ endif()
+ endif()
target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${objects_rsp}>")
if(NOT completeStatic)
get_copy_of_response_file(archives_rsp ${target} archives)
@@ -468,6 +471,7 @@ function(add_intermediate_archive target buildDir completeStatic)
get_target_property(arch ${target} ARCH)
get_target_property(ninjaTarget ${target} NINJA_TARGET)
get_target_property(cmakeTarget ${target} CMAKE_TARGET)
+ get_target_property(ninjaStamp ${target} NINJA_STAMP)
string(TOUPPER ${config} cfg)
set(objects_rsp "${buildDir}/${ninjaTarget}_objects.rsp")
set(objects_out "${buildDir}/${cmakeTarget}_objects.o")
@@ -495,7 +499,7 @@ function(add_intermediate_archive target buildDir completeStatic)
${objects_out}
${archives_out}
DEPENDS
- ${buildDir}/${ninjaTarget}.stamp
+ ${buildDir}/${ninjaStamp}
WORKING_DIRECTORY "${buildDir}/../../.."
COMMENT "Creating intermediate archives for ${cmakeTarget}/${config}/${arch}"
USES_TERMINAL
@@ -509,6 +513,7 @@ function(add_intermediate_object target buildDir completeStatic)
get_target_property(arch ${target} ARCH)
get_target_property(ninjaTarget ${target} NINJA_TARGET)
get_target_property(cmakeTarget ${target} CMAKE_TARGET)
+ get_target_property(ninjaStamp ${target} NINJA_STAMP)
string(TOUPPER ${config} cfg)
if(IOS)
get_ios_target_triple_and_sysroot(args ${arch})
@@ -523,7 +528,7 @@ function(add_intermediate_object target buildDir completeStatic)
-Wl,-keep_private_externs
@${objects_rsp}
DEPENDS
- ${buildDir}/${ninjaTarget}.stamp
+ ${buildDir}/${ninjaStamp}
WORKING_DIRECTORY "${buildDir}/../../.."
COMMENT "Creating intermediate object files for ${cmakeTarget}/${config}/${arch}"
USES_TERMINAL
@@ -571,6 +576,7 @@ endfunction()
function(add_lipo_command target buildDir)
get_target_property(config ${target} CONFIG)
get_target_property(cmakeTarget ${target} CMAKE_TARGET)
+ get_target_property(ninjaTarget ${target} NINJA_TARGET)
set(fileName ${cmakeTarget}.a)
create_lipo_command(${target} ${buildDir} ${fileName})
add_library(${cmakeTarget}_${config} STATIC IMPORTED GLOBAL)
@@ -609,40 +615,50 @@ function(qt_internal_add_external_project_dependency_to_root_project name)
cmake_policy(POP)
endfunction()
+# Function maps TEST_architecture_arch or CMAKE_SYSTEM_PROCESSOR into gn architecture
function(get_gn_arch result arch)
- if(arch STREQUAL "i386")
+ set(armList arm armv7-a)
+ set(mips64List mips64 mipsel64)
+ set(x86List i386 i686)
+ set(x64List x86_64 AMD64 x86_64h aarch64)
+ if(arch IN_LIST x86List)
set(${result} "x86" PARENT_SCOPE)
- elseif(arch STREQUAL "x86_64")
+ elseif(arch IN_LIST x64List)
set(${result} "x64" PARENT_SCOPE)
- elseif(arch STREQUAL "arm")
+ elseif(arch IN_LIST armList)
set(${result} "arm" PARENT_SCOPE)
elseif(arch STREQUAL "arm64")
set(${result} "arm64" PARENT_SCOPE)
elseif(arch STREQUAL "mipsel")
set(${result} "mipsel" PARENT_SCOPE)
- elseif(arch STREQUAL "mipsel64")
+ elseif(arch IN_LIST mipsList)
set(${result} "mips64el" PARENT_SCOPE)
+ elseif(arch STREQUAL "riscv64")
+ set(${result} "riscv64" PARENT_SCOPE)
else()
- message(DEBUG "Unsupported architecture: ${arch}")
+ message(FATAL_ERROR "Unknown architecture: ${arch}")
endif()
endfunction()
+# Function maps gn architecture for v8
function(get_v8_arch result targetArch hostArch)
- set(list32 i386 arm mipsel)
+ set(list32 x86 arm mipsel riscv32)
if(hostArch STREQUAL targetArch)
set(${result} "${targetArch}" PARENT_SCOPE)
elseif(targetArch IN_LIST list32)
# 32bit target which needs a 32bit compatible host
- if(hostArch STREQUAL "x86_64")
- set(${result} "i386" PARENT_SCOPE)
+ if(hostArch STREQUAL "x64")
+ set(${result} "x86" PARENT_SCOPE)
elseif(hostArch STREQUAL "arm64")
set(${result} "arm" PARENT_SCOPE)
- elseif(hostArch STREQUAL "mips64")
- set(${result} "mipsel" PARENT_SCOPE)
- elseif(hostArch STREQUAL "mipsel64")
+ elseif(hostArch STREQUAL "mips64el")
set(${result} "mipsel" PARENT_SCOPE)
+ elseif(hostArch STREQUAL "riscv64")
+ set(${result} "riscv32" PARENT_SCOPE)
+ elseif(hostArch IN_LIST list32)
+ set(${result} "${hostArch}" PARENT_SCOPE)
else()
- message(DEBUG "Unsupported architecture: ${hostArch}")
+ message(FATAL_ERROR "Unknown architecture: ${hostArch}")
endif()
else()
# assume 64bit target which matches 64bit host
@@ -672,6 +688,15 @@ function(get_gn_is_clang result)
endif()
endfunction()
+
+function(get_gn_is_mingw result)
+ if(MINGW)
+ set(${result} "true" PARENT_SCOPE)
+ else()
+ set(${result} "false" PARENT_SCOPE)
+ endif()
+endfunction()
+
function(get_ios_sysroot result arch)
if(NOT CMAKE_APPLE_ARCH_SYSROOTS)
message(FATAL_ERROR "CMAKE_APPLE_ARCH_SYSROOTS not set.")
@@ -685,12 +710,13 @@ function(get_ios_sysroot result arch)
set(${result} ${sysroot} PARENT_SCOPE)
endfunction()
-function(configure_gn_toolchain name binTargetCpu v8TargetCpu toolchainIn toolchainOut)
+function(configure_gn_toolchain name cpu v8Cpu toolchainIn toolchainOut)
set(GN_TOOLCHAIN ${name})
get_gn_os(GN_OS)
get_gn_is_clang(GN_IS_CLANG)
- get_gn_arch(GN_CPU ${binTargetCpu})
- get_gn_arch(GN_V8_CPU ${v8TargetCpu})
+ get_gn_is_mingw(GN_IS_MINGW)
+ set(GN_CPU ${cpu})
+ set(GN_V8_CPU ${v8Cpu})
configure_file(${toolchainIn} ${toolchainOut}/BUILD.gn @ONLY)
endfunction()
@@ -726,7 +752,9 @@ function(extract_cflag result cflag)
endfunction()
function(extend_gn_list_cflag outList)
- qt_parse_all_arguments(GN "extend_gn_list_cflag" "" "" "ARG;CFLAG" "${ARGN}")
+ cmake_parse_arguments(PARSE_ARGV 1 GN "" "" "ARG;CFLAG")
+ _qt_internal_validate_all_args_are_parsed(GN)
+
extract_cflag(cflag "${GN_CFLAG}")
if(cflag)
set(${outList} "${${outList}}" "${GN_ARG}=\"${cflag}\"" PARENT_SCOPE)
@@ -770,37 +798,40 @@ macro(create_pkg_config_host_wrapper buildDir)
endmacro()
macro(setup_toolchains)
+ get_gn_arch(gn_arch ${TEST_architecture_arch})
if(NOT CMAKE_CROSSCOMPILING) # delivered by hostBuild project
- configure_gn_toolchain(host ${TEST_architecture_arch} ${TEST_architecture_arch}
+ configure_gn_toolchain(host ${gn_arch} ${gn_arch}
${WEBENGINE_ROOT_SOURCE_DIR}/src/host/BUILD.toolchain.gn.in
${buildDir}/host_toolchain)
- configure_gn_toolchain(v8 ${TEST_architecture_arch} ${TEST_architecture_arch}
+ configure_gn_toolchain(v8 ${gn_arch} ${gn_arch}
${WEBENGINE_ROOT_SOURCE_DIR}/src/host/BUILD.toolchain.gn.in
${buildDir}/v8_toolchain)
endif()
- configure_gn_toolchain(target ${TEST_architecture_arch} ${TEST_architecture_arch}
+ configure_gn_toolchain(target ${gn_arch} ${gn_arch}
${WEBENGINE_ROOT_SOURCE_DIR}/src/host/BUILD.toolchain.gn.in
${buildDir}/target_toolchain)
+ unset(gn_arch)
endmacro()
macro(append_build_type_setup)
list(APPEND gnArgArg
- use_qt=true
+ is_qtwebengine=true
init_stack_vars=false
is_component_build=false
is_shared=true
use_sysroot=false
forbid_non_component_debug_builds=false
- enable_debugallocation=false
treat_warnings_as_errors=false
use_allocator_shim=false
- use_allocator="none"
+ use_partition_alloc=true
+ use_partition_alloc_as_malloc=false
use_custom_libcxx=false
+ enable_rust=false # We do not yet support rust
)
if(${config} STREQUAL "Debug")
list(APPEND gnArgArg is_debug=true symbol_level=2)
if(WIN32)
- list(APPEND gnArgArg enable_iterator_debugging=true v8_optimized_debug=false)
+ list(APPEND gnArgArg enable_iterator_debugging=true)
endif()
elseif(${config} STREQUAL "Release")
list(APPEND gnArgArg is_debug=false symbol_level=0)
@@ -817,7 +848,7 @@ macro(append_build_type_setup)
if(FEATURE_developer_build OR (${config} STREQUAL "Debug") OR QT_FEATURE_webengine_sanitizer)
list(APPEND gnArgArg
is_official_build=false
- from_here_uses_location_builtins=false
+ use_viz_debugger=false
)
else()
list(APPEND gnArgArg is_official_build=true)
@@ -834,7 +865,7 @@ macro(append_build_type_setup)
#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)
+ list(APPEND gnArgArg blink_symbol_level=0 v8_symbol_level=0)
endif()
extend_gn_list(gnArgArg ARGS use_jumbo_build CONDITION QT_FEATURE_webengine_jumbo_build)
@@ -861,6 +892,10 @@ macro(append_compiler_linker_sdk_setup)
endif()
extend_gn_list(gnArgArg ARGS is_clang CONDITION CLANG)
+ extend_gn_list(gnArgArg ARGS is_mingw CONDITION MINGW)
+ extend_gn_list(gnArgArg ARGS is_msvc CONDITION MSVC)
+ extend_gn_list(gnArgArg ARGS is_gcc CONDITION LINUX AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+
if(CLANG)
if(MACOS)
get_darwin_sdk_version(macSdkVersion)
@@ -872,9 +907,11 @@ macro(append_compiler_linker_sdk_setup)
get_filename_component(clangBasePath ${clangBasePath} DIRECTORY)
endif()
+ string(REGEX MATCH "[0-9]+" clangVersion ${CMAKE_CXX_COMPILER_VERSION})
list(APPEND gnArgArg
clang_base_path="${clangBasePath}"
clang_use_chrome_plugins=false
+ clang_version=${clangVersion}
fatal_linker_warnings=false
)
@@ -900,6 +937,14 @@ macro(append_compiler_linker_sdk_setup)
CONDITION QT_FEATURE_stdlib_libcpp
)
endif()
+ if(ANDROID)
+ list(APPEND gnArgArg
+ android_ndk_root="${CMAKE_ANDROID_NDK}"
+ android_ndk_version="${CMAKE_ANDROID_NDK_VERSION}"
+ clang_use_default_sample_profile=false
+ #android_ndk_major_version=22
+ )
+ endif()
else()
if(QT_FEATURE_use_lld_linker)
get_filename_component(clangBasePath ${CMAKE_LINKER} DIRECTORY)
@@ -911,14 +956,16 @@ macro(append_compiler_linker_sdk_setup)
endif()
endif()
- if(WIN32)
+ if(MSVC)
get_filename_component(windowsSdkPath $ENV{WINDOWSSDKDIR} ABSOLUTE)
get_filename_component(visualStudioPath $ENV{VSINSTALLDIR} ABSOLUTE)
+ set(windowSdkVersion $ENV{WindowsSDKVersion})
list(APPEND gnArgArg
win_linker_timing=true
use_incremental_linking=false
- visual_studio_version=2019
+ visual_studio_version=2022
visual_studio_path=\"${visualStudioPath}\"
+ windows_sdk_version=\"${windowsSdkVersion}\"
windows_sdk_path=\"${windowsSdkPath}\"
)
endif()
@@ -952,6 +999,11 @@ macro(append_compiler_linker_sdk_setup)
# we use arm_neon_optional for ARMv7
list(APPEND gnArgArg arm_optionally_use_neon=true)
endif()
+ extract_cflag(march "march")
+ get_arm_version(arm_version ${march})
+ if(arm_version EQUAL 7)
+ list(APPEND gnArgArg use_arm_crc32=false)
+ endif()
check_thumb(armThumb)
extend_gn_list(gnArgArg
ARGS arm_use_thumb
@@ -966,6 +1018,7 @@ macro(append_compiler_linker_sdk_setup)
ARGS use_lld
CONDITION QT_FEATURE_use_lld_linker
)
+ unset(cpu)
endmacro()
macro(append_sanitizer_setup)
@@ -986,54 +1039,92 @@ macro(append_sanitizer_setup)
ARGS is_ubsan is_ubsan_vptr
CONDITION undefined IN_LIST ECM_ENABLE_SANITIZERS
)
+ if(APPLE)
+ list(APPEND gnArgArg
+ clang_version=\"${QT_COMPILER_VERSION_MAJOR}.${QT_COMPILER_VERSION_MINOR}.${QT_COMPILER_VERSION_PATCH}\"
+ )
+ endif()
endif()
endmacro()
macro(append_toolchain_setup)
- if(LINUX)
+ if(WIN32)
+ get_gn_arch(cpu ${arch})
+ list(APPEND gnArgArg target_cpu="${cpu}")
+ if(MINGW)
+ get_gn_arch(cpu ${TEST_architecture_arch})
+ list(APPEND gnArgArg
+ # note '/' prefix
+ custom_toolchain="/${buildDir}/target_toolchain:target"
+ host_toolchain="/${buildDir}/host_toolchain:host"
+ host_cpu="${cpu}"
+ )
+ endif()
+ elseif(LINUX)
+ get_gn_arch(cpu ${TEST_architecture_arch})
list(APPEND gnArgArg
custom_toolchain="${buildDir}/target_toolchain:target"
host_toolchain="${buildDir}/host_toolchain:host"
- v8_snapshot_toolchain="${buildDir}/v8_toolchain:v8"
)
- get_gn_arch(cpu ${TEST_architecture_arch})
if(CMAKE_CROSSCOMPILING)
- list(APPEND gnArgArg target_cpu="${cpu}")
+ list(APPEND gnArgArg
+ v8_snapshot_toolchain="${buildDir}/v8_toolchain:v8"
+ target_cpu="${cpu}"
+ )
else()
list(APPEND gnArgArg host_cpu="${cpu}")
endif()
if(CMAKE_SYSROOT)
list(APPEND gnArgArg target_sysroot="${CMAKE_SYSROOT}")
endif()
- else()
+ elseif(MACOS)
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")
+ elseif(IOS)
+ get_gn_arch(cpu ${arch})
+ get_ios_sysroot(sysroot ${arch})
+ list(APPEND gnArgArg target_cpu="${cpu}" target_sysroot="${sysroot}" target_os="ios")
+ elseif(ANDROID)
+ get_gn_arch(cpu ${TEST_architecture_arch})
+ list(APPEND gnArgArg target_os="android" target_cpu="${cpu}")
+ if(CMAKE_HOST_WIN32)
+ list(APPEND gnArgArg
+ host_toolchain="/${buildDir}/host_toolchain:host"
+ host_cpu="x64"
+ v8_snapshot_toolchain="/${buildDir}/v8_toolchain:v8"
+ )
endif()
endif()
+ unset(cpu)
endmacro()
macro(append_pkg_config_setup)
- if(LINUX)
+ if(PkgConfig_FOUND)
list(APPEND gnArgArg
pkg_config="${PKG_CONFIG_EXECUTABLE}"
host_pkg_config="${PKG_CONFIG_HOST_EXECUTABLE}"
)
+ if(NOT "$ENV{PKG_CONFIG_LIBDIR}" STREQUAL "")
+ list(APPEND gnArgArg
+ system_libdir="$ENV{PKG_CONFIG_LIBDIR}"
+ )
+ endif()
endif()
endmacro()
function(add_ninja_command)
- qt_parse_all_arguments(arg "add_ninja_command"
- "" "TARGET;OUTPUT;BUILDDIR;MODULE" "BYPRODUCTS" "${ARGN}"
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "" "TARGET;BUILDDIR;MODULE" "OUTPUT;BYPRODUCTS"
)
+ _qt_internal_validate_all_args_are_parsed(arg)
+
string(REPLACE " " ";" NINJAFLAGS "$ENV{NINJAFLAGS}")
+ list(TRANSFORM arg_OUTPUT PREPEND "${arg_BUILDDIR}/")
list(TRANSFORM arg_BYPRODUCTS PREPEND "${arg_BUILDDIR}/")
add_custom_command(
OUTPUT
- ${arg_BUILDDIR}/${arg_OUTPUT}
+ ${arg_OUTPUT}
${arg_BUILDDIR}/${arg_TARGET} # use generator expression in CMAKE 3.20
BYPRODUCTS ${arg_BYPRODUCTS}
COMMENT "Running ninja for ${arg_TARGET} in ${arg_BUILDDIR}"
@@ -1072,7 +1163,12 @@ function(get_architectures result)
set(${result} ${${result}} PARENT_SCOPE)
endfunction()
-function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget module buildDir completeStatic)
+function(add_gn_build_artifacts_to_target)
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "" "CMAKE_TARGET;NINJA_TARGET;BUILDDIR;MODULE;COMPLETE_STATIC;NINJA_STAMP;NINJA_DATA_STAMP" ""
+ )
+ _qt_internal_validate_all_args_are_parsed(arg)
+
# config loop is a workaround to be able to add_custom_command per config
# note this is fixed in CMAKE.3.20 and should be cleaned up when 3.20 is
# the minimum cmake we support
@@ -1080,41 +1176,61 @@ function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget module buildDi
get_architectures(archs)
foreach(config ${configs})
foreach(arch ${archs})
-
- set(target ${ninjaTarget}_${config}_${arch})
- add_ninja_target(${target} ${cmakeTarget} ${ninjaTarget} ${config} ${arch} ${buildDir})
+ set(target ${arg_NINJA_TARGET}_${config}_${arch})
+ set(stamps ${arg_NINJA_STAMP} ${arg_NINJA_DATA_STAMP})
+ add_ninja_target(
+ TARGET ${target}
+ NINJA_TARGET ${arg_NINJA_TARGET}
+ CMAKE_TARGET ${arg_CMAKE_TARGET}
+ NINJA_STAMP ${arg_NINJA_STAMP}
+ NINJA_DATA_STAMP ${arg_NINJA_DATA_STAMP}
+ CONFIG ${config}
+ ARCH ${arch}
+ BUILDDIR ${arg_BUILDDIR}
+ )
add_ninja_command(
- TARGET ${ninjaTarget}
- OUTPUT ${ninjaTarget}.stamp
- BUILDDIR ${buildDir}/${config}/${arch}
- MODULE ${module}
+ TARGET ${arg_NINJA_TARGET}
+ OUTPUT ${stamps}
+ BUILDDIR ${arg_BUILDDIR}/${config}/${arch}
+ MODULE ${arg_MODULE}
)
- add_dependencies(run_${module}_NinjaDone ${target})
- set_target_properties(${cmakeTarget} PROPERTIES
- LINK_DEPENDS ${buildDir}/${config}/${arch}/${ninjaTarget}.stamp
+ add_dependencies(run_${arg_MODULE}_NinjaDone ${target})
+ set_target_properties(${arg_CMAKE_TARGET} PROPERTIES
+ LINK_DEPENDS ${arg_BUILDDIR}/${config}/${arch}/${arg_NINJA_STAMP}
)
if(QT_IS_MACOS_UNIVERSAL)
- add_intermediate_archive(${target} ${buildDir}/${config}/${arch} ${completeStatic})
+ add_intermediate_archive(${target} ${arg_BUILDDIR}/${config}/${arch} ${arg_COMPLETE_STATIC})
elseif(IOS)
- add_intermediate_object(${target} ${buildDir}/${config}/${arch} ${completeStatic})
+ add_intermediate_object(${target} ${arg_BUILDDIR}/${config}/${arch} ${arg_COMPLETE_STATIC})
else()
if(MACOS AND QT_FEATURE_static)
# mac archiver does not support @file notation, do intermediate object istead
- add_intermediate_object(${target} ${buildDir}/${config}/${arch} ${completeStatic})
- add_archiver_options(${target} ${buildDir}/${config}/${arch} ${completeStatic})
+ add_intermediate_object(${target} ${arg_BUILDDIR}/${config}/${arch} ${arg_COMPLETE_STATIC})
+ add_archiver_options(${target} ${arg_BUILDDIR}/${config}/${arch} ${arg_COMPLETE_STATIC})
else()
- add_linker_options(${target} ${buildDir}/${config}/${arch} ${completeStatic})
+ add_linker_options(${target} ${arg_BUILDDIR}/${config}/${arch} ${arg_COMPLETE_STATIC})
endif()
endif()
unset(target)
endforeach()
list(GET archs 0 arch)
- set(target ${ninjaTarget}_${config}_${arch})
+ set(target ${arg_NINJA_TARGET}_${config}_${arch})
+ # Work around for broken builds with new Apple linker ld_prime. Force
+ # use of the classic linker until this has been fixed.
+ # TODO: remove once this has been fixed by Apple. See issue FB13667242
+ # or QTBUG-122655 for details.
+ if(APPLECLANG)
+ if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "15.0.0")
+ target_link_options(${arg_CMAKE_TARGET} PRIVATE -ld_classic)
+ set_target_properties(${arg_CMAKE_TARGET} PROPERTIES
+ QT_NO_DISABLE_WARN_DUPLICATE_LIBRARIES TRUE)
+ endif()
+ endif()
if(QT_IS_MACOS_UNIVERSAL)
- add_lipo_command(${target} ${buildDir}/${config})
+ add_lipo_command(${target} ${arg_BUILDDIR}/${config})
endif()
if(IOS)
- add_ios_lipo_command(${target} ${buildDir}/${config})
+ add_ios_lipo_command(${target} ${arg_BUILDDIR}/${config})
endif()
endforeach()
endfunction()
@@ -1127,9 +1243,10 @@ function(get_config_filenames c_config cxx_config static_config target_config)
endfunction()
function(add_gn_command)
- qt_parse_all_arguments(arg "add_gn_command"
- "" "CMAKE_TARGET;GN_TARGET;MODULE;BUILDDIR" "NINJA_TARGETS;GN_ARGS" "${ARGN}"
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "" "CMAKE_TARGET;GN_TARGET;MODULE;BUILDDIR" "NINJA_TARGETS;GN_ARGS"
)
+ _qt_internal_validate_all_args_are_parsed(arg)
get_config_filenames(cConfigFileName cxxConfigFileName staticConfigFileName targetConfigFileName)
set(gnArgArgFile ${arg_BUILDDIR}/args.gn)
@@ -1138,23 +1255,22 @@ function(add_gn_command)
file(WRITE ${gnArgArgFile} ${arg_GN_ARGS})
foreach(ninjaTarget ${arg_NINJA_TARGETS})
- list(APPEND output ${ninjaTarget}_objects.rsp ${ninjaTarget}_archives.rsp ${ninjaTarget}_libs.rsp)
+ list(APPEND output ${ninjaTarget}_objects.rsp ${ninjaTarget}_archives.rsp ${ninjaTarget}_libs.rsp ${ninjaTarget}_ldir.rsp)
endforeach()
list(TRANSFORM output PREPEND "${arg_BUILDDIR}/")
- if(QT_HOST_PATH)
- set(QT_HOST_GN_PATH ${QT_HOST_PATH}/${INSTALL_LIBEXECDIR})
- endif()
-
add_custom_command(
OUTPUT ${output}
COMMAND ${CMAKE_COMMAND}
-DBUILD_DIR=${arg_BUILDDIR}
-DSOURCE_DIR=${CMAKE_CURRENT_LIST_DIR}
-DMODULE=${arg_MODULE}
- -DQT_HOST_GN_PATH=${QT_HOST_GN_PATH}
+ -DQT_HOST_PATH=${QT_HOST_PATH}
+ -DINSTALL_LIBEXECDIR=${INSTALL_LIBEXECDIR}
+ -DINSTALL_BINDIR=${INSTALL_BINDIR}
-DPython3_EXECUTABLE=${Python3_EXECUTABLE}
-DGN_THREADS=$ENV{QTWEBENGINE_GN_THREADS}
+ -DQT_ALLOW_SYMLINK_IN_PATHS=${QT_ALLOW_SYMLINK_IN_PATHS}
-P ${WEBENGINE_ROOT_SOURCE_DIR}/cmake/Gn.cmake
WORKING_DIRECTORY ${WEBENGINE_ROOT_BUILD_DIR}
COMMENT "Run gn for target ${arg_CMAKE_TARGET} in ${arg_BUILDDIR}"
@@ -1172,6 +1288,9 @@ function(add_gn_command)
${arg_BUILDDIR}/${targetConfigFileName}
)
add_dependencies(run_${arg_MODULE}_GnDone runGn_${arg_GN_TARGET})
+ if(TARGET thirdparty_sync_headers)
+ add_dependencies(runGn_${arg_GN_TARGET} thirdparty_sync_headers)
+ endif()
create_gn_target_config(${arg_GN_TARGET} ${arg_BUILDDIR}/${targetConfigFileName})
endfunction()
@@ -1203,16 +1322,6 @@ function(addCopyCommand target src dst)
)
endfunction()
-function(addCopyDirCommand target src dst)
- add_custom_command(
- POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy_directory ${src} ${dst}
- TARGET ${target}
- DEPENDS ${src}
- USES_TERMINAL
- )
-endfunction()
-
function(check_for_ulimit)
message("-- Checking 'ulimit -n'")
execute_process(COMMAND bash -c "ulimit -n"
@@ -1265,3 +1374,34 @@ function(add_build feature value)
set(depTracker "${depTracker}" ${feature})
set_property(GLOBAL PROPERTY MATRIX_DEPENDENCY_TRACKER "${depTracker}")
endfunction()
+
+function(add_code_attributions_target)
+ cmake_parse_arguments(PARSE_ARGV 0 arg ""
+ "TARGET;OUTPUT;GN_TARGET;FILE_TEMPLATE;ENTRY_TEMPLATE;BUILDDIR"
+ "EXTRA_THIRD_PARTY_DIRS"
+ )
+ _qt_internal_validate_all_args_are_parsed(arg)
+ get_filename_component(fileTemplate ${arg_FILE_TEMPLATE} ABSOLUTE)
+ get_filename_component(entryTemplate ${arg_ENTRY_TEMPLATE} ABSOLUTE)
+ add_custom_command(
+ OUTPUT ${arg_OUTPUT}
+ COMMAND ${CMAKE_COMMAND}
+ -DLICENSE_SCRIPT=${WEBENGINE_ROOT_SOURCE_DIR}/src/3rdparty/chromium/tools/licenses/licenses.py
+ -DFILE_TEMPLATE=${fileTemplate}
+ -DENTRY_TEMPLATE=${entryTemplate}
+ -DGN_TARGET=${arg_GN_TARGET}
+ -DEXTRA_THIRD_PARTY_DIRS="${arg_EXTRA_THIRD_PARTY_DIRS}"
+ -DBUILDDIR=${arg_BUILDDIR}
+ -DOUTPUT=${arg_OUTPUT}
+ -DPython3_EXECUTABLE=${Python3_EXECUTABLE}
+ -P ${WEBENGINE_ROOT_SOURCE_DIR}/cmake/License.cmake
+ WORKING_DIRECTORY ${WEBENGINE_ROOT_BUILD_DIR}
+ DEPENDS
+ ${WEBENGINE_ROOT_SOURCE_DIR}/src/3rdparty/chromium/tools/licenses/licenses.py
+ ${arg_FILE_TEMPLATE}
+ ${arg_ENTRY_TEMPLATE}
+ ${WEBENGINE_ROOT_SOURCE_DIR}/cmake/License.cmake
+ USES_TERMINAL
+ )
+ add_custom_target(${arg_TARGET} DEPENDS ${arg_OUTPUT})
+endfunction()