8d728a0ed9
An approach of test batching (joining multiple tests into a single binary) has been taken, due to long linking times/binary size on certain platforms, including WASM. This change adds a new feature 'batch_test_support' in Qt testlib. Based on the value of the feature, test batching may become enabled with the -batch-tests switch. Batching works for every target added via qt_internal_add_test. When first such target is being processed, a new combined target for all of the future test sources is created under the name of 'test_batch'. CMake attempts to merge the parameters of each of the tests, and some basic checks are run for parameter differences that are impossible to reconcile. On the C++ level, convenience macros instantiating the tests are redefined when batch_tests is on. The new, changed behavior triggered by the changes in the macros registers the tests in a central test registry, where they are available for execution based solely on their test name. The test name is interoperable with the names CMake is aware of, so CTest is able to run the tests one by one in the combined binary. Task-number: QTBUG-105273 Change-Id: I2b6071d58be16979bd967eab2d405249f5a4e658 Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
164 lines
8.4 KiB
CMake
164 lines
8.4 KiB
CMake
# Propagate common variables via BuildInternals package.
|
|
set(QT_BUILD_SHARED_LIBS @BUILD_SHARED_LIBS@)
|
|
option(BUILD_SHARED_LIBS "Build Qt statically or dynamically" @BUILD_SHARED_LIBS@)
|
|
set(QT_CMAKE_EXPORT_NAMESPACE @QT_CMAKE_EXPORT_NAMESPACE@)
|
|
set(INSTALL_CMAKE_NAMESPACE @INSTALL_CMAKE_NAMESPACE@)
|
|
set(QT_BUILD_INTERNALS_PATH "${CMAKE_CURRENT_LIST_DIR}")
|
|
|
|
# The relocatable install prefix is meant to be used to find things like host binaries (syncqt),
|
|
# when the CMAKE_INSTALL_PREFIX is overridden to point to a different path (like when building a
|
|
# a Qt repo using Conan, which will set a random install prefix instead of installing into the
|
|
# original Qt install prefix).
|
|
get_filename_component(QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX
|
|
${CMAKE_CURRENT_LIST_DIR}/../@qt_path_from_cmake_config_dir_to_prefix@
|
|
ABSOLUTE)
|
|
|
|
# Stores in out_var the new install/staging prefix for this build.
|
|
#
|
|
# new_prefix: the new prefix for this repository
|
|
# orig_prefix: the prefix that was used when qtbase was configured
|
|
#
|
|
# On Windows hosts: if the original prefix does not start with a drive letter, this function removes
|
|
# the drive letter from the new prefix. This is needed for installation with DESTDIR set.
|
|
function(qt_internal_new_prefix out_var new_prefix orig_prefix)
|
|
if(CMAKE_HOST_WIN32)
|
|
set(drive_letter_regexp "^[a-zA-Z]:")
|
|
if(new_prefix MATCHES "${drive_letter_regexp}"
|
|
AND NOT orig_prefix MATCHES "${drive_letter_regexp}")
|
|
string(SUBSTRING "${new_prefix}" 2 -1 new_prefix)
|
|
endif()
|
|
endif()
|
|
set(${out_var} "${new_prefix}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# If no explicit CMAKE_INSTALL_PREFIX is provided, force set the original Qt installation prefix,
|
|
# so that further modules / repositories are installed into same original location.
|
|
# This means by default when configuring qtsvg / qtdeclarative, they will be installed the regular
|
|
# Qt installation prefix.
|
|
# If an explicit installation prefix is specified, honor it.
|
|
# This is an attempt to support Conan, aka handle installation of modules into a
|
|
# different installation prefix than the original one. Also allow to opt out via a special variable.
|
|
# In a top-level build, QtSetup.cmake takes care of setting CMAKE_INSTALL_PREFIX.
|
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND
|
|
NOT QT_BUILD_INTERNALS_NO_FORCE_SET_INSTALL_PREFIX
|
|
AND NOT QT_SUPERBUILD)
|
|
set(qtbi_orig_prefix "@CMAKE_INSTALL_PREFIX@")
|
|
set(qtbi_orig_staging_prefix "@CMAKE_STAGING_PREFIX@")
|
|
qt_internal_new_prefix(qtbi_new_prefix
|
|
"${QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX}"
|
|
"${qtbi_orig_prefix}")
|
|
if(NOT qtbi_orig_staging_prefix STREQUAL ""
|
|
AND "${CMAKE_STAGING_PREFIX}" STREQUAL ""
|
|
AND NOT QT_BUILD_INTERNALS_NO_FORCE_SET_STAGING_PREFIX)
|
|
qt_internal_new_prefix(qtbi_new_staging_prefix
|
|
"${qtbi_new_prefix}"
|
|
"${qtbi_orig_staging_prefix}")
|
|
set(CMAKE_STAGING_PREFIX "${qtbi_new_staging_prefix}" CACHE PATH
|
|
"Staging path prefix, prepended onto install directories on the host machine." FORCE)
|
|
set(qtbi_new_prefix "${qtbi_orig_prefix}")
|
|
endif()
|
|
set(CMAKE_INSTALL_PREFIX "${qtbi_new_prefix}" CACHE PATH
|
|
"Install path prefix, prepended onto install directories." FORCE)
|
|
unset(qtbi_orig_prefix)
|
|
unset(qtbi_new_prefix)
|
|
unset(qtbi_orig_staging_prefix)
|
|
unset(qtbi_new_staging_prefix)
|
|
endif()
|
|
|
|
# Propagate developer builds to other modules via BuildInternals package.
|
|
if(@FEATURE_developer_build@)
|
|
set(FEATURE_developer_build ON CACHE BOOL "Developer build." FORCE)
|
|
endif()
|
|
|
|
# Propagate non-prefix builds.
|
|
set(QT_WILL_INSTALL @QT_WILL_INSTALL@ CACHE BOOL
|
|
"Boolean indicating if doing a Qt prefix build (vs non-prefix build)." FORCE)
|
|
|
|
set(QT_SOURCE_TREE "@QT_SOURCE_TREE@" CACHE PATH
|
|
"A path to the source tree of the previously configured QtBase project." FORCE)
|
|
|
|
# Propagate decision of building tests and examples to other repositories.
|
|
set(QT_BUILD_TESTS @QT_BUILD_TESTS@ CACHE BOOL "Build the testing tree.")
|
|
set(QT_BUILD_EXAMPLES @QT_BUILD_EXAMPLES@ CACHE BOOL "Build Qt examples")
|
|
set(QT_BUILD_BENCHMARKS @QT_BUILD_BENCHMARKS@ CACHE BOOL "Build Qt Benchmarks")
|
|
set(QT_BUILD_MANUAL_TESTS @QT_BUILD_MANUAL_TESTS@ CACHE BOOL "Build Qt manual tests")
|
|
set(QT_BUILD_MINIMAL_STATIC_TESTS @QT_BUILD_MINIMAL_STATIC_TESTS@ CACHE BOOL
|
|
"Build minimal subset of tests for static Qt builds")
|
|
set(QT_BUILD_MINIMAL_ANDROID_MULTI_ABI_TESTS @QT_BUILD_MINIMAL_ANDROID_MULTI_ABI_TESTS@ CACHE BOOL
|
|
"Build minimal subset of tests for Android multi-ABI Qt builds")
|
|
|
|
set(QT_BUILD_TESTS_BATCHED @QT_BUILD_TESTS_BATCHED@ CACHE BOOL
|
|
"Should all tests be batched into a single binary.")
|
|
|
|
set(QT_BUILD_TESTS_BY_DEFAULT @QT_BUILD_TESTS_BY_DEFAULT@ CACHE BOOL
|
|
"Should tests be built as part of the default 'all' target.")
|
|
set(QT_BUILD_EXAMPLES_BY_DEFAULT @QT_BUILD_EXAMPLES_BY_DEFAULT@ CACHE BOOL
|
|
"Should examples be built as part of the default 'all' target.")
|
|
set(QT_BUILD_TOOLS_BY_DEFAULT @QT_BUILD_TOOLS_BY_DEFAULT@ CACHE BOOL
|
|
"Should tools be built as part of the default 'all' target.")
|
|
|
|
set(QT_BUILD_EXAMPLES_AS_EXTERNAL "@QT_BUILD_EXAMPLES_AS_EXTERNAL@" CACHE BOOL
|
|
"Should examples be built as ExternalProjects.")
|
|
|
|
# Propagate usage of ccache.
|
|
set(QT_USE_CCACHE @QT_USE_CCACHE@ CACHE BOOL "Enable the use of ccache")
|
|
|
|
# Propagate usage of versioned hard link.
|
|
set(QT_CREATE_VERSIONED_HARD_LINK "@QT_CREATE_VERSIONED_HARD_LINK@" CACHE BOOL
|
|
"Enable the use of versioned hard link")
|
|
|
|
# The minimum version required to build Qt.
|
|
set(QT_SUPPORTED_MIN_CMAKE_VERSION_FOR_BUILDING_QT "@supported_min_version_for_building_qt@")
|
|
set(QT_COMPUTED_MIN_CMAKE_VERSION_FOR_BUILDING_QT "@computed_min_version_for_building_qt@")
|
|
|
|
# The lower and upper CMake version policy range as computed by qtbase.
|
|
# These values are inherited when building other Qt repositories, unless overridden
|
|
# in the respective repository .cmake.conf file.
|
|
# These are not cache variables, so that they can be overridden in each repo directory scope.
|
|
if(NOT DEFINED QT_MIN_NEW_POLICY_CMAKE_VERSION)
|
|
set(QT_MIN_NEW_POLICY_CMAKE_VERSION "@min_new_policy_version@")
|
|
endif()
|
|
if(NOT DEFINED QT_MAX_NEW_POLICY_CMAKE_VERSION)
|
|
set(QT_MAX_NEW_POLICY_CMAKE_VERSION "@max_new_policy_version@")
|
|
endif()
|
|
|
|
get_property(__qt_internal_extras_is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
|
|
|
# We want the same build type to be used when configuring all Qt repos or standalone
|
|
# tests or single tests.
|
|
# To do that, we need to force-set the CMAKE_BUILD_TYPE cache var because CMake itself
|
|
# initializes it with the value of CMAKE_BUILD_TYPE_INIT at the start of project
|
|
# configuration, so we need to override it.
|
|
# Note the value of CMAKE_BUILD_TYPE_INIT is different based on the platform, most
|
|
# Linux and macOS platforms will have it empty, but Windows platforms will have a value.
|
|
#
|
|
# We can't reliably differentiate between a value set on the command line by the user
|
|
# and one set by CMake, so we use a few heuristics:
|
|
# 1) When using a qt.toolchain.cmake file, we rely on the toolchain file to tell us
|
|
# if a value was set by the user at initial configure time. On a 2nd run there will
|
|
# always be a value in the cache, but at that point we've already set it to whatever it needs
|
|
# to be.
|
|
# 2) If a toolchain file is not used, we rely on the value of the CMake internal
|
|
# CMAKE_BUILD_TYPE_INIT variable.
|
|
# This won't work reliably on Windows where CMAKE_BUILD_TYPE_INIT is non-empty.
|
|
#
|
|
# Both cases won't handle an empty "" config set by the user, but we claim that's an
|
|
# unsupported config when building Qt.
|
|
#
|
|
# Allow an opt out when QT_NO_FORCE_SET_CMAKE_BUILD_TYPE is set.
|
|
# Finally, don't set the variable if a multi-config generator is used. This can happen
|
|
# when qtbase is built with a single config, but a test is built with a multi-config generator.
|
|
function(qt_internal_force_set_cmake_build_type_conditionally value)
|
|
# STREQUAL check needs to be expanded variables because an undefined var is not equal to an
|
|
# empty defined var.
|
|
if("${CMAKE_BUILD_TYPE}" STREQUAL "${CMAKE_BUILD_TYPE_INIT}"
|
|
AND NOT __qt_toolchain_cmake_build_type_before_project_call
|
|
AND NOT QT_NO_FORCE_SET_CMAKE_BUILD_TYPE
|
|
AND NOT __qt_internal_extras_is_multi_config)
|
|
set(CMAKE_BUILD_TYPE "${value}" CACHE STRING "Choose the type of build." FORCE)
|
|
endif()
|
|
endfunction()
|
|
|
|
# Extra set of exported variables
|
|
@QT_EXTRA_BUILD_INTERNALS_VARS@
|