2022-07-05 11:26:52 +00:00
|
|
|
# Copyright (C) 2022 The Qt Company Ltd.
|
2022-08-19 13:21:34 +00:00
|
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
2022-07-05 11:26:52 +00:00
|
|
|
|
2019-02-19 15:38:11 +00:00
|
|
|
## Set a default build type if none was specified
|
2019-06-06 12:29:31 +00:00
|
|
|
|
2023-07-04 15:47:14 +00:00
|
|
|
# Set the QT_BUILDING_QT variable so we can verify whether we are building
|
|
|
|
# Qt from source.
|
|
|
|
# Make sure not to set it when building a standalone test, otherwise
|
|
|
|
# upon reconfiguration we get an error about qt_internal_add_test
|
|
|
|
# not being found due the if(NOT QT_BUILDING_QT) check we have
|
|
|
|
# in each standalone test.
|
|
|
|
if(NOT QT_INTERNAL_IS_STANDALONE_TEST)
|
|
|
|
set(QT_BUILDING_QT TRUE CACHE BOOL
|
2023-06-09 08:33:38 +00:00
|
|
|
"When this is present and set to true, it signals that we are building Qt from source.")
|
2023-07-04 15:47:14 +00:00
|
|
|
endif()
|
2019-06-06 12:29:31 +00:00
|
|
|
|
CMake: Rework INPUT_foo vars handling when reconfiguring
To be able to reconfigure Qt with modified feature values using the
configure script, and take into account INPUT_foo values, we need to
ignore FEATURE_foo values. But we can't always ignore FEATURE_foo
values, because users might want to toggle them by editing
CMakeCache.txt or using an IDE.
What we can do is tell CMake we are configuring via the configure
script, in which case we can mostly be sure that any passed
INPUT_foo values should have higher priority than pre-cached
FEATURE_foo values.
We also need to remove all the cached INPUT_foo variables after they
have been used for feature computation, so that subsequent
reconfigurations where an INPUT_foo is not passed anymore, doesn't
cause a feature to accidentally reuse the previous (stale) value.
Pass -DQT_INTERNAL_CALLED_FROM_CONFIGURE=TRUE to CMake when configuring
via the configure script, and use that as a marker to make INPUT_foo
values have a higher priority.
This needs to be done centrally in qt_evaluate_feature and also in a
few more locations where we check INPUT_ values, like the developer
build and pkgconfig features.
Because QT_INTERNAL_CALLED_FROM_CONFIGURE would become a cached
variable, we want to remove it at the end of the configuration phase,
so that future 'cmake .' reconfigurations are not considered to be done
via configure.
To do that, we unset it right at the end of
qt_build_repo_end in a per-repo build, and in the final
qt_print_build_instructions call in a top-level build.
The latter needs a cleaner fix in follow up commits in qt5.git and
qtbase.
Pick-to: 6.6
Task-number: QTBUG-112957
Change-Id: I3fd338092041ef09e3f5a4dfbaf61da5deea0514
Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
2023-08-25 15:32:19 +00:00
|
|
|
# Pre-calculate the developer_build feature if it's set by the user via the INPUT_developer_build
|
|
|
|
# variable when using the configure script. When not using configure, don't take the INPUT variable
|
|
|
|
# into account, so that users can toggle the feature directly in the cache or via IDE.
|
2023-08-25 16:20:01 +00:00
|
|
|
qt_internal_compute_feature_value_from_possible_input(developer_build)
|
2020-12-18 17:58:38 +00:00
|
|
|
|
2022-02-22 17:51:16 +00:00
|
|
|
# Pre-calculate the no_prefix feature if it's set by configure via INPUT_no_prefix.
|
|
|
|
# This needs to be done before qtbase/configure.cmake is processed.
|
2023-08-25 16:20:01 +00:00
|
|
|
qt_internal_compute_feature_value_from_possible_input(no_prefix)
|
2022-02-22 17:51:16 +00:00
|
|
|
|
2019-02-19 15:38:11 +00:00
|
|
|
set(_default_build_type "Release")
|
2020-12-18 17:58:38 +00:00
|
|
|
if(FEATURE_developer_build)
|
2019-02-19 15:38:11 +00:00
|
|
|
set(_default_build_type "Debug")
|
|
|
|
endif()
|
|
|
|
|
2022-06-09 16:52:56 +00:00
|
|
|
function(qt_internal_set_message_log_level out_var)
|
|
|
|
# Decide whether output should be verbose or not.
|
|
|
|
# Default to verbose (--log-level=STATUS) in a developer-build and
|
|
|
|
# non-verbose (--log-level=NOTICE) otherwise.
|
|
|
|
# If a custom CMAKE_MESSAGE_LOG_LEVEL was specified, it takes priority.
|
|
|
|
# Passing an explicit --log-level=Foo has the highest priority.
|
|
|
|
if(NOT CMAKE_MESSAGE_LOG_LEVEL)
|
|
|
|
if(FEATURE_developer_build OR QT_FEATURE_developer_build)
|
|
|
|
set(CMAKE_MESSAGE_LOG_LEVEL "STATUS")
|
|
|
|
else()
|
|
|
|
set(CMAKE_MESSAGE_LOG_LEVEL "NOTICE")
|
|
|
|
endif()
|
|
|
|
set(${out_var} "${CMAKE_MESSAGE_LOG_LEVEL}" PARENT_SCOPE)
|
2022-03-01 16:11:03 +00:00
|
|
|
endif()
|
2022-06-09 16:52:56 +00:00
|
|
|
endfunction()
|
|
|
|
qt_internal_set_message_log_level(CMAKE_MESSAGE_LOG_LEVEL)
|
2022-03-01 16:11:03 +00:00
|
|
|
|
2019-12-06 14:12:17 +00:00
|
|
|
# Reset content of extra build internal vars for each inclusion of QtSetup.
|
|
|
|
unset(QT_EXTRA_BUILD_INTERNALS_VARS)
|
|
|
|
|
2020-02-26 12:23:05 +00:00
|
|
|
# Save the global property in a variable to make it available to feature conditions.
|
|
|
|
get_property(QT_GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
|
|
|
|
CMake: Unify CMAKE_BUILD_TYPE behavior on all platforms
Before this change, we had the following behaviors.
On platforms other than Windows-MSVC:
- when no build type was specified, we defaulted to Release
- when -developer-build was specified, we defaulted to Debug
- regardless of platform, unless the option was explicitly specified,
we never defaulted to -debug-and-release.
On Windows-MSVC, we always defaulted to Debug. Which is inconsistent
with the rules above.
The difference happens because CMake always sets CMAKE_BUILD_TYPE to
Debug during the first project() call when targeting the Windows-MSVC
platform.
We interpreted that as the user setting the build type, and thus we
didn't want to override what the user specified.
After this change, if we detect that it's cmake setting the build
type, we assign a build type that follows the non-Windows-MSVC rules.
This change unifies the behavior across all platforms.
Adjusted the configure help with the new reality.
Augments 33af62db3747bb6fcb7490ef2d2abc5bb53925b6
[ChangeLog][configure] When no explicit build type is specified,
Windows will now default to building Release like the other
platforms.
Pick-to: 6.5 6.6
Change-Id: Id2bf269c51cf300ec09751ece2ad721869e0f90c
Reviewed-by: Amir Masoud Abdol <amir.abdol@qt.io>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2023-06-02 14:22:39 +00:00
|
|
|
# Try to detect if an explicit CMAKE_BUILD_TYPE was set by the user.
|
|
|
|
# CMake sets CMAKE_BUILD_TYPE_INIT to Debug on most Windows platforms and doesn't set
|
|
|
|
# anything for UNIXes. CMake assigns CMAKE_BUILD_TYPE_INIT to CMAKE_BUILD_TYPE during
|
|
|
|
# first project() if CMAKE_BUILD_TYPE has no previous value.
|
|
|
|
# We use extra information about the state of CMAKE_BUILD_TYPE before the first
|
|
|
|
# project() call that's set in QtAutodetect.
|
|
|
|
# STREQUAL check needs to have expanded variables because an undefined var is not equal
|
|
|
|
# to an empty defined var.
|
|
|
|
# See also qt_internal_force_set_cmake_build_type_conditionally which is used
|
|
|
|
# to set the build type when building other repos or tests.
|
|
|
|
if("${CMAKE_BUILD_TYPE}" STREQUAL "${CMAKE_BUILD_TYPE_INIT}"
|
|
|
|
AND NOT __qt_auto_detect_cmake_build_type_before_project_call
|
2023-07-26 12:37:09 +00:00
|
|
|
AND NOT __qt_build_internals_cmake_build_type
|
CMake: Unify CMAKE_BUILD_TYPE behavior on all platforms
Before this change, we had the following behaviors.
On platforms other than Windows-MSVC:
- when no build type was specified, we defaulted to Release
- when -developer-build was specified, we defaulted to Debug
- regardless of platform, unless the option was explicitly specified,
we never defaulted to -debug-and-release.
On Windows-MSVC, we always defaulted to Debug. Which is inconsistent
with the rules above.
The difference happens because CMake always sets CMAKE_BUILD_TYPE to
Debug during the first project() call when targeting the Windows-MSVC
platform.
We interpreted that as the user setting the build type, and thus we
didn't want to override what the user specified.
After this change, if we detect that it's cmake setting the build
type, we assign a build type that follows the non-Windows-MSVC rules.
This change unifies the behavior across all platforms.
Adjusted the configure help with the new reality.
Augments 33af62db3747bb6fcb7490ef2d2abc5bb53925b6
[ChangeLog][configure] When no explicit build type is specified,
Windows will now default to building Release like the other
platforms.
Pick-to: 6.5 6.6
Change-Id: Id2bf269c51cf300ec09751ece2ad721869e0f90c
Reviewed-by: Amir Masoud Abdol <amir.abdol@qt.io>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2023-06-02 14:22:39 +00:00
|
|
|
AND NOT CMAKE_CONFIGURATION_TYPES)
|
2019-02-19 15:38:11 +00:00
|
|
|
message(STATUS "Setting build type to '${_default_build_type}' as none was specified.")
|
|
|
|
set(CMAKE_BUILD_TYPE "${_default_build_type}" CACHE STRING "Choose the type of build." FORCE)
|
2019-12-06 14:12:17 +00:00
|
|
|
set_property(CACHE CMAKE_BUILD_TYPE
|
|
|
|
PROPERTY STRINGS
|
|
|
|
"Debug" "Release" "MinSizeRel" "RelWithDebInfo") # Set the possible values for cmake-gui.
|
|
|
|
elseif(CMAKE_CONFIGURATION_TYPES)
|
|
|
|
message(STATUS "Building for multiple configurations: ${CMAKE_CONFIGURATION_TYPES}.")
|
|
|
|
message(STATUS "Main configuration is: ${QT_MULTI_CONFIG_FIRST_CONFIG}.")
|
|
|
|
if(CMAKE_NINJA_MULTI_DEFAULT_BUILD_TYPE)
|
|
|
|
message(STATUS
|
|
|
|
"Default build configuration set to '${CMAKE_NINJA_MULTI_DEFAULT_BUILD_TYPE}'.")
|
|
|
|
endif()
|
2022-08-08 13:40:31 +00:00
|
|
|
if(CMAKE_GENERATOR STREQUAL "Ninja")
|
|
|
|
message(FATAL_ERROR
|
|
|
|
"It's not possible to build multiple configurations with the single config Ninja "
|
|
|
|
"generator. Consider configuring with -G\"Ninja Multi-Config\" instead of -GNinja."
|
|
|
|
)
|
|
|
|
endif()
|
2022-01-19 16:45:37 +00:00
|
|
|
else()
|
|
|
|
message(STATUS "CMAKE_BUILD_TYPE was set to: '${CMAKE_BUILD_TYPE}'")
|
2019-02-19 15:38:11 +00:00
|
|
|
endif()
|
|
|
|
|
2022-02-08 16:23:20 +00:00
|
|
|
# Append a config-specific postfix to library names to ensure distinct names
|
|
|
|
# in a multi-config build.
|
|
|
|
# e.g. lib/libQt6DBus_relwithdebinfo.6.3.0.dylib
|
|
|
|
# Don't apply the postfix to the first encountered release-like config, so we have at least one
|
|
|
|
# config without a postifx.
|
2023-07-28 11:11:02 +00:00
|
|
|
# If postfixes are set by user warn about potential issues.
|
|
|
|
function(qt_internal_setup_cmake_config_postfix)
|
|
|
|
# Collect configuration that require postfix in Qt library names.
|
|
|
|
if(QT_GENERATOR_IS_MULTI_CONFIG)
|
|
|
|
set(postfix_configurations ${CMAKE_CONFIGURATION_TYPES})
|
|
|
|
else()
|
|
|
|
set(postfix_configurations ${CMAKE_BUILD_TYPE})
|
|
|
|
|
|
|
|
# Set the default postfix to empty by default for single-config builds.
|
|
|
|
string(TOLOWER "${CMAKE_BUILD_TYPE}" build_type_lower)
|
|
|
|
set(default_cmake_${build_type_lower}_postfix "")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
# Override the generic debug postfixes above with custom debug postfixes (even in a single
|
|
|
|
# config build) to follow the conventions we had since Qt 5.
|
|
|
|
# e.g. lib/libQt6DBus_debug.6.3.0.dylib
|
|
|
|
if(WIN32)
|
|
|
|
if(MINGW)
|
|
|
|
# On MinGW we don't have "d" suffix for debug libraries like on Linux,
|
|
|
|
# unless we're building debug and release libraries in one go.
|
|
|
|
if(QT_GENERATOR_IS_MULTI_CONFIG)
|
|
|
|
set(default_cmake_debug_postfix "d")
|
|
|
|
endif()
|
|
|
|
else()
|
|
|
|
set(default_cmake_debug_postfix "d")
|
|
|
|
endif()
|
|
|
|
elseif(APPLE)
|
|
|
|
set(default_cmake_debug_postfix "_debug")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
set(custom_postfix_vars "")
|
|
|
|
set(release_configs Release RelWithDebInfo MinSizeRel)
|
|
|
|
set(found_first_release_config FALSE)
|
|
|
|
foreach(config_type IN LISTS postfix_configurations)
|
|
|
|
string(TOLOWER "${config_type}" config_type_lower)
|
|
|
|
string(TOUPPER "${config_type}" config_type_upper)
|
|
|
|
set(postfix_var CMAKE_${config_type_upper}_POSTFIX)
|
|
|
|
|
2022-02-08 16:23:20 +00:00
|
|
|
# Skip assigning postfix for the first release-like config.
|
2023-07-28 11:11:02 +00:00
|
|
|
if(NOT found_first_release_config
|
|
|
|
AND config_type IN_LIST release_configs)
|
|
|
|
set(found_first_release_config TRUE)
|
|
|
|
if(NOT "${${postfix_var}}" STREQUAL "")
|
|
|
|
list(APPEND custom_postfix_vars ${postfix_var})
|
|
|
|
endif()
|
2022-02-08 16:23:20 +00:00
|
|
|
continue()
|
|
|
|
endif()
|
|
|
|
|
2023-07-28 11:11:02 +00:00
|
|
|
# Check if the default postfix is set, use '_<config_type_lower>' otherwise.
|
|
|
|
set(default_postfix_var
|
|
|
|
default_cmake_${config_type_lower}_postfix)
|
|
|
|
if(NOT DEFINED ${default_postfix_var})
|
|
|
|
set(${default_postfix_var}
|
|
|
|
"_${config_type_lower}")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
# If postfix is set by user avoid changing it, but save postfix variable that has
|
|
|
|
# a non-default value for further warning.
|
|
|
|
if("${${postfix_var}}" STREQUAL "")
|
|
|
|
set(${postfix_var} "${${default_postfix_var}}" PARENT_SCOPE)
|
|
|
|
elseif(NOT "${${postfix_var}}" STREQUAL "${${default_postfix_var}}")
|
|
|
|
list(APPEND custom_postfix_vars ${postfix_var})
|
|
|
|
endif()
|
|
|
|
|
|
|
|
# Adjust framework postfixes accordingly
|
2022-02-08 16:23:20 +00:00
|
|
|
if(APPLE)
|
2023-07-28 11:11:02 +00:00
|
|
|
set(CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_${config_type_upper}
|
|
|
|
"${${postfix_var}}" PARENT_SCOPE)
|
2022-02-08 16:23:20 +00:00
|
|
|
endif()
|
|
|
|
endforeach()
|
2023-07-28 11:11:02 +00:00
|
|
|
if(custom_postfix_vars)
|
|
|
|
list(REMOVE_DUPLICATES custom_postfix_vars)
|
|
|
|
list(JOIN custom_postfix_vars ", " postfix_vars_string)
|
2022-02-08 16:23:20 +00:00
|
|
|
|
2023-07-28 11:11:02 +00:00
|
|
|
message(WARNING "You are using custom library postfixes: '${postfix_vars_string}' which are"
|
|
|
|
" considered experimental and are not officially supported by Qt."
|
|
|
|
" Expect unforeseen issues and user projects built with qmake to be broken."
|
|
|
|
)
|
2020-06-11 09:45:22 +00:00
|
|
|
endif()
|
2023-07-28 11:11:02 +00:00
|
|
|
endfunction()
|
|
|
|
qt_internal_setup_cmake_config_postfix()
|
2019-03-26 18:37:01 +00:00
|
|
|
|
2018-10-24 13:20:27 +00:00
|
|
|
## Position independent code:
|
|
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
|
|
|
2023-02-22 09:47:00 +00:00
|
|
|
# Does the linker support position independent code?
|
|
|
|
include(CheckPIESupported)
|
|
|
|
check_pie_supported()
|
|
|
|
|
2018-10-24 13:20:27 +00:00
|
|
|
# Do not relink dependent libraries when no header has changed:
|
|
|
|
set(CMAKE_LINK_DEPENDS_NO_SHARED ON)
|
|
|
|
|
CMake: Make build system of installed Qt more relocatable
Aka handle CMAKE_INSTALL_PREFIX in a more relocatable way.
The following story inspired this change.
If a user wants to build a Qt repo into a different install prefix
than the usual Qt one, this will fail configuration because we
look for various things like syncqt, qdoc, etc relative to
CMAKE_INSTALL_PREFIX, which will now point to a different location
where none of the above tools are located.
The intent for such a use case is to support building Qt packages with
Conan, which sets a random install prefix when configuring a repo.
The idea is to derive the qt prefix dynamically from the
QtBuildInternals package location. Essentially it's a reverse relative
path from the QtBuildInternalsConfig.cmake file to the install prefix
that was specified when initially configuring qtbase.
Once the dynamic prefix is computed (so we know where the possibly
relocated Qt is), we can find tools like syncqt and qdoc.
This is an initial attempt to support a use case like that.
More design work will probably needed in case if tools / libs need to
be found in a location different than the Qt install prefix (so
support for multiple install prefixes / search paths).
An example of such a case would be when building qtdeclarative and
qtquickcontrols2 as Conan packages in one go. Most likely the
qmltyperegistrar tool will be located in the random install prefix
set by Conan, so building qtquickcontrols2 might fail due to not
finding the tool in the original Qt install prefix.
As to the implementation details, the change does the following:
- Dynamically computes and sets the
QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX variable when
find_package()'ing QtBuildInternals. It's an absolute path
pointing to where the relocated Qt is.
- When building qtbase this variable is not yet available (due
to QtBuildInternalsExtra not existing), in that case we set
the variable to the absolute path of CMAKE_INSTALL_PREFIX
(but only for the initial qtbase configuration).
- Remove QT_BUILD_INTERNALS_ORIGINAL_INSTALL_PREFIX which was used
for standalone tests purposes. It's not needed now that we compute
the location of the Qt prefix dynamically.
- The Unixy qt-cmake and qt-cmake-private shell scripts now
use a relative path to find the toolchain file we created.
- The toolchain file also dynamically computes the location of the Qt
packages, and adds them to CMAKE_PREFIX_PATH.
- A lot of existing CMAKE_INSTALL_PREFIX uses are replaced with
QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX. This includes finding
tool locations, mkspecs dir, path environment setup for tools, etc.
- Some places still use CMAKE_PREFIX_PATH in the following cases
- When determining paths while configuring qtbase (valid cases)
- When I wasn't sure what the behavior should be, so I left them
as-is (an example is documentation generation, do we want to
install it into the random Conan prefix, or into the main prefix?
Currently it installs in the random prefix).
Note that relocating a Qt installation does not work for non-prefix /
non-installed builds, due to hardcoded paths to include directories
and libraries in generated FooTargets.cmake files.
Task-number: QTBUG-83999
Change-Id: I87d6558729db93121b1715771034b03ce3295923
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2020-05-05 08:30:35 +00:00
|
|
|
# Detect non-prefix builds: either when the qtbase install prefix is set to the binary dir
|
CMake: An -extprefix -developer-build should install by default
Previously if
-extprefix /tmp/sysroot (CMAKE_STAGING_PREFIX)
-developer-build (FEATURE_developer_build)
were specified, but
-prefix (CMAKE_INSTALL_PREFIX)
was not,
the build system would set the CMAKE_INSTALL_PREFIX to the
qtbase build dir.
Then, if targeting desktop, this would be considered a non-prefix
build (ninja install would refuse to work), whereas in a cross-build
it would be considered an installable build.
In both cases though, the rpath of installed binaries would point to
the qtbase build dir (because CMAKE_INSTALL_PREFIX would be set to the
qtbase build dir).
This is quite confusing behavior, in more than one way.
Change the build system to consider that an explicit -extprefix should
cause Qt to always be installed, even if -developer-build is
specified.
This means the installed rpaths and on-device install prefix
(CMAKE_INSTALL_PREFIX) will now use the default computed install
prefix, e.g. /usr/local/Qt
It also means that to get a non-installable developer + custom staging
and install (on-device) prefix build, users will have to be explicit
and set all the options
-extprefix ~/qt/qtbase_build_dir
-prefix /usr
-developer-build
Pick-to: 6.2 6.3
Change-Id: Ib560452a4b4778860e0fd7666c76f8a6745773ee
Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
2022-04-13 13:07:46 +00:00
|
|
|
# or when a developer build is explicitly enabled and no install prefix (or staging prefix)
|
|
|
|
# is specified.
|
2019-07-22 15:30:24 +00:00
|
|
|
# This detection only happens when building qtbase, and later is propagated via the generated
|
|
|
|
# QtBuildInternalsExtra.cmake file.
|
2019-11-01 10:48:23 +00:00
|
|
|
if (PROJECT_NAME STREQUAL "QtBase" AND NOT QT_BUILD_STANDALONE_TESTS)
|
2021-07-06 10:41:11 +00:00
|
|
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
2022-02-22 17:51:16 +00:00
|
|
|
# Handle both FEATURE_ and QT_FEATURE_ cases when they are specified on the command line
|
|
|
|
# explicitly. It's possible for one to be set, but not the other, because
|
|
|
|
# qtbase/configure.cmake is not processed by this point.
|
CMake: An -extprefix -developer-build should install by default
Previously if
-extprefix /tmp/sysroot (CMAKE_STAGING_PREFIX)
-developer-build (FEATURE_developer_build)
were specified, but
-prefix (CMAKE_INSTALL_PREFIX)
was not,
the build system would set the CMAKE_INSTALL_PREFIX to the
qtbase build dir.
Then, if targeting desktop, this would be considered a non-prefix
build (ninja install would refuse to work), whereas in a cross-build
it would be considered an installable build.
In both cases though, the rpath of installed binaries would point to
the qtbase build dir (because CMAKE_INSTALL_PREFIX would be set to the
qtbase build dir).
This is quite confusing behavior, in more than one way.
Change the build system to consider that an explicit -extprefix should
cause Qt to always be installed, even if -developer-build is
specified.
This means the installed rpaths and on-device install prefix
(CMAKE_INSTALL_PREFIX) will now use the default computed install
prefix, e.g. /usr/local/Qt
It also means that to get a non-installable developer + custom staging
and install (on-device) prefix build, users will have to be explicit
and set all the options
-extprefix ~/qt/qtbase_build_dir
-prefix /usr
-developer-build
Pick-to: 6.2 6.3
Change-Id: Ib560452a4b4778860e0fd7666c76f8a6745773ee
Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
2022-04-13 13:07:46 +00:00
|
|
|
if((FEATURE_developer_build
|
|
|
|
OR QT_FEATURE_developer_build
|
|
|
|
OR FEATURE_no_prefix
|
|
|
|
OR QT_FEATURE_no_prefix
|
|
|
|
)
|
|
|
|
AND NOT CMAKE_STAGING_PREFIX)
|
2021-07-06 10:41:11 +00:00
|
|
|
# Handle non-prefix builds by setting the CMake install prefix to point to qtbase's
|
|
|
|
# build dir. While building another repo (like qtsvg) the CMAKE_PREFIX_PATH should be
|
|
|
|
# set on the command line to point to the qtbase build dir.
|
|
|
|
set(__qt_default_prefix "${QtBase_BINARY_DIR}")
|
|
|
|
else()
|
|
|
|
if(CMAKE_HOST_WIN32)
|
|
|
|
set(__qt_default_prefix "C:/Qt/")
|
|
|
|
else()
|
|
|
|
set(__qt_default_prefix "/usr/local/")
|
|
|
|
endif()
|
|
|
|
string(APPEND __qt_default_prefix
|
|
|
|
"Qt-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
|
|
|
|
endif()
|
|
|
|
set(CMAKE_INSTALL_PREFIX ${__qt_default_prefix} CACHE PATH
|
Implement developer / non-prefix builds
A non-prefix build is a build where you don't have to run
make install.
To do a non-prefix build, pass -DFEATURE_developer_build=ON when
invoking CMake on qtbase. Note that this of course also enables
developer build features (private tests, etc).
When doing a non-prefix build, the CMAKE_INSTALL_PREFIX cache variable
will point to the qtbase build directory.
Tests can be run without installing Qt (QPA plugins are picked up from
the build dir).
This patch stops installation of any files by forcing the
make "install" target be a no-op.
When invoking cmake on the qtsvg module (or any other module),
the CMAKE_INSTALL_PREFIX variable should be set to the qtbase build
directory.
The developer-build feature is propagated via the QtCore Config file,
so that when building other modules, you don't have to specify it
on the command line again.
As a result of the change, all libraries, plugins, tools, include dirs,
CMake Config files, CMake Targets files, Macro files, etc,
will be placed in the qtbase build directory, mimicking the file layout
of an installed Qt file layout.
Only examples and tests are kept in the separate module build
directories, which is equivalent to how qmake does it.
The following global variables contain paths for the
appropriate prefix or non prefix builds:
QT_BUILD_DIR, QT_INSTALL_DIR, QT_CONFIG_BUILD_DIR,
QT_CONFIG_INSTALL_DIR. These should be used by developers
when deciding where files should be placed.
All usages of install() are replaced by qt_install(), which has some
additional logic on how to handle associationg of CMake targets to
export names.
When installing files, some consideration should be taken if
qt_copy_or_install() needs to be used instead of qt_install(),
which takes care of copying files from the source dir to the build dir
when doing non-prefix builds.
Tested with qtbase and qtsvg, developer builds, non-developer builds
and static developer builds on Windows, Linux and macOS.
Task-number: QTBUG-75581
Change-Id: I0ed27fb6467662dd24fb23aee6b95dd2c9c4061f
Reviewed-by: Kevin Funk <kevin.funk@kdab.com>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
2019-05-08 12:45:41 +00:00
|
|
|
"Install path prefix, prepended onto install directories." FORCE)
|
2021-07-06 10:41:11 +00:00
|
|
|
unset(__qt_default_prefix)
|
2020-06-22 16:01:30 +00:00
|
|
|
endif()
|
2022-04-13 12:57:34 +00:00
|
|
|
if(CMAKE_STAGING_PREFIX)
|
2020-06-22 16:01:30 +00:00
|
|
|
set(__qt_prefix "${CMAKE_STAGING_PREFIX}")
|
|
|
|
else()
|
|
|
|
set(__qt_prefix "${CMAKE_INSTALL_PREFIX}")
|
|
|
|
endif()
|
|
|
|
if(__qt_prefix STREQUAL QtBase_BINARY_DIR)
|
|
|
|
set(__qt_will_install_value OFF)
|
Implement developer / non-prefix builds
A non-prefix build is a build where you don't have to run
make install.
To do a non-prefix build, pass -DFEATURE_developer_build=ON when
invoking CMake on qtbase. Note that this of course also enables
developer build features (private tests, etc).
When doing a non-prefix build, the CMAKE_INSTALL_PREFIX cache variable
will point to the qtbase build directory.
Tests can be run without installing Qt (QPA plugins are picked up from
the build dir).
This patch stops installation of any files by forcing the
make "install" target be a no-op.
When invoking cmake on the qtsvg module (or any other module),
the CMAKE_INSTALL_PREFIX variable should be set to the qtbase build
directory.
The developer-build feature is propagated via the QtCore Config file,
so that when building other modules, you don't have to specify it
on the command line again.
As a result of the change, all libraries, plugins, tools, include dirs,
CMake Config files, CMake Targets files, Macro files, etc,
will be placed in the qtbase build directory, mimicking the file layout
of an installed Qt file layout.
Only examples and tests are kept in the separate module build
directories, which is equivalent to how qmake does it.
The following global variables contain paths for the
appropriate prefix or non prefix builds:
QT_BUILD_DIR, QT_INSTALL_DIR, QT_CONFIG_BUILD_DIR,
QT_CONFIG_INSTALL_DIR. These should be used by developers
when deciding where files should be placed.
All usages of install() are replaced by qt_install(), which has some
additional logic on how to handle associationg of CMake targets to
export names.
When installing files, some consideration should be taken if
qt_copy_or_install() needs to be used instead of qt_install(),
which takes care of copying files from the source dir to the build dir
when doing non-prefix builds.
Tested with qtbase and qtsvg, developer builds, non-developer builds
and static developer builds on Windows, Linux and macOS.
Task-number: QTBUG-75581
Change-Id: I0ed27fb6467662dd24fb23aee6b95dd2c9c4061f
Reviewed-by: Kevin Funk <kevin.funk@kdab.com>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
2019-05-08 12:45:41 +00:00
|
|
|
else()
|
2019-07-22 15:30:24 +00:00
|
|
|
set(__qt_will_install_value ON)
|
Implement developer / non-prefix builds
A non-prefix build is a build where you don't have to run
make install.
To do a non-prefix build, pass -DFEATURE_developer_build=ON when
invoking CMake on qtbase. Note that this of course also enables
developer build features (private tests, etc).
When doing a non-prefix build, the CMAKE_INSTALL_PREFIX cache variable
will point to the qtbase build directory.
Tests can be run without installing Qt (QPA plugins are picked up from
the build dir).
This patch stops installation of any files by forcing the
make "install" target be a no-op.
When invoking cmake on the qtsvg module (or any other module),
the CMAKE_INSTALL_PREFIX variable should be set to the qtbase build
directory.
The developer-build feature is propagated via the QtCore Config file,
so that when building other modules, you don't have to specify it
on the command line again.
As a result of the change, all libraries, plugins, tools, include dirs,
CMake Config files, CMake Targets files, Macro files, etc,
will be placed in the qtbase build directory, mimicking the file layout
of an installed Qt file layout.
Only examples and tests are kept in the separate module build
directories, which is equivalent to how qmake does it.
The following global variables contain paths for the
appropriate prefix or non prefix builds:
QT_BUILD_DIR, QT_INSTALL_DIR, QT_CONFIG_BUILD_DIR,
QT_CONFIG_INSTALL_DIR. These should be used by developers
when deciding where files should be placed.
All usages of install() are replaced by qt_install(), which has some
additional logic on how to handle associationg of CMake targets to
export names.
When installing files, some consideration should be taken if
qt_copy_or_install() needs to be used instead of qt_install(),
which takes care of copying files from the source dir to the build dir
when doing non-prefix builds.
Tested with qtbase and qtsvg, developer builds, non-developer builds
and static developer builds on Windows, Linux and macOS.
Task-number: QTBUG-75581
Change-Id: I0ed27fb6467662dd24fb23aee6b95dd2c9c4061f
Reviewed-by: Kevin Funk <kevin.funk@kdab.com>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
2019-05-08 12:45:41 +00:00
|
|
|
endif()
|
2019-07-22 15:30:24 +00:00
|
|
|
set(QT_WILL_INSTALL ${__qt_will_install_value} CACHE BOOL
|
|
|
|
"Boolean indicating if doing a Qt prefix build (vs non-prefix build)." FORCE)
|
2020-06-22 16:01:30 +00:00
|
|
|
unset(__qt_prefix)
|
2019-07-22 15:30:24 +00:00
|
|
|
unset(__qt_will_install_value)
|
Implement developer / non-prefix builds
A non-prefix build is a build where you don't have to run
make install.
To do a non-prefix build, pass -DFEATURE_developer_build=ON when
invoking CMake on qtbase. Note that this of course also enables
developer build features (private tests, etc).
When doing a non-prefix build, the CMAKE_INSTALL_PREFIX cache variable
will point to the qtbase build directory.
Tests can be run without installing Qt (QPA plugins are picked up from
the build dir).
This patch stops installation of any files by forcing the
make "install" target be a no-op.
When invoking cmake on the qtsvg module (or any other module),
the CMAKE_INSTALL_PREFIX variable should be set to the qtbase build
directory.
The developer-build feature is propagated via the QtCore Config file,
so that when building other modules, you don't have to specify it
on the command line again.
As a result of the change, all libraries, plugins, tools, include dirs,
CMake Config files, CMake Targets files, Macro files, etc,
will be placed in the qtbase build directory, mimicking the file layout
of an installed Qt file layout.
Only examples and tests are kept in the separate module build
directories, which is equivalent to how qmake does it.
The following global variables contain paths for the
appropriate prefix or non prefix builds:
QT_BUILD_DIR, QT_INSTALL_DIR, QT_CONFIG_BUILD_DIR,
QT_CONFIG_INSTALL_DIR. These should be used by developers
when deciding where files should be placed.
All usages of install() are replaced by qt_install(), which has some
additional logic on how to handle associationg of CMake targets to
export names.
When installing files, some consideration should be taken if
qt_copy_or_install() needs to be used instead of qt_install(),
which takes care of copying files from the source dir to the build dir
when doing non-prefix builds.
Tested with qtbase and qtsvg, developer builds, non-developer builds
and static developer builds on Windows, Linux and macOS.
Task-number: QTBUG-75581
Change-Id: I0ed27fb6467662dd24fb23aee6b95dd2c9c4061f
Reviewed-by: Kevin Funk <kevin.funk@kdab.com>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
2019-05-08 12:45:41 +00:00
|
|
|
endif()
|
|
|
|
|
Ugly fix for handling QT_SOURCE_TREE
QT_SOURCE_TREE is a variable that is set in qtbase/.qmake.conf.
In qtbase, it's used throughout various
projects to find cpp sources when building standalone tests (among
other things).
Everything works fine with qmake, because even if qmake is invoked
on the tests subfolder, qmake searches up the source directory tree
until it finds a .qmake.conf file, and uses that.
When building qttools with qmake, the qdoc project expects
to have a QT_SOURCE_TREE value, but it's not actually set in the
qttools/.qmake.conf file, so the generated include paths that use
that value are incorrect. Curiously the build still succeeds.
Now in CMake land we replaced QT_SOURCE_TREE with
CMAKE_SOURCE_DIR, but that does not work properly when doing a
standalone tests build, because the project in that case is the
tests one, and not the qtbase one, so configuration fails in a
developer build when trying to configure some private tests.
So far I've found that only qtbase actively uses this value.
A temporary fix is to save the qtbase source directory into a
QT_SOURCE_TREE variable inside the generated
BuildInternalsExtra.cmake file.
The pro2cmake script is changed to handle presence of QT_SOURCE_TREE
in a qrc file path. This is handled by finding the location of a
.qmake.conf file starting from the project file absolute path.
This is needed to stop the script from crashing when handling
the mimedatabase test projects for example.
The change also regenerates the relevant failing test projects, and
thus standalone tests (when doing developer builds aka private_tests
enabled) now configure and build successfully.
Change-Id: I15adc6f4ab6e3056c43ed850196204e2229c4d98
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
2019-07-26 16:59:53 +00:00
|
|
|
# Specify the QT_SOURCE_TREE only when building qtbase. Needed by some tests when the tests are
|
|
|
|
# built as part of the project, and not standalone. For standalone tests, the value is set in
|
|
|
|
# QtBuildInternalsExtra.cmake.
|
|
|
|
if(PROJECT_NAME STREQUAL "QtBase")
|
|
|
|
set(QT_SOURCE_TREE "${QtBase_SOURCE_DIR}" CACHE PATH
|
|
|
|
"A path to the source tree of the previously configured QtBase project." FORCE)
|
|
|
|
endif()
|
|
|
|
|
2023-02-21 11:57:02 +00:00
|
|
|
# QT_INTERNAL_CONFIGURE_FROM_IDE is set to TRUE for the following known IDE applications:
|
|
|
|
# - Qt Creator, detected by QTC_RUN environment variable
|
|
|
|
# - CLion, detected by CLION_IDE environment variable
|
|
|
|
# - Visual Studio Code, detected by VSCODE_CLI environment variable
|
|
|
|
if("$ENV{QTC_RUN}" OR "$ENV{CLION_IDE}" OR "$ENV{VSCODE_CLI}")
|
|
|
|
set(QT_INTERNAL_CONFIGURE_FROM_IDE TRUE CACHE INTERNAL "Configuring Qt Project from IDE")
|
|
|
|
else()
|
|
|
|
set(QT_INTERNAL_CONFIGURE_FROM_IDE FALSE CACHE INTERNAL "Configuring Qt Project from IDE")
|
|
|
|
endif()
|
|
|
|
|
Introduce QT_SYNC_HEADERS_AT_CONFIGURE_TIME flag
The syncqt tool was originally designed to run at build time, as a
part of dependency chain of Qt modules. This works well unless we need
the code model of the Qt project in IDE, since Qt source code actively
uses header aliases, and creating them at build time breaks the code
model until the initial build is done. So we made syncqt the configure
time tool to not break the developer experience.
It's more likely that developers build Qt using command line or don't
need the code model before the first build. So running the tool at
configure time should be optional.
QT_SYNC_HEADERS_AT_CONFIGURE_TIME switches the "mode" of the syncqt
tool from build time tool to the configure time tool. Without the
option enabled build procedure runs all the syncing targets at build
time only. The exception are the developer builds, if the
'-developer-build' option is enabled, QT_SYNC_HEADERS_AT_CONFIGURE_TIME
is set to TRUE by default. This gives better development experience for
the developers that don't use the code model in their IDE or don't
require it before the first build is finished. Also this build time
mode is preferred for the CI or similar build procedures where code
model is not required at all.
By default, the option initialized from the
QT_INTERNAL_CONFIGURE_FROM_IDE CMake variable.
TODO: The option is forced to TRUE for the static Ninja Multi-Config
builds. See QTBUG-113974 for details.
[ChangeLog][Build System] When building Qt from sources, syncqt and Qt
header files are now created at build time, not configure time. This
should speed up the configuration step. You can set the CMake variable
QT_CONFIGURE_TIME_SYNC_HEADERS to ON to use the previous behavior,
though. The old behavior is also preserved if cmake/configure is run
from inside an IDE - Qt Creator, Visual Studio Code, and CLion are
currently detected.
Task-number: QTBUG-111163
Task-number: QTBUG-109792
Pick-to: 6.6
Change-Id: Ib61bda9546e58492be874a8591c37e100313d02c
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2023-02-15 14:36:44 +00:00
|
|
|
set(_qt_sync_headers_at_configure_time_default ${QT_INTERNAL_CONFIGURE_FROM_IDE})
|
|
|
|
|
2019-06-25 10:09:10 +00:00
|
|
|
if(FEATURE_developer_build)
|
|
|
|
if(DEFINED QT_CMAKE_EXPORT_COMPILE_COMMANDS)
|
|
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ${QT_CMAKE_EXPORT_COMPILE_COMMANDS})
|
|
|
|
else()
|
|
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
endif()
|
2020-10-19 11:35:15 +00:00
|
|
|
set(_qt_build_tests_default ON)
|
2019-10-28 14:35:47 +00:00
|
|
|
set(__build_benchmarks ON)
|
|
|
|
|
2019-04-08 15:23:57 +00:00
|
|
|
# Tests are not built by default with qmake for iOS and friends, and thus the overall build
|
|
|
|
# tends to fail. Disable them by default when targeting uikit.
|
2020-03-16 12:36:47 +00:00
|
|
|
if(UIKIT OR ANDROID)
|
2020-10-19 11:35:15 +00:00
|
|
|
set(_qt_build_tests_default OFF)
|
2019-04-08 15:23:57 +00:00
|
|
|
endif()
|
|
|
|
|
2019-10-28 14:35:47 +00:00
|
|
|
# Disable benchmarks for single configuration generators which do not build
|
|
|
|
# with release configuration.
|
2021-01-28 09:43:17 +00:00
|
|
|
if (CMAKE_BUILD_TYPE AND CMAKE_BUILD_TYPE STREQUAL Debug)
|
2019-10-28 14:35:47 +00:00
|
|
|
set(__build_benchmarks OFF)
|
|
|
|
endif()
|
Introduce QT_SYNC_HEADERS_AT_CONFIGURE_TIME flag
The syncqt tool was originally designed to run at build time, as a
part of dependency chain of Qt modules. This works well unless we need
the code model of the Qt project in IDE, since Qt source code actively
uses header aliases, and creating them at build time breaks the code
model until the initial build is done. So we made syncqt the configure
time tool to not break the developer experience.
It's more likely that developers build Qt using command line or don't
need the code model before the first build. So running the tool at
configure time should be optional.
QT_SYNC_HEADERS_AT_CONFIGURE_TIME switches the "mode" of the syncqt
tool from build time tool to the configure time tool. Without the
option enabled build procedure runs all the syncing targets at build
time only. The exception are the developer builds, if the
'-developer-build' option is enabled, QT_SYNC_HEADERS_AT_CONFIGURE_TIME
is set to TRUE by default. This gives better development experience for
the developers that don't use the code model in their IDE or don't
require it before the first build is finished. Also this build time
mode is preferred for the CI or similar build procedures where code
model is not required at all.
By default, the option initialized from the
QT_INTERNAL_CONFIGURE_FROM_IDE CMake variable.
TODO: The option is forced to TRUE for the static Ninja Multi-Config
builds. See QTBUG-113974 for details.
[ChangeLog][Build System] When building Qt from sources, syncqt and Qt
header files are now created at build time, not configure time. This
should speed up the configuration step. You can set the CMake variable
QT_CONFIGURE_TIME_SYNC_HEADERS to ON to use the previous behavior,
though. The old behavior is also preserved if cmake/configure is run
from inside an IDE - Qt Creator, Visual Studio Code, and CLion are
currently detected.
Task-number: QTBUG-111163
Task-number: QTBUG-109792
Pick-to: 6.6
Change-Id: Ib61bda9546e58492be874a8591c37e100313d02c
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2023-02-15 14:36:44 +00:00
|
|
|
|
|
|
|
# Sync headers during the initial configuration of a -developer-build to facilitate code
|
|
|
|
# navigation for code editors that use an LSP-based code model.
|
|
|
|
set(_qt_sync_headers_at_configure_time_default TRUE)
|
2019-07-22 15:30:24 +00:00
|
|
|
else()
|
2020-10-19 11:35:15 +00:00
|
|
|
set(_qt_build_tests_default OFF)
|
2019-10-28 14:35:47 +00:00
|
|
|
set(__build_benchmarks OFF)
|
2019-06-25 10:09:10 +00:00
|
|
|
endif()
|
|
|
|
|
Introduce QT_SYNC_HEADERS_AT_CONFIGURE_TIME flag
The syncqt tool was originally designed to run at build time, as a
part of dependency chain of Qt modules. This works well unless we need
the code model of the Qt project in IDE, since Qt source code actively
uses header aliases, and creating them at build time breaks the code
model until the initial build is done. So we made syncqt the configure
time tool to not break the developer experience.
It's more likely that developers build Qt using command line or don't
need the code model before the first build. So running the tool at
configure time should be optional.
QT_SYNC_HEADERS_AT_CONFIGURE_TIME switches the "mode" of the syncqt
tool from build time tool to the configure time tool. Without the
option enabled build procedure runs all the syncing targets at build
time only. The exception are the developer builds, if the
'-developer-build' option is enabled, QT_SYNC_HEADERS_AT_CONFIGURE_TIME
is set to TRUE by default. This gives better development experience for
the developers that don't use the code model in their IDE or don't
require it before the first build is finished. Also this build time
mode is preferred for the CI or similar build procedures where code
model is not required at all.
By default, the option initialized from the
QT_INTERNAL_CONFIGURE_FROM_IDE CMake variable.
TODO: The option is forced to TRUE for the static Ninja Multi-Config
builds. See QTBUG-113974 for details.
[ChangeLog][Build System] When building Qt from sources, syncqt and Qt
header files are now created at build time, not configure time. This
should speed up the configuration step. You can set the CMake variable
QT_CONFIGURE_TIME_SYNC_HEADERS to ON to use the previous behavior,
though. The old behavior is also preserved if cmake/configure is run
from inside an IDE - Qt Creator, Visual Studio Code, and CLion are
currently detected.
Task-number: QTBUG-111163
Task-number: QTBUG-109792
Pick-to: 6.6
Change-Id: Ib61bda9546e58492be874a8591c37e100313d02c
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2023-02-15 14:36:44 +00:00
|
|
|
# Sync Qt header files at configure time
|
|
|
|
option(QT_SYNC_HEADERS_AT_CONFIGURE_TIME "Run syncqt at configure time already"
|
|
|
|
${_qt_sync_headers_at_configure_time_default})
|
|
|
|
unset(_qt_sync_headers_at_configure_time_default)
|
|
|
|
|
|
|
|
# In static Ninja Multi-Config builds the sync_headers dependencies(and other autogen dependencies
|
|
|
|
# are not added to '_autogen/timestamp' targets. See QTBUG-113974.
|
|
|
|
if(CMAKE_GENERATOR STREQUAL "Ninja Multi-Config" AND NOT QT_BUILD_SHARED_LIBS)
|
|
|
|
set(QT_SYNC_HEADERS_AT_CONFIGURE_TIME TRUE CACHE BOOL "" FORCE)
|
|
|
|
endif()
|
|
|
|
|
2020-12-03 18:13:08 +00:00
|
|
|
# Build Benchmarks
|
|
|
|
option(QT_BUILD_BENCHMARKS "Build Qt Benchmarks" ${__build_benchmarks})
|
|
|
|
if(QT_BUILD_BENCHMARKS)
|
|
|
|
set(_qt_build_tests_default ON)
|
|
|
|
endif()
|
|
|
|
|
2019-06-05 12:49:09 +00:00
|
|
|
## Set up testing
|
2020-10-19 11:35:15 +00:00
|
|
|
option(QT_BUILD_TESTS "Build the testing tree." ${_qt_build_tests_default})
|
|
|
|
unset(_qt_build_tests_default)
|
|
|
|
option(QT_BUILD_TESTS_BY_DEFAULT "Should tests be built as part of the default 'all' target." ON)
|
2019-11-01 10:48:23 +00:00
|
|
|
if(QT_BUILD_STANDALONE_TESTS)
|
|
|
|
# BuildInternals might have set it to OFF on initial configuration. So force it to ON when
|
|
|
|
# building standalone tests.
|
2020-10-19 11:35:15 +00:00
|
|
|
set(QT_BUILD_TESTS ON CACHE BOOL "Build the testing tree." FORCE)
|
2019-11-13 09:20:09 +00:00
|
|
|
|
|
|
|
# Also force the tests to be built as part of the default build target.
|
2020-10-19 11:35:15 +00:00
|
|
|
set(QT_BUILD_TESTS_BY_DEFAULT ON CACHE BOOL
|
|
|
|
"Should tests be built as part of the default 'all' target." FORCE)
|
2019-11-01 10:48:23 +00:00
|
|
|
endif()
|
2023-02-20 08:58:55 +00:00
|
|
|
set(BUILD_TESTING ${QT_BUILD_TESTS} CACHE INTERNAL "")
|
2019-11-01 10:48:23 +00:00
|
|
|
|
2022-10-18 13:16:49 +00:00
|
|
|
if (WASM)
|
2022-07-12 16:15:24 +00:00
|
|
|
set(_qt_batch_tests ON)
|
2022-10-18 13:16:49 +00:00
|
|
|
else()
|
|
|
|
set(_qt_batch_tests OFF)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(DEFINED INPUT_batch_tests)
|
|
|
|
if (${INPUT_batch_tests})
|
|
|
|
set(_qt_batch_tests ON)
|
|
|
|
else()
|
|
|
|
set(_qt_batch_tests OFF)
|
|
|
|
endif()
|
2022-07-12 16:15:24 +00:00
|
|
|
endif()
|
2022-10-18 13:16:49 +00:00
|
|
|
|
2022-07-12 16:15:24 +00:00
|
|
|
option(QT_BUILD_TESTS_BATCHED "Link all tests into a single binary." ${_qt_batch_tests})
|
|
|
|
|
2023-01-13 15:25:08 +00:00
|
|
|
if(QT_BUILD_TESTS AND QT_BUILD_TESTS_BATCHED AND CMAKE_VERSION VERSION_LESS "3.19")
|
2022-07-12 16:15:24 +00:00
|
|
|
message(FATAL_ERROR
|
2023-01-13 15:25:08 +00:00
|
|
|
"Test batching requires at least CMake 3.19, due to requiring per-source "
|
|
|
|
"TARGET_DIRECTORY assignments and DEFER calls.")
|
2022-07-12 16:15:24 +00:00
|
|
|
endif()
|
|
|
|
|
2022-05-11 13:17:40 +00:00
|
|
|
# QT_BUILD_TOOLS_WHEN_CROSSCOMPILING -> QT_FORCE_BUILD_TOOLS
|
|
|
|
# pre-6.4 compatibility flag (remove sometime in the future)
|
|
|
|
if(CMAKE_CROSSCOMPILING AND QT_BUILD_TOOLS_WHEN_CROSSCOMPILING)
|
|
|
|
message(WARNING "QT_BUILD_TOOLS_WHEN_CROSSCOMPILING is deprecated. "
|
|
|
|
"Please use QT_FORCE_BUILD_TOOLS instead.")
|
|
|
|
set(QT_FORCE_BUILD_TOOLS TRUE CACHE INTERNAL "" FORCE)
|
|
|
|
endif()
|
|
|
|
|
2020-03-26 16:42:48 +00:00
|
|
|
# When cross-building, we don't build tools by default. Sometimes this also covers Qt apps as well.
|
|
|
|
# Like in qttools/assistant/assistant.pro, load(qt_app), which is guarded by a qtNomakeTools() call.
|
|
|
|
|
2020-10-19 11:35:15 +00:00
|
|
|
set(_qt_build_tools_by_default_default ON)
|
2022-01-10 18:12:32 +00:00
|
|
|
if(CMAKE_CROSSCOMPILING AND NOT QT_FORCE_BUILD_TOOLS)
|
2020-10-19 11:35:15 +00:00
|
|
|
set(_qt_build_tools_by_default_default OFF)
|
2020-04-27 13:04:57 +00:00
|
|
|
endif()
|
2020-10-19 11:35:15 +00:00
|
|
|
option(QT_BUILD_TOOLS_BY_DEFAULT "Should tools be built as part of the default 'all' target."
|
|
|
|
"${_qt_build_tools_by_default_default}")
|
|
|
|
unset(_qt_build_tools_by_default_default)
|
2020-03-26 16:42:48 +00:00
|
|
|
|
2018-10-24 13:20:27 +00:00
|
|
|
include(CTest)
|
|
|
|
enable_testing()
|
|
|
|
|
2020-10-19 11:35:15 +00:00
|
|
|
option(QT_BUILD_EXAMPLES "Build Qt examples" OFF)
|
|
|
|
option(QT_BUILD_EXAMPLES_BY_DEFAULT "Should examples be built as part of the default 'all' target." ON)
|
CMake: Allow installation of example sources into the Qt prefix
In Qt 5 times, if Qt was configured with -make examples, running
make install would not only build and install the example binaries,
but would also install the example sources into the prefix.
Installation of example sources was not implemented when the Qt 6
build system has switched to using CMake.
There is still a use case for it though, mainly for Qt Creator, which
only shows the examples of a Qt kit if the sources are available.
In contrast to Qt 5, in Qt 6 we will not install example sources
by default. It will be opt in.
To enable installation of examples sources, configure with
configure -make examples -install-examples-sources
or
cmake -DQT_BUILD_EXAMPLES=ON -DQT_INSTALL_EXAMPLES_SOURCES=ON
The -make examples part is required, otherwise
-install-examples-sources has no effect.
All example sources can be installed by calling
cmake --install . --component examples_sources
in the qt repo build directory.
In a top-level build, per-repo installation can be done using
cmake --install . --component examples_sources_<repo_name>
where repo_name could be 'qtbase'.
A single example's source can be installed by calling
cmake --install . --component examples_sources_<subdir_name>
where subdir_name is the subdirectory name of the example, e.g.
'gallery'.
Implement installation of example sources by hooking into the
qt_internal_add_example command.
This means that all examples in all repos need to be added via
qt_internal_add_example instead of add_subdirectory, to ensure the
sources are installed. The majority of repos already use it.
For testing purposes one can configure with
-DQT_BUILD_EXAMPLES=ON -DQT_INSTALL_EXAMPLES_SOURCES=ON
-DQT_INTERNAL_NO_CONFIGURE_EXAMPLES=ON to allow testing installation
of examples sources without building them.
Take into account an additional variable called
QT_INTERNAL_EXAMPLES_SOURCES_INSTALL_PREFIX to allow installation of
example sources into a location different from the example binaries.
As a cleanup, the NAME option that could previously be passed to
qt_internal_add_example_external_project has been removed.
That's because it's never used anywhere and could not have worked
anyway because qt_internal_add_example_in_tree never handled it.
Pick-to: 6.6
Fixes: QTBUG-112135
Change-Id: I52aa5ec643ff7e212276c88d8dd2dfecdbdbeb0d
Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
2023-08-07 10:15:35 +00:00
|
|
|
option(QT_INSTALL_EXAMPLES_SOURCES "Install example sources" OFF)
|
|
|
|
option(QT_INSTALL_EXAMPLES_SOURCES_BY_DEFAULT
|
|
|
|
"Install example sources as part of the default 'install' target" ON)
|
2019-09-06 09:52:47 +00:00
|
|
|
|
2022-02-03 11:06:20 +00:00
|
|
|
# FIXME: Support prefix builds as well QTBUG-96232
|
|
|
|
if(QT_WILL_INSTALL)
|
|
|
|
set(_qt_build_examples_as_external OFF)
|
|
|
|
else()
|
|
|
|
set(_qt_build_examples_as_external ON)
|
|
|
|
endif()
|
|
|
|
option(QT_BUILD_EXAMPLES_AS_EXTERNAL "Should examples be built as ExternalProjects."
|
|
|
|
${_qt_build_examples_as_external})
|
|
|
|
unset(_qt_build_examples_as_external)
|
2021-09-03 15:08:50 +00:00
|
|
|
|
2020-11-16 17:31:56 +00:00
|
|
|
option(QT_BUILD_MANUAL_TESTS "Build Qt manual tests" OFF)
|
2022-09-27 12:51:09 +00:00
|
|
|
|
|
|
|
if(WASM)
|
|
|
|
option(QT_BUILD_MINIMAL_STATIC_TESTS "Build minimal subset of tests for static Qt builds" ON)
|
|
|
|
else()
|
|
|
|
option(QT_BUILD_MINIMAL_STATIC_TESTS "Build minimal subset of tests for static Qt builds" OFF)
|
|
|
|
endif()
|
|
|
|
|
2022-06-21 13:32:00 +00:00
|
|
|
option(QT_BUILD_MINIMAL_ANDROID_MULTI_ABI_TESTS
|
|
|
|
"Build minimal subset of tests for Android multi-ABI Qt builds" OFF)
|
2020-11-16 17:31:56 +00:00
|
|
|
|
2022-07-15 16:14:20 +00:00
|
|
|
## Path used to find host tools, either when cross-compiling or just when using the tools from
|
|
|
|
## a different host build.
|
2022-02-24 10:44:11 +00:00
|
|
|
set(QT_HOST_PATH "$ENV{QT_HOST_PATH}" CACHE PATH
|
|
|
|
"Installed Qt host directory path, used for cross compiling.")
|
2020-06-18 08:07:22 +00:00
|
|
|
|
2019-06-06 08:31:55 +00:00
|
|
|
## Android platform settings
|
|
|
|
if(ANDROID)
|
|
|
|
include(QtPlatformAndroid)
|
|
|
|
endif()
|
|
|
|
|
2019-11-13 13:03:20 +00:00
|
|
|
## qt_add_module and co.:
|
2018-10-24 13:20:27 +00:00
|
|
|
include(QtBuild)
|
|
|
|
|
|
|
|
## Qt Feature support:
|
2020-03-02 17:06:46 +00:00
|
|
|
include(QtBuildInformation)
|
2018-10-24 13:20:27 +00:00
|
|
|
include(QtFeature)
|
|
|
|
|
|
|
|
## Compiler optimization flags:
|
|
|
|
include(QtCompilerOptimization)
|
|
|
|
|
2019-02-19 16:37:30 +00:00
|
|
|
## Compiler flags:
|
|
|
|
include(QtCompilerFlags)
|
|
|
|
|
2019-10-17 08:14:09 +00:00
|
|
|
qt_set_language_standards()
|
|
|
|
|
2019-02-12 11:21:30 +00:00
|
|
|
option(QT_USE_CCACHE "Enable the use of ccache")
|
|
|
|
if(QT_USE_CCACHE)
|
|
|
|
find_program(CCACHE_PROGRAM ccache)
|
2020-08-17 14:31:38 +00:00
|
|
|
if(CCACHE_PROGRAM)
|
|
|
|
set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
|
|
|
|
set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
|
|
|
|
set(CMAKE_OBJC_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
|
|
|
|
set(CMAKE_OBJCXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
|
|
|
|
else()
|
2021-08-27 09:43:04 +00:00
|
|
|
message(FATAL_ERROR "Ccache use was requested, but the program was not found.")
|
2020-08-17 14:31:38 +00:00
|
|
|
endif()
|
2019-02-12 11:21:30 +00:00
|
|
|
endif()
|
2020-12-11 15:11:35 +00:00
|
|
|
|
2023-02-08 11:08:37 +00:00
|
|
|
option(QT_UNITY_BUILD "Enable unity (jumbo) build")
|
2023-02-20 13:15:23 +00:00
|
|
|
set(QT_UNITY_BUILD_BATCH_SIZE "32" CACHE STRING "Unity build batch size")
|
2023-02-08 11:08:37 +00:00
|
|
|
if(QT_UNITY_BUILD)
|
|
|
|
set(CMAKE_UNITY_BUILD ON)
|
|
|
|
set(CMAKE_UNITY_BUILD_BATCH_SIZE "${QT_UNITY_BUILD_BATCH_SIZE}")
|
|
|
|
endif()
|
|
|
|
|
2023-05-02 12:07:41 +00:00
|
|
|
option(QT_ALLOW_SYMLINK_IN_PATHS "Allows symlinks in paths." OFF)
|
|
|
|
|
2023-08-28 14:49:24 +00:00
|
|
|
qt_internal_detect_dirty_features()
|
2022-11-29 13:40:25 +00:00
|
|
|
|
|
|
|
if(NOT QT_BUILD_EXAMPLES)
|
|
|
|
# Disable deployment setup to avoid warnings about missing patchelf with CMake < 3.21.
|
|
|
|
set(QT_SKIP_SETUP_DEPLOYMENT ON)
|
|
|
|
endif()
|
2023-05-31 10:09:34 +00:00
|
|
|
|
|
|
|
option(QT_ALLOW_DOWNLOAD "Allows files to be downloaded when building Qt." OFF)
|