summaryrefslogtreecommitdiffstats
path: root/cmake
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2021-07-08 17:29:11 +0200
committerMichal Klocek <michal.klocek@qt.io>2021-07-20 23:50:19 +0200
commitb3031066d17ef01802a4c9752f87675d6a4a1df5 (patch)
treef2719b63b300020042fad5845b3534f3cf9bcc4a /cmake
parent8deed53fcd8937b46cabd19eaf14e6176ef5436b (diff)
Refactor cmake build
Add macros to share common cmake code blocks with QtPdf. Reconsider later to do proper scoping and change those to functions if make sense. Pick-to: 6.2 Change-Id: I500acdba1415feab373a012dcf9a9ddedf33cfac Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'cmake')
-rw-r--r--cmake/Functions.cmake276
1 files changed, 275 insertions, 1 deletions
diff --git a/cmake/Functions.cmake b/cmake/Functions.cmake
index c972b8f4e..7e9e42ed4 100644
--- a/cmake/Functions.cmake
+++ b/cmake/Functions.cmake
@@ -395,7 +395,7 @@ function(configure_gn_toolchain name cpuType v8CpuType toolchainIn toolchainOut)
configure_file(${toolchainIn} ${toolchainOut}/BUILD.gn @ONLY)
endfunction()
-function(create_pkg_config_host_wrapper wrapperName wrapperCmd)
+function(create_pkg_config_wrapper wrapperName wrapperCmd)
file(WRITE ${wrapperName}
"#!/bin/sh\n"
"unset PKG_CONFIG_LIBDIR\n"
@@ -460,3 +460,277 @@ function(check_thumb result)
endif()
set(${result} FALSE PARENT_SCOPE)
endfunction()
+
+macro(create_pkg_config_host_wrapper)
+ find_package(PkgConfigHost)
+ if(CMAKE_CROSSCOMPILING)
+ create_pkg_config_wrapper("${buildDir}/pkg-config-host_wrapper.sh" "${PKG_CONFIG_HOST_EXECUTABLE}")
+ set(PKG_CONFIG_HOST_EXECUTABLE "${buildDir}/pkg-config-host_wrapper.sh")
+ endif()
+endmacro()
+
+macro(setup_toolchains)
+ if(NOT CMAKE_CROSSCOMPILING) # delivered by hostBuild project
+ configure_gn_toolchain(host ${TEST_architecture_arch} ${TEST_architecture_arch}
+ ${WEBENGINE_ROOT_SOURCE_DIR}/src/host/BUILD.toolchain.gn.in
+ ${buildDir}/host_toolchain)
+ configure_gn_toolchain(v8 ${TEST_architecture_arch} ${TEST_architecture_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}
+ ${WEBENGINE_ROOT_SOURCE_DIR}/src/host/BUILD.toolchain.gn.in
+ ${buildDir}/target_toolchain)
+endmacro()
+
+macro(append_build_type_setup)
+ list(APPEND gnArgArg
+ use_qt=true
+ init_stack_vars=false
+ is_component_build=false
+ is_shared=true
+ use_sysroot=false
+ forbid_non_component_debug_builds=false
+ enable_debugallocation=false
+ remove_v8base_debug_symbols=true
+ treat_warnings_as_errors=false
+ use_allocator_shim=false
+ use_allocator="none"
+ use_custom_libcxx=false
+ )
+ 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)
+ endif()
+ elseif(${config} STREQUAL "Release")
+ list(APPEND gnArgArg is_debug=false symbol_level=0)
+ elseif(${config} STREQUAL "RelWithDebInfo")
+ list(APPEND gnArgArg is_debug=false)
+ if(WIN32 AND NOT CLANG)
+ list(APPEND gnArgArg symbol_level=2)
+ else()
+ list(APPEND gnArgArg symbol_level=1)
+ endif()
+ elseif(${config} STREQUAL "MinSizeRel")
+ list(APPEND gnArgArg is_debug=false symbol_level=0 optimize_for_size=true)
+ endif()
+ if(FEATURE_developer_build OR (${config} STREQUAL "Debug"))
+ list(APPEND gnArgArg
+ is_official_build=false
+ from_here_uses_location_builtins=false
+ )
+ else()
+ list(APPEND gnArgArg is_official_build=true)
+ if(NOT CLANG OR NOT QT_FEATURE_use_lld_linker)
+ list(APPEND gnArgArg
+ use_thin_lto=false
+ )
+ endif()
+ endif()
+ extend_gn_list(gnArgArg
+ ARGS is_unsafe_developer_build
+ CONDITION FEATURE_developer_build
+ )
+
+ # FIXME: Make it configurable
+ list(APPEND gnArgArg
+ use_jumbo_build=true
+ jumbo_file_merge_limit=8
+ jumbo_build_excluded=["browser"]
+ )
+
+ extend_gn_list(gnArgArg
+ ARGS enable_precompiled_headers
+ CONDITION BUILD_WITH_PCH
+ )
+endmacro()
+
+macro(append_compiler_linker_sdk_setup)
+ if (CMAKE_CXX_COMPILER_LAUNCHER)
+ list(APPEND gnArgArg cc_wrapper="${CMAKE_CXX_COMPILER_LAUNCHER}")
+ endif()
+ extend_gn_list(gnArgArg
+ ARGS is_clang
+ CONDITION CLANG
+ )
+ if(CLANG AND NOT MACOS)
+ # For some reason this doesn't work for our macOS CIs
+ get_filename_component(clangBasePath ${CMAKE_CXX_COMPILER} DIRECTORY)
+ get_filename_component(clangBasePath ${clangBasePath} DIRECTORY)
+ list(APPEND gnArgArg
+ clang_base_path="${clangBasePath}"
+ clang_use_chrome_plugins=false
+ )
+ endif()
+ if(MACOS)
+ get_darwin_sdk_version(macSdkVersion)
+ get_filename_component(clangBasePath ${CMAKE_OBJCXX_COMPILER} DIRECTORY)
+ get_filename_component(clangBasePath ${clangBasePath} DIRECTORY)
+ list(APPEND gnArgArg
+ use_system_xcode=true
+ clang_base_path="${clangBasePath}"
+ clang_use_chrome_plugins=false
+ mac_deployment_target="${CMAKE_OSX_DEPLOYMENT_TARGET}"
+ mac_sdk_min="${macSdkVersion}"
+ fatal_linker_warnings=false
+ )
+ endif()
+ if(WIN32)
+ get_filename_component(windowsSdkPath $ENV{WINDOWSSDKDIR} DIRECTORY)
+ get_filename_component(visualStudioPath $ENV{VSINSTALLDIR} DIRECTORY)
+ list(APPEND gnArgArg
+ win_linker_timing=true
+ use_incremental_linking=false
+ visual_studio_version=2019
+ visual_studio_path=\"${visualStudioPath}\"
+ windows_sdk_path=\"${windowsSdkPath}\"
+ )
+ endif()
+ if(LINUX AND CMAKE_CROSSCOMPILING AND cpu STREQUAL "arm")
+ extend_gn_list_cflag(gnArgArg
+ ARG arm_tune
+ CFLAG mtune
+ )
+ extend_gn_list_cflag(gnArgArg
+ ARG arm_float_abi
+ CFLAG mfloat-abi
+ )
+ extend_gn_list_cflag(gnArgArg
+ ARG arm_arch
+ CFLAG march
+ )
+ extract_cflag(cflag "mfpu")
+ get_arm_version(arm_version "${cflag}")
+ extend_gn_list(gnArgArg
+ ARGS arm_use_neon
+ CONDITION (arm_version GREATER_EQUAL 8) OR ("${cflag}" MATCHES ".*neon.*")
+ )
+ if(arm_version EQUAL 7 AND NOT "${cflag}" MATCHES ".*neon.*")
+ # If the toolchain does not explicitly specify to use NEON instructions
+ # we use arm_neon_optional for ARMv7
+ list(APPEND gnArgArg arm_optionally_use_neon=true)
+ endif()
+ check_thumb(armThumb)
+ extend_gn_list(gnArgArg
+ ARGS arm_use_thumb
+ CONDITION armThumb
+ )
+ endif()
+ extend_gn_list(gnArgArg
+ ARGS use_gold
+ CONDITION QT_FEATURE_use_gold_linker
+ )
+ extend_gn_list(gnArgArg
+ ARGS use_lld
+ CONDITION QT_FEATURE_use_lld_linker
+ )
+endmacro()
+
+macro(append_sanitizer_setup)
+ if(QT_FEATURE_sanitizer)
+ extend_gn_list(gnArgArg
+ ARGS is_asan
+ CONDITION address IN_LIST ECM_ENABLE_SANITIZERS
+ )
+ extend_gn_list(gnArgArg
+ ARGS is_tsan
+ CONDITION thread IN_LIST ECM_ENABLE_SANITIZERS
+ )
+ extend_gn_list(gnArgArg
+ ARGS is_msan
+ CONDITION memory IN_LIST ECM_ENABLE_SANITIZERS
+ )
+ extend_gn_list(gnArgArg
+ ARGS is_ubsan is_ubsan_vptr
+ CONDITION undefined IN_LIST ECM_ENABLE_SANITIZERS
+ )
+ endif()
+endmacro()
+
+macro(append_toolchain_setup)
+ if(LINUX)
+ 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}")
+ else()
+ list(APPEND gnArgArg host_cpu="${cpu}")
+ endif()
+ if(CMAKE_SYSROOT)
+ list(APPEND gnArgArg target_sysroot="${CMAKE_SYSROOT}")
+ endif()
+ endif()
+ if(WIN32)
+ list(APPEND gnArgArg target_cpu="x64")
+ endif()
+ if(MAC AND (CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64" OR
+ CMAKE_OSX_ARCHITECTURES STREQUAL "arm64"))
+ list(APPEND gnArgArg
+ target_cpu="arm64"
+ )
+ endif()
+endmacro()
+
+
+macro(append_pkg_config_setup)
+ if(LINUX)
+ list(APPEND gnArgArg
+ pkg_config="${PKG_CONFIG_EXECUTABLE}"
+ host_pkg_config="${PKG_CONFIG_HOST_EXECUTABLE}"
+ )
+ endif()
+endmacro()
+
+macro(execute_gn)
+ get_target_property(gnCmd Gn::gn IMPORTED_LOCATION)
+ set(gnArg gen ${buildDir}/${config})
+
+ list(APPEND gnArg
+ --script-executable=${Python2_EXECUTABLE}
+ --root=${WEBENGINE_ROOT_SOURCE_DIR}/src/3rdparty/chromium)
+ list(JOIN gnArgArg " " gnArgArg)
+
+ list(APPEND gnArg "--args=${gnArgArg}")
+
+ list(JOIN gnArg " " printArg)
+ message("-- Running ${config} Configuration for GN \n-- ${gnCmd} ${printArg}")
+ execute_process(
+ COMMAND ${gnCmd} ${gnArg}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ RESULT_VARIABLE gnResult
+ OUTPUT_VARIABLE gnOutput
+ ERROR_VARIABLE gnError
+ )
+
+ if(NOT gnResult EQUAL 0)
+ message(FATAL_ERROR "\n-- GN FAILED\n${gnOutput}\n${gnError}")
+ else()
+ string(REGEX REPLACE "\n$" "" gnOutput "${gnOutput}")
+ message("-- GN ${gnOutput}")
+ endif()
+endmacro()
+
+macro(execute_ninja ninjaTargets)
+ string(REPLACE " " ";" NINJAFLAGS "$ENV{NINJAFLAGS}")
+ string(REPLACE " " ";" NINJATARGETS "${ninjaTargets} ${ARGN}")
+ add_custom_command(
+ OUTPUT
+ ${buildDir}/${config}/${ninjaTargets}.stamp
+ ${sandboxOutput}
+ ${buildDir}/${config}/runAlways # use generator expression in CMAKE 3.20
+ WORKING_DIRECTORY ${buildDir}/${config}
+ COMMAND ${CMAKE_COMMAND} -E echo "Ninja ${config} build"
+ COMMAND Ninja::ninja
+ ${NINJAFLAGS}
+ -C ${buildDir}/${config}
+ ${NINJATARGETS}
+ USES_TERMINAL
+ VERBATIM
+ COMMAND_EXPAND_LISTS
+ )
+endmacro()