Previously we had four-ish locations where the CMAKE_BUILD_TYPE was force set. Twice in QtBuildInternalsExtra.cmake via qt_internal_force_set_cmake_build_type_conditionally(), depending on some conditions. This was executed right at find_package(Qt6 COMPONENTS BuildInternals) time. And twice in qt_internal_set_default_build_type() via qt_build_repo_begin() / qt_prepare_standalone_project() that goes through QtSetup.cmake. This was executed only if the relevant functions were called, rather than directly at find_package() time. The exact logic of which build type ended up being set was very confusing. Refactor the code to decide the build type in one single location when qt_build_repo_begin() / qt_prepare_standalone_project() are called, rather than directly at find_package() time. The actual logic when we override the build type depends on many factors: - when an explicit CMAKE_BUILD_TYPE is given, honor it, unless it's a multi-config build - when it's a multi-config build, don't set any CMAKE_BUILD_TYPE, use the value of CMAKE_CONFIGURATION_TYPES - when it's a qtbase build, compute a default unless an explicit value was given - the default is Debug if FEATURE_developer_build is ON - otherwise the default is Release - when it's a top-level build, only choose a build type for qtbase - when it's another repo build, use the original build type unless another was given explicitly (including in a top-level build) - when it's a standalone tests build - if qt is multi-config, the tests will be single config, due to various CI failure reasons, this hasn't changed - if qt is single config, use the original unless an explicit value was given - when it's a single standalone test build, use the original unless an explicit value was given To determine when an explicit CMAKE_BUILD_TYPE was given in contrast to when it was default initialized, we now have one single function that uses a few heuristics. The heuristics are needed because we can't reliably determine an explicitly given 'Debug' build on Windows, because CMake default initializes to that. The heuristics include: - checking whether CMAKE_BUILD_TYPE_INIT is different from CMAKE_BUILD_TYPE - checking what the CMAKE_BUILD_TYPE was before the first project() call when CMake default initializes - we save the previous value in the qt.toolchain.cmake file - also in QtAutoDetect during qtbase configuration - also when building the sqldrivers project - honoring the value of QT_NO_FORCE_SET_CMAKE_BUILD_TYPE As a result of the above changes, the build type will be set exactly zero or one times, for a particular build directory. Note that the configure script also has some logic on which CMAKE_BUILD_TYPE / CMAKE_CONFIGURATION_TYPES to pass to CMake depending on whether -debug / -release / -debug-and-release / -force-debug-info were passed. But once the values are passed, CMake will honor them. Amends 48841c34d2e86a741ec9992b9704c0fa5973503c Amends 8c912cddebe544010e7da3f87af5b21f3328d7ec Task-number: QTBUG-114958 Task-number: QTBUG-120436 Change-Id: I30db14d1e8e9ff9bd2d7ea1d2256cdeb9493ca0d Reviewed-by: Alexey Edelev <alexey.edelev@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> (cherry picked from commit 49902cc6ce228c9365c54b0dbe777ae63720310c) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
137 lines
6.7 KiB
CMake
137 lines
6.7 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 vcpkg, ON by default.
|
|
set(QT_USE_VCPKG @QT_USE_VCPKG@ CACHE BOOL "Enable the use of vcpkg")
|
|
|
|
# Propagate usage of unity build.
|
|
set(QT_UNITY_BUILD @QT_UNITY_BUILD@ CACHE BOOL "Enable unity (jumbo) build")
|
|
set(QT_UNITY_BUILD_BATCH_SIZE "@QT_UNITY_BUILD_BATCH_SIZE@" CACHE STRING "Unity build batch size")
|
|
|
|
# Propragate the value of WARNINGS_ARE_ERRORS.
|
|
set(WARNINGS_ARE_ERRORS "@WARNINGS_ARE_ERRORS@" CACHE BOOL "Build Qt with warnings as errors")
|
|
|
|
# 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()
|
|
|
|
# Extra set of exported variables
|
|
@QT_EXTRA_BUILD_INTERNALS_VARS@
|