diff options
Diffstat (limited to 'cmake/Functions.cmake')
-rw-r--r-- | cmake/Functions.cmake | 400 |
1 files changed, 263 insertions, 137 deletions
diff --git a/cmake/Functions.cmake b/cmake/Functions.cmake index e2ccdd9f1..6cc8a401e 100644 --- a/cmake/Functions.cmake +++ b/cmake/Functions.cmake @@ -2,9 +2,11 @@ # 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) @@ -22,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}) @@ -61,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) @@ -181,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}) @@ -193,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}) @@ -214,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}) @@ -237,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() @@ -261,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) @@ -312,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) @@ -376,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() @@ -431,8 +414,9 @@ 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") @@ -445,21 +429,31 @@ function(add_linker_options target buildDir completeStatic) "$<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) - target_link_options(${cmakeTarget} PRIVATE /DELAYLOAD:mf.dll /DELAYLOAD:mfplat.dll /DELAYLOAD:mfreadwrite.dll) + 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) @@ -477,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") @@ -504,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 @@ -518,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}) @@ -532,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 @@ -580,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) @@ -618,46 +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} "riscv64" PARENT_SCOPE) + set(${result} "riscv32" PARENT_SCOPE) elseif(hostArch IN_LIST list32) set(${result} "${hostArch}" PARENT_SCOPE) else() - message(FATAL_ERROR "Unsupported architecture: ${hostArch}") + message(FATAL_ERROR "Unknown architecture: ${hostArch}") endif() else() # assume 64bit target which matches 64bit host @@ -687,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.") @@ -700,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() @@ -741,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) @@ -785,22 +798,24 @@ 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 @@ -808,13 +823,15 @@ macro(append_build_type_setup) forbid_non_component_debug_builds=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) @@ -831,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) @@ -875,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) @@ -886,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 ) @@ -914,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) @@ -925,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() @@ -966,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 @@ -980,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) @@ -1000,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}" @@ -1086,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 @@ -1094,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() @@ -1141,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) @@ -1152,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}" @@ -1186,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() @@ -1217,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" @@ -1279,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() |