Commit Graph

2548 Commits (152153cb111db1bbd42e94f27712bbc39accf310)

Author SHA1 Message Date
Alexandru Croitor 65bf57ce7c CMake: Generate an SPDX v2.3 SBOM file for each built repository
This change adds a new -sbom configure option to allow generating and
installing an SPDX v2.3 SBOM file when building a qt repo.

The -sbom-dir option can be used to configure the location where
each repo sbom file will be installed.

By default it is installed into

 $prefix/$archdatadir/sbom/$sbom_lower_project_name.sdpx

which is basically ~/Qt/sbom/qtbase-6.8.0.spdx

The file is installed as part of the default installation rules, but
it can also be installed manually using the "sbom" installation
component, or "sbom_$lower_project_name" in a top-level build. For
example: cmake install . --component sbom_qtbase

CMake 3.19+ is needed to read the qt_attribution.json files for
copyrights, license info, etc. When using an older cmake version,
configuration will error out. It is possible to opt into using an
older cmake version, but the generated sbom will lack all the
attribution file information.
Using an older cmake version is untested and not officially supported.

Implementation notes.

The bulk of the implementation is split into 4 new files:

- QtPublicSbomHelpers.cmake - for Qt-specific collecting, processing
  and dispatching the generation of various pieces of the SBOM document
  e.g. a SDPX package associated with a target like Core, a SDPX
  file entry for each target binary file (per-config shared library,
  archive, executable, etc)

- QtPublicSbomGenerationHelpers.cmake - for non-Qt specific
  implementation of SPDX generation. This also has some code that was
  taken from the cmake-sbom 3rd party project, so it is dual licensed
  under the usual Qt build system BSD license, as well as the MIT
  license of the 3rd party project

- QtPublicGitHelpers.cmake - for git related features, mainly to embed
  queried hashes or tags into version strings, is dual-licensed for
  the same reasons as QtPublicSbomGenerationHelpers.cmake

- QtSbomHelpers.cmake - Qt-specific functions that just forward
  arguments to the public functions. These are meant to be used in our
  Qt CMakeLists.txt instead of the public _qt_internal_add_sbom ones
  for naming consistency. These function would mostly be used to
  annotate 3rd party libraries with sbom info and to add sbom info
  for unusual target setups (like the Bootstrap library), because most
  of the handling is already done automatically via
  qt_internal_add_module/plugin/etc.

The files are put into Public cmake files, with the future hope of
making this available to user projects in some capacity.

The distinction of Qt-specific and non-Qt specific code might blur a
bit, and thus the separation across files might not always be
consistent, but it was best effort.

The main purpose of the code is to collect various information about
targets and their relationships and generate equivalent SPDX info.

Collection is currently done for the following targets: Qt modules,
plugins, apps, tools, system libraries, bundled 3rd party libraries
and partial 3rd party sources compiled directly as part of Qt targets.

Each target has an equivalent SPDX package generated with information
like version, license, copyright, CPE (common vulnerability
identifier), files that belong to the package, and relationships on
other SPDX packages (associated cmake targets), mostly gathered from
direct linking dependencies.

Each package might also contain files, e.g. libQt6Core.so for the Core
target. Each file also has info like license id, copyrights, but also
the list of source files that were used to generate the file and a
sha1 checksum.

SPDX documents can also refer to packages in other SPDX documents, and
those are referred to via external document references. This is the
case when building qtdeclarative and we refer to Core.

For qt provided targets, we have complete information regarding
licenses, and copyrights.

For bundled 3rd party libraries, we should also have most information,
which is usually parsed from the
src/3rdparty/libfoo/qt_attribution.json files.
If there are multiple attribution files, or if the files have multiple
entries, we create a separate SBOM package for each of those entries,
because each might have a separate copyright or version, and an sbom
package can have only one version (although many copyrights).

For system libraries we usually lack the information because we don't
have attribution files for Find scripts. So the info needs to be
manually annotated via arguments to the sbom function calls, or the
FindFoo.cmake scripts expose that information in some form and we
can query it.

There are also corner cases like 3rdparty sources being directly
included in a Qt library, like the m4dc files for Gui, or PCRE2 for
Bootstrap.
Or QtWebEngine libraries (either Qt bundled or Chromium bundled or
system libraries) which get linked in by GN instead of CMake, so there
are no direct targets for them.
The information for these need to be annotated manually as well.

There is also a distinction to be made for static Qt builds (or any
static Qt library in a shared build), where the system libraries found
during the Qt build might not be the same that are linked into the
final user application or library.

The actual generation of the SBOM is done by file(GENERATE)-ing one
.cmake file for each target, file, external ref, etc, which will be
included in a top-level cmake script.

The top-level cmake script will run through each included file, to
append to a "staging" spdx file, which will then be used in a
configure_file() call to replace some final
variables, like embedding a file checksum.

There are install rules to generate a complete SBOM during
installation, and an optional 'sbom' custom target that allows
building an incomplete SBOM during the build step.

The build target is just for convenience and faster development
iteration time. It is incomplete because it is missing the installed
file SHA1 checksums and the document verification code (the sha1 of
all sha1s). We can't compute those during the build before the files
are actually installed.

A complete SBOM can only be achieved at installation time. The install
script will include all the generated helper files, but also set some
additional variables to ensure checksumming happens, and also handle
multi-config installation, among other small things.

For multi-config builds, CMake doesn't offer a way to run code after
all configs are installed, because they might not always be installed,
someone might choose to install just Release.
To handle that, we rely on ninja installing each config sequentially
(because ninja places the install rules into the 'console' pool which
runs one task at a time).
For each installed config we create a config-specific marker file.
Once all marker files are present, whichever config ends up being
installed as the last one, we run the sbom generation once, and then
delete all marker files.

There are a few internal variables that can be set during
configuration to enable various checks (and other features) on the
generated spdx files:

- QT_INTERNAL_SBOM_VERIFY
- QT_INTERNAL_SBOM_AUDIT
- QT_INTERNAL_SBOM_AUDIT_NO_ERROR
- QT_INTERNAL_SBOM_GENERATE_JSON
- QT_INTERNAL_SBOM_SHOW_TABLE
- QT_INTERNAL_SBOM_DEFAULT_CHECKS

These use 3rd party python tools, so they are not enabled by default.
If enabled, they run at installation time after the sbom is installed.
We will hopefully enable them in CI.

Overall, the code is still a bit messy in a few places, due to time
constraints, but can be improved later.

Some possible TODOs for the future:
- Do we need to handle 3rd party libs linked into a Qt static library
  in a Qt shared build, where the Qt static lib is not installed, but
  linked into a Qt shared library, somehow specially?
  We can record a package for it, but we can't
  create a spdx file record for it (and associated source
  relationships) because we don't install the file, and spdx requires
  the file to be installed and checksummed. Perhaps we can consider
  adding some free-form text snippet to the package itself?

- Do we want to add parsing of .cpp source files for Copyrights, to
  embed them into the packages? This will likely slow down
  configuration quite a bit.

- Currently sbom info attached to WrapFoo packages in one repo is
  not exported / available in other repos. E.g. If we annotate
  WrapZLIB in qtbase with CPE_VENDOR zlib, this info will not be
  available when looking up WrapZLIB in qtimageformats.
  This is because they are IMPORTED libraries, and are not
  exported. We might want to record this info in the future.

[ChangeLog][Build System] A new -sbom configure option can be used
to generate and install a SPDX SBOM (Software Bill of Materials) file
for each built Qt repository.

Task-number: QTBUG-122899
Change-Id: I9c730a6bbc47e02ce1836fccf00a14ec8eb1a5f4
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
(cherry picked from commit 37a5e001277db9e1392a242171ab2b88cb6c3049)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
2024-06-13 14:55:07 +00:00
Alexandru Croitor 19c4c8e12d CMake: Assign FindWrapFoo_VERSION variable in QtFindWrapHelper.cmake
The QtFindWrapHelper.cmake file retrieves the version of the
underlying system package version or bundled package version, and
passes that to find_package_handle_standard_args to show which version
was found.
But it did not set a ${PACKAGE_NAME}_VERSION variable, which means
we didn't record the version in qt_find_package, and thus in the final
SBOM.

Make sure we set the variable.

Amends 7ad8c347feb5e336c3833d6d3ac021a0a14b714a

Change-Id: Ia0d5b895de36017949e6607d17093459dca302b3
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
(cherry picked from commit 0be79f14865c0a19fde0abad7d1722f0bac3b7c2)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
2024-06-13 14:55:01 +00:00
Alexey Edelev a70a587f61 Fix the arg_HEADER_MODULE condition
Use the variable name but not the unwrapped value.

Pick-to: 6.7 6.5
Change-Id: Ie392a4875fe412b8eb273a457a83cd08cd9f5e15
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
(cherry picked from commit e960fb136e77437e158367f86bc926504e0fdab6)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
2024-06-13 14:39:20 +00:00
Alexey Edelev 10b48d59dd Remove GENERATE_CPP_EXPORTS argument
The behavior that argument was enabling is the default one now.

Task-number: QTBUG-90492
Change-Id: I11711d4c794f0b22169abb595b8ffad2eeb1300d
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
(cherry picked from commit 1ef3bd05eb45d53cdcf92b933603b995283b3432)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
2024-06-13 14:39:17 +00:00
Joerg Bornemann 5280f307a8 CMake: Yield error if a feature is ENABLEd and CONDITION is false
Consider a feature that has ENABLE and CONDITION expressions. For
example, system-libb2 on a Linux machine that does not have the
libb2-dev package installed:

qt_feature("system-libb2" PRIVATE
    LABEL "Using system libb2"
    CONDITION Libb2_FOUND
    ENABLE INPUT_libb2 STREQUAL 'system'
    DISABLE INPUT_libb2 STREQUAL 'no' OR INPUT_libb2 STREQUAL 'qt'
)

If the feature is enabled by the user by setting
FEATURE_system_libb2=ON, then there's an error:
    Feature "system_libb2": Forcing to "ON" breaks its condition...

This is expected.

If the feature is enabled by the user by triggering the ENABLE condition
via the -system-libb2 configure flag (that sets INPUT_libb2 to
"system"), we did not get an error message.

This was unexpected and inconsistent.

Now, we consider features that are enabled via their ENABLE condition as
set by the user and yield an error if the CONDITION doesn't match.

Fixes: QTBUG-126144
Change-Id: I249baf9ab4f434f5a96894f4ec055f70859ffca9
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
(cherry picked from commit ad227368c3ab3a9dc68208bce2d075edefe7e6e0)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
2024-06-12 15:53:35 +00:00
Alexandru Croitor e83de10922 CMake: Fix forwarding the '0' argument which is by default falsey
If the forward argument was meant to be 0, it was not forwarded
because it evaluated to false in if(condition).

To pass it along, instead check for empty strings.

Change-Id: Ia366df147de0c2d333017da43dc0643b56a89e9c
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
(cherry picked from commit 96abceb64e5dc0570ca7c3419f401cfafe946ba0)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
2024-06-11 19:35:30 +00:00
Alexandru Croitor 92ffa3a7a5 CMake: Fix framework headers not being copied after rm-ing build dir
If a build dir is removed using rm -r *, this still leaves
dot files around, specifically the .ninja_log file.

Because of a possibly unspecified behavior of listing directories as
OUTPUTs in a add_custom_command call for the
${target}_copy_fw_sync_headers custom target, we end up with a
situation where the custom command is not rerun by ninja because the
directory OUTPUT was encountered in the .ninja_log file.

Make sure to specify an additional file as an OUTPUT, to ensure the
command does rerun, and thus copies all headers from the syncqt
staging directory.

Amends 103eca1070

Pick-to: 6.7 6.5
Fixes: QTBUG-126056
Change-Id: I5664cf074158199e0c7fd5e312ecf739133d7f2e
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
(cherry picked from commit c561bcceed0300a14e2062958afce62776be4b6f)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
2024-06-06 10:37:23 +00:00
Alexandru Croitor b37c0d7c6c CMake: Don't record provided targets for Qt6 package
Due to QTBUG-125371 we currently record Qt6 as a third party
dependency for many qt packages.

Until that is fixed, we should not record the provided targets of the
Qt6 package, because it causes issues during SBOM generation.

Amends 58eefbd0b6

Task-number: QTBUG-125371
Change-Id: I35d548996c3820aaa7a1175b3a1f34c23ec2290f
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-31 16:27:03 +02:00
Alexandru Croitor 358effb7a3 CMake: Add a _qt_internal_forward_function_args function
It's a helper to pass along option arguments that are set by
cmake_parse_arguments, from the current scope to another function
call.

It avoids a lot

 if(arg_FOO) set(options FOO ${arg_FOO})

boilerplate.

It is somewhat the opposite of _qt_internal_remove_args.

The options that the function takes are prefixed with FORWARD_
to avoid possible naming conflicts with the actual options that should
be forwarded.

Change-Id: I54fd22b884d8af8379f2f735eb911a3bc66d3416
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-29 23:01:47 +02:00
Alexandru Croitor 58eefbd0b6 CMake: Record package provided targets in Dependencies.cmake files
Each qt_find_package can specify a PROVIDED_TARGETS option, to inform
which targets will be created by that package.
The call then saves the package name, version, etc on each of the
provided targets.

Currently the provided targets info is not persisted anywhere after
configuration ends.

We will need this for SBOM creation, so that we can collect
information about such dependencies when configuring leaf
repos, where find_dependency calls are implicit, and don't contain
the PROVIDED_TARGETS option, and we need to go from package name to
target name (and any recorded info it the target has).

This is especially relevant for static library builds, where private
dependencies become public dependencies.

Collect the provided targets information at post process time and
persist it for each 'package name + components requested' combination
into the Dependencies.cmake file.

This information will be used in a later change for SBOM generation.

Change-Id: I1693f81b1ad3beaf9b02e44b09a5e977923f0d85
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-29 23:01:47 +02:00
Alexandru Croitor 28c8f8e92a CMake: Pass along the version in FindWrap cmake scripts
The QtFindWrapHelper include used in FindWrap scripts can choose to
call find_package() on one of two packages. The packages might set a
VERSION variable. We should set the same version for the FindWrap
package as well.

There are two sources where the version will be queried from. First
from the underlying ${package_name}_VERSION variable.

And if that is empty, from a property that is set by qt_find_package()

The former might be empty because find_package might be called from
a function instead of a macro, which is the case for any find_package
call in configure.cmake files that get loaded by the
qt_feature_evaluate_features function.
Thus we need the indirection via the property that qt_find_package
will set.

Change-Id: I57fd818cb9dedf5e27a6d805e3d817d8d18be36d
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-29 23:01:47 +02:00
Alexandru Croitor 8fe9cabe16 CMake: Add functions to safely append to cmake properties
Encapsulate the boilerplate logic of querying a property and setting
it to an empty string instead of NOTFOUND, before appending a value,
removing duplicates and assigning the values back to the property.

Change-Id: I7aefd11e9bdd77090324ec50c682d62181d22076
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-29 23:01:47 +02:00
Alexandru Croitor 0e984f41e8 CMake: Move some functions into QtPublicCMakeHelpers
Move the implementations into QtPublicCMakeHelpers and just forward
to those public implementations in the old code.

The new public api will be used in the public sbom cmake files.

Change-Id: I979319935611e3f553ebd414f8304f1a3163c4ee
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-29 23:01:47 +02:00
Alexandru Croitor 84a9f934b2 CMake: Fix calling some functions in CMake 3.16
Calling qt_internal_get_framework_info failed when the target was
an INTERFACE_LIBRARY, because it tried to access properties that
aren't allowed on such a target. Interface libraries can't be
frameworks, so just add an early return guard.

Do the same for qt_internal_apply_apple_privacy_manifest.

Change-Id: I85b73449a0d56b92cd01b032d4ce5db905643c9f
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-29 23:01:47 +02:00
Alexandru Croitor a1445670f5 CMake: Fix configs passed to qt_get_install_target_default_args
Because the configs passed to the ALL_CMAKE_CONFIGS option were quoted
cmake_parse_arguments(PARSE_ARGV) would escape the semicolon in
the set value, effectively doing
 set(arg_ALL_CMAKE_CONFIGS "Release\;Debug")

Then the
 list(GET arg_ALL_CMAKE_CONFIGS 0 first_config)
call would essentially do
 set(first_config "Release;Debug")
and the
 if(all_configs_count GREATER 1
    AND NOT arg_CMAKE_CONFIG STREQUAL first_config)
condition would never trigger because a single config string can never
equal a double config string.

Remove the quotes to ensure correct behavior.

This won't really trigger any behavior change, because we exclude
installation of Debug executables in -debug-and-release builds,
but it will make --trace-expand logs less confusing.

Amends f240d94f14

Pick-to: 6.7
Change-Id: I53179511c7698c90b33cb3ff2762cef680a99815
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-29 23:01:47 +02:00
Lucie Gérard 1e0bc86dc0 Add copyright and licensing to .cpp and .h files missing them
Task-number: QTBUG-124453
Change-Id: I4487791114ce8ee6d2e788cc9a5f2ea5ec162f6b
Reviewed-by: Kai Köhne <kai.koehne@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2024-05-28 09:47:01 +02:00
Assam Boudjelthia e8e369714b Android: bump default sdk build version for Java to 34
To allow using Android 14 APIs, this affects only Java
code.

Amends 7b84cd62b0.

Change-Id: Ie79df773499976ba5c847be98ff5d21ee55036e9
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-27 17:14:35 +03:00
Alexey Edelev 7d9d1220f3 Prefer using the non-suffixed libzstd over static one
Recent zstd versions provide the libstd target but not only libzstd_shared
or libzstd_static. Attempt to use it as the WrapZSTD::WrapZSTD counterpart
if the target exists.

Task-number: QTBUG-119469
Change-Id: I47916bfa6f10883d099184a497800277c8026b14
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-05-27 15:53:21 +02:00
Alexandru Croitor b151b0a949 CMake: Fix incorrect framework versioned_binary_dir output for iOS
There was a stray '}' character in the value.

Amends 8f03bb6bd8

Change-Id: I06f9200b1449bc54ec07ace1336bb97a8f132158
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-24 00:31:48 +02:00
Assam Boudjelthia 841bbbe8ec Android: bump min supported SDK to 28 (Android 9)
Bump the minimum supported Android API from 23 to 28 i.e.
Android Oreo 9. This is done to focus more and more on
recent versions.

Fixes: QTBUG-125023
Task-number: QTBUG-124890
Change-Id: I4d510b771f413e5711dd44de454211e019c63db6
Reviewed-by: Heikki Halmet <heikki.halmet@qt.io>
2024-05-23 10:26:20 +03:00
Alexey Edelev 816071d440 Move QT_DISABLE_DEPRECATED_UP_TO and QT_WARN_DEPRECATED_UP_TO to header
The new approach allows to imply the macro definitions for every Qt
submodule and user project without the need of setting it explicitly
from CMake. This also prevent users from introducing the
incompatibility between Qt modules due to defining
the QT_DISABLE_DEPRECATED_UP_TO version lower than qtbase was built
with.

Task-number: QTBUG-124765
Change-Id: I7ba481f62cb9073ae0343c400ffc26f239f080f1
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-05-22 18:38:09 +02:00
Alexandru Croitor 8f03bb6bd8 CMake: Set fw_versioned_binary_dir in the framework info function
This will be used by the SBOM generation code to retrieve the
directory where the framework file is installed.

Change-Id: I882344f1fa3c5a77e3cce85d2044aa0e682bed40
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-22 18:18:25 +02:00
Alexandru Croitor 6328aaadf9 CMake: Fix DEBUG_POSTFIX to apply to macOS multi-config builds
There was refactoring in 8c41125118 to
handle custom postfixes, which caused a regression in the postfix not
being set for macOS frameworks.

Specifically we set CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_DEBUG to
the value of ${${postfix_var}} but that variable was empty, because we
only set it in the PARENT_SCOPE.

Set the variable also in the current scope.

Amends 8c41125118

Pick-to: 6.5 6.7
Change-Id: Iae3f1050bb11805b4cce01ec491a13a3d6c0a9fc
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-22 18:18:25 +02:00
Jesus Fernandez 7c128f8866 Add -Wweak-vtables to headersclean
This requires some fixes in several classes that are also included
in this patch.

The QTestEvent hierarchy is all-inline and changes layout depending on
QT_GUI_LIB and QT_WIDGETS_LIB, so we can't just export it. Suppress the
warning in that header for now. Created QTBUG-104486 to track a fix for
the real issue.

The QFutureInterface hierarchy is also all-inline, but templates, so
doesn't trigger, except the <void> specialization. Created
QTBUG-125115 to track a fix for the real issue.

Done-with: Marc Mutz <marc.mutz@qt.io>
Task-number: QTBUG-45582
Change-Id: I96b3e109aa989b70e0d4809b90bd53a369e50d55
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2024-05-19 15:56:17 +00:00
Morten Sørvig b8bcf6b883 wasm: handle unable to determine emcc versiopn
It can happen that we are not able to determine which
Emscripten version Qt is built with, for example if
the detection code runs at a time when qconfig.h has
not been created yet.

In that case skip printing a warning since we are not
able to offer a sensible recommendation.

This fixes Qt configure when building for shared libraries,
where we would previously print this warning several
times:

  Qt Wasm built with Emscripten version:
  You are using Emscripten version: 3.1.50
  The recommended version of Emscripten for this Qt is: 3.1.50
  This may not work correctly

Change-Id: Ie15300e89c0e4b6f22650e662dd30fd32828e60c
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
2024-05-16 18:49:25 +02:00
Samuli Piippo f3bf304de7 CMake: Allow force use of builtin testdata
Builtin testdata packages all test files into resources. This is used
on mobile platforms by default, but it can be useful on other platforms
as well. Add CMake option to force this on other platforms.

Change-Id: I67c82bc735960be53b351ed16526cbfacfbe9bb6
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-05-16 17:51:15 +03:00
Alexey Edelev 90c2cde691 Change the -qpa configure argument logic
Parse the -qpa configure argument as list and translate it to the
QT_QPA_PLATFORMS cmake variable. This variable is new to the Qt build
procedure. The QT_QPA_DEFAULT_PLATFORM variable supposed to get
multiple values, but this didn't work at all, since the variable value
then was used in the compile definition that is expected to be a single
value QPA platfrom definition. This inconsistency forced to introduce
a new variable.

The QT_QPA_DEFAULT_PLATFORM variable now controls the first-choice QPA
plugin for the GUI applications. The new configure argument
-default-qpa is now translated to the QT_QPA_DEFAULT_PLATFORM variable
instead the of -qpa one. The -qpa configure argument is now translated
to the QT_QPA_PLATFORMS variable, which is new one as well. The
variable contains the list of QPA plugins that are "default" for this
Qt configuration. The meaning of the "default" plugins is related to
the DEFAULT_IF argument of qt_internal_add_plugin command. Plugins
that are listed in the QT_QPA_PLATFORMS variable will be treated as
default by the build system and will be deployed within user
applications when using deployment API or linked statically when using
static Qt.

The QT_QPA_DEFAULT_PLATFORM falls back to the QT_QPA_PLATFORMS first
value in the list if it's not set explicitly and either
'-DQT_QPA_PLATFORMS' or '-qpa' arguments are specified.

[ChangeLog][CMake] Added QT_QPA_PLATFORMS variable which controls the
list of QPA plugins that will be deployed within the applications by
default.
[ChangeLog][CMake] The '-qpa' configure argument now is mapped to the
QT_QPA_PLATFORMS variable and has different functionality. It doesn't
control the platform plugin that the GUI application is using by
default, but controls the list of QPA plugins that will be deployed
within the applications by default.
[ChangeLog][CMake] Added '-default-qpa' argument which replaces the
'-qpa' one. The argument is translated to the QT_DEFAULT_QPA_PLATFORM
CMake variable and selects the default platform that should be used
by GUI application if QT_QPA_PLATFORM environment variable is not set.

Task-number: QTBUG-124265
Task-number: QTBUG-87805
Task-number: QTBUG-124449
Change-Id: Ibcebaccc535aaed6374f15ccfeddb3e6128f5ce0
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-05-14 20:48:12 +02:00
Alexandru Croitor 70a2e7f32b CMake: Suppress package not found warnings in some FindWrap scripts
Some of our FindWrap scripts try to call find_package() once or more
to find a system package, and then fallback to a different source in
case if not found.

The side effect of this is that find_package() will append not found
packages to the global PACKAGES_NOT_FOUND property.
FeatureSummary feature_summary() will then list these as not found,
creating confusion.
For example while FindWrapSystemPCRE2 might be found, PCRE2 found will
be shown as not found, because we found the package via PkgConfig
instead of cmake Config file.

Manually remove these packages from the PACKAGES_NOT_FOUND property
in some of our Find scripts, to avoid the confusion.

Pick-to: 6.7
Fixes: QTBUG-96120
Task-number: QTBUG-96394
Task-number: QTBUG-111216
Change-Id: I4be825c810248202c34f446e3cebe66574d0531c
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-14 00:32:41 +02:00
Tor Arne Vestbø 1f667ba70e visionOS: Add support for immersive spaces
The QNativeInterface::QVisionOSApplication interface allows opening
and dismissing an immersive space, as well as registering a compositor
layer implementation that can be used to configure the compositor
layer and render to it with Metal.

The compositor layer implementation is consulted both for immersive
spaces triggered explicitly, and when the default scene of the app
is set to CPSceneSessionRoleImmersiveSpaceApplication via the
UIApplicationPreferredDefaultSceneSessionRole in the Info.plist.

All of this requires that the application follows the SwiftUI app
lifecyle, so our application entrypoint is now a SwiftUI app. The
existing qt_main_wrapper used for the QIOSEventDispatcher handles
this transparently, so there is no change for the user, who will
still receive a callback to main() when the Swift app is ready
to build its UI hierarchy.

Change-Id: Ic295010d714e90cd4d3f66bd90f321438659f3a6
Reviewed-by: Christian Strømme <christian.stromme@qt.io>
2024-05-14 00:32:35 +02:00
Alexandru Croitor aec74f9c76 CMake: Propagate ZLIB version in Find script to wrapper script
Pick-to: 6.5 6.7
Change-Id: Ieba03d792b5a21c7a101e3034831475d22fd9814
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-10 22:17:19 +02:00
Alexey Edelev c5be402651 Consider the qt_internal_extend_target calls when adding deps on qpa_default_plugins
Applications not necessarly link QtGui module in
qt_internal_add_executable. They still may add link it in followoup
qt_internal_extend_target calls. We should consider this when adding
dependencies on qpa_default_plugins to the internal executables.

Pick-to: 6.7
Change-Id: Icc413bd35b631b3a356e4033faab4e6c01b29a60
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-05-08 13:31:26 +02:00
Alexey Edelev 1e8a36e360 Consider the versioned Qt6::Gui when target when adding the plugin dependencies
QtGui module can be linked using both versioned and non versioned
targets. Consider this when adding the dependencies to the
qpa_default_plugins targets.

Pick-to: 6.7
Change-Id: Iccbf3009ab8a4f9df4de1677f1b41445814c8c9e
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-05-08 13:31:23 +02:00
Alexey Edelev c7176f3142 Fix the static linking of plugins to the Qt tools and internal executables
Qt tools and executables may required the static plugins from modules
that are build as part of the Qt build tree. In this case we need to
force plugin importing. This adds the qt_internal_import_plugins call
when we extend the executable target.

Replace the previos solution that considered libraries that were
provided in the arguments of the qt_internal_add_executable call only.

Pick-to: 6.7 6.6 6.5
Fixes: QTBUG-111988
Change-Id: Ifa2cf7f1f68d9f90cafc64f225aebe11d4cdb2ae
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-05-08 13:31:20 +02:00
Alexey Edelev ac4920b5c0 Prefer the versioned targets over the namespaceless one when collecting deps
Change the way we collect dependencies in __qt_internal_walk_libs.
Prefer the versioned Qt targets over the namespaceless. This fixes the
generating of the pkg-config configs.

Pick-to: 6.5 6.6 6.7
Task-number: QTBUG-124135
Change-Id: I660376e122a99b5bc0874f2bc6ccd4d80c9ad453
Reviewed-by: Ionen Wolkens <ionen@gentoo.org>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2024-05-07 12:13:41 +02:00
Alexey Edelev 721cfbd194 Consider versioned targets when checking the existens in __qt_internal_walk_libs
Since Qt targets now are linked as versioned targets by default, we
should adjust the respective check in __qt_internal_walk_libs.

Pick-to: 6.7
Change-Id: Idb896c1d9eda944a06d57b0491686cd78e010df0
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-05-07 12:13:37 +02:00
Alexey Edelev 337cadbcb7 Consider '^Qt6' deps when generating pkg-config files
Dependencies that alredy start with QT_CMAKE_EXPORT_NAMESPACE shouldn't
be skipped but collected as is when generating pkg-config files.

Pick-to: 6.5 6.6 6.7
Fixes: QTBUG-124135
Change-Id: I6875337c2e1d98f657e52a5fc2c37eebccf08b98
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2024-05-07 12:13:33 +02:00
Alexey Edelev bca3d16bc2 Fix indent for the -submodules argument in configure-cmake-mapping.md
Change-Id: I88e2e6cccef6c961bc65cc6b95f06968f957da9f
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-05-06 22:08:24 +02:00
Marc Mutz a074dd5616 headersclean: add -Wredundant-decls
qpagesize.h violated it, resulting in a bug report, so add it to headerscheck.

Task-number: QTBUG-115583
Change-Id: I4c52fb72667edd3f3cf563b8bad91d343ac95328
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-06 11:50:23 +02:00
Joerg Bornemann ae64c54f8c configure: Fix --developer-build argument (with two hyphens)
We never properly handled double-hyphen arguments like --list-features.
However --developer-build worked by accident, because it did set
INPUT_developer_build implicitly.

Now, we don't automagically translate INPUT_foo to FEATURE_foo anymore,
and --developer-build stopped working.

Fix this by consistently handling -foo and --foo arguments.

Change-Id: Ibf32979b419c28e0a8e1f810f03ae3f295b14c69
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-03 18:42:37 +02:00
Antti Kokko d04deafed9 CMake: remove QT_EDITION from qconfig.pri
QT_EDITION is not used anywhere in Qt6, stop
adding it to qconfig.pri.

Packaging currently unnecessarily patches
the edition when handling the first steps after
integration and again during install time.

Pick-to: 6.7 6.5 6.2
Change-Id: I0ad1933ec8fea741796fdf6d13f627a657aac401
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Reviewed-by: Iikka Eklund <iikka.eklund@qt.io>
2024-04-26 12:53:11 +03:00
Tim Blechmann 7a62c96238 CMake: add licenseRule.json to IDE projects
Some repos have licenseRule.json files. Adding them to the IDE projects.

Pick-to: 6.7
Change-Id: I7fdc054d244d48e3343866775671d8f4f4c9390b
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
Reviewed-by: Lucie Gerard <lucie.gerard@qt.io>
2024-04-24 16:41:23 +08:00
Tor Arne Vestbø b74369c033 cmake: Add opt-out for adding -no_warn_duplicate_libraries linker flag
The classic linker (triggered via -ld_classic) doesn't support this flag,
and we can't construct a genex that takes this into account, so add an
opt-out for Qt WebEngine.

Pick-to: 6.7
Change-Id: I62418e0ff37fe8f5bdda2fa8d01b36a8fd44542a
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-04-18 19:30:31 +00:00
Tor Arne Vestbø d5bf42f75b Add preliminary support for Qt for visionOS
Qt already runs on Vision Pro as "Designed for iPad", using Qt
for iOS. This change enables building Qt for visionOS directly,
which opens the door to visionOS specific APIs and use-cases
such as volumes and immersive spaces.

The platform removes some APIs we depend on, notably UIScreen,
so some code paths have been disabled or mocked to get something
up and running.

As our current window management approach on UIKit platforms
depends on UIWindow and UIScreen there is currently no way to
bring up QWindows. This will improve once we refactor our
window management to use window scenes.

To configure for visionOS, pass -platform macx-visionos-clang,
and optionally add -sdk xrsimulator to build for the simulator.

Change-Id: I4eda55fc3fd06e12d30a188928487cf68940ee07
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-04-18 05:00:57 +02:00
Alexey Edelev 0075672da3 Remove the headersclean feature
'headersclean' shoudn't be a feature. The respective flag should behave
like command-line switch that affects the only repo that it was passed
for. This also avoids propagating of the headersclean feature between
the different repos when qtbase was built with the headerclean enabled.

Fixes: QTBUG-121722
Change-Id: I304cbc980b06030513c015a2016678a6a0965fed
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2024-04-17 20:41:35 +02:00
Morten Sørvig b4090305d0 wasm: introduce QT_BUILD_WASM_BATCHED_TESTS
We are selecting a subset of the tests for batching/CI,
however this is done for the WASM configuration which
interferes with non-batched tests.

- we can only build and run tests which are in the
batching subset
- we are enabling threading tests which breaks the
no-thread configuration.

Add QT_BUILD_WASM_BATCHED_TESTS and enable for WASM and
batching. There's then no restrictions on which tests
can be selected for CI.

Change-Id: I59a67b63e80cd00676cb28f916951d2a52b0ee2c
Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
2024-04-17 12:02:09 +02:00
Tim Blechmann edc2d41456 CMake: qt_internal_add_test - fix BLACKLIST file handling
Not all tests have targets that we can attach the BLACKLIST files to.

Pick-to: 6.7
Change-Id: Ie0a2d72859877a8803802a4f7dc996944f002656
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2024-04-13 08:18:36 +08:00
Tim Blechmann 191dbbdea7 CMake: qt_internal_add_test - add BLACKLIST files to IDE projects
Tests can be blacklisted via BLACKLIST files. This patch adds these
files to the generated IDE projects automatically when available.

Pick-to: 6.7
Change-Id: Icef2c397ada823e7b1c380dbb224694f059891ff
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-04-12 08:36:52 +08:00
Tim Blechmann bd2dc0c3ed CMake: split _extra_files targets
Separate config.tests, coin, cmake, licenses and changelogs into
independent targets to keep the IDE projects more organized.

Pick-to: 6.7
Change-Id: Ie33d45799621c2d7ec6f022ffcfac132ac4c7b94
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-04-12 08:36:05 +08:00
Tim Blechmann 003a191152 cmake: add _extra_files IDE target from heuristics
Lots of files in the repos are not included into the generated IDE
projects. Therefore we add utility targets (custom targets), which are
populated by glob patterns, which should fit most files that are found
in qt's subprojects.

Pick-to: 6.7
Change-Id: I1b731e65f8db319d3cec817eea5c23a1eeaefb22
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-04-12 08:36:01 +08:00
Alexey Edelev 2d19f09b57 Avoid using PACKAGE_PREFIX_PATH for configure-time executables
PACKAGE_PREFIX_PATH is not defined in cmake versions 3.29.x.
We should avoid referring the internal CMake variables.
Use the calculated reverse relative path to the prefix path
instead.

Fixes: QTBUG-124186
Pick-to: 6.5 6.6 6.7
Change-Id: Iefae132e61a3f8e8f5525c0abd6a2d41631c2fb0
Reviewed-by: Oliver Eftevaag <oliver.eftevaag@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2024-04-11 01:27:32 +02:00
Alexey Edelev 6760bae2fa Suppress the warning about unused QT_INTERNAL_CALLED_FROM_CONFIGURE
Add the dummy check if the variable is defined to suppress the warning.

Pick-to: 6.7
Change-Id: If3bb0ef6a2587693c0ec898ceb3080ebfc1e82a7
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2024-04-11 01:27:32 +02:00
Martin Storsjö f35b9530b9 CMake: Fix a misplaced > in pkg-config files
The Qt CMake routines for generating pkg-config files don't
handle all sorts of generator expressions, see
qt_internal_set_pkg_config_cpp_flags in QtPkgConfigHelpers.cmake
which hardcodes handling of some specific expressions. In this
case, they don't handle the semicolon within the generator
expression expansion.

For the UNICODE and _UNICODE defines, this means that the pkg-config
file ends up containing "-D_UNICODE>" with the trailing ">". (The
pkg-config generator tries to parse out the generator expressions,
but the semicolon gets handled as a higher level separator, leaving
the closing bracket ">" behind.)

This issue only shows up for mingw targets, because pkg-config files
aren't generated in MSVC style builds.

Escape the semicolon as $<SEMICOLON> to make it not break the
surrounding generator expression, as parsed by the pkg-config file
generator.

The generator expressions aren't fully correctly evaluated for the
pkg-config files though; the UNICODE and _UNICODE defines don't
end up in the resulting pkg-config file even though they're used
during compilation (both before and after this change).

Fixes: QTBUG-103019
Co-authored-by: Martin Reboredo <yakoyoku@gmail.com>
Pick-to: 6.7 6.5 6.2
Change-Id: Icdb380e3b42be2a47372a8ee2b61378a33c685f7
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
Reviewed-by: Li Xinwei <1326710505@qq.com>
2024-04-11 02:27:32 +03:00
Tor Arne Vestbø ce23c9083f cmake: Only enable warnings on/off flags for C/C++/Objective-C/C++
The flags are not valid for e.g. Swift

Pick-to: 6.7
Change-Id: Ie5b46dc9147d8c024e7e27712c7b8632abd727d9
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-04-07 20:24:12 +02:00
Tor Arne Vestbø 2e97906593 cmake: Selectively enable -no_warn_duplicate_libraries for Xcode 15+
We can't make the choice of whether to enable no_warn_duplicate_libraries
or not based on the Xcode version Qt was built with, as the target flags
will propagate to our cmake integration tests, which we run on platforms
where we don't have Xcode 15.

Pick-to: 6.7
Change-Id: I241a950a3d2e70652a3a6386e5dd86c681d1c13f
Reviewed-by: Kai Köhne <kai.koehne@qt.io>
Reviewed-by: Orkun Tokdemir <orkun.tokdemir@qt.io>
2024-04-04 01:26:56 +02:00
Tim Blechmann 95dabd0696 CMake: fix unity builds of darwin's permission helper
CMake-3.29 supports unity-building of objc/objcpp. This patch fixes
darwin's permission helper, which includes a source under a preprocessor
define.

Change-Id: I62e2d291c40ad7b1dbb5243eaee9bf8625473041
Pack-to: 6.7 6.6 6.5
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2024-04-03 15:17:12 +00:00
Friedemann Kleint fdac1e2205 Add support for using an inline namespaces for -qtnamespace
Inline namespaces serve the purpose for which the original
-qtnamespace option was added and allow for macro simplification (no
need for any using directives). This makes it possible to use
namespaced builds of Qt also for Qt for Python and similar use cases
which have issues with the additional namespace.

[ChangeLog][QtCore] It is now possible to use an inline namespace for
-qtnamespace (option -qtinlinenamespace).

Task-number: PYSIDE-2590
Change-Id: Ia0cecf041321933a2e02d1fd8ae0e9cda699cd1e
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-04-03 17:17:11 +02:00
Tor Arne Vestbø e23ea6a5d3 cmake: Propagate Qt's CMAKE_OSX_SYSROOT to user projects by SDK name
CMake will transform the CMAKE_OSX_SYSROOT into a path as part of
Darwin-initialize.cmake, as non-Xcode generators rely on it to
be a path when setting -isysroot.

When propagating the CMAKE_OSX_SYSROOT to consumers of Qt, we need
to propagate it by its original SDK name, so that CMake's Xcode
generator can write it by name into the SDKROOT Xcode setting by
name, and so that we don't lock the user into using the exact
same SDK path (and version) as we did when building Qt.

The QT_APPLE_SDK code path has been removed, as setting QT_APPLE_SDK
will always set the CMAKE_OSX_SYSROOT as well.

Change-Id: Ib1ef19b9dc375dddf76a2629ee790990c0722f75
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-04-03 17:17:11 +02:00
Giuseppe D'Angelo 6aec89c5fb Hardening: fix _LIBCPP_HARDENING_MODE
It seems we ended up passing "_LIBCPP_HARDENING_MODE_EXTENSIVE"
(quoted), not just _LIBCPP_HARDENING_MODE_EXTENSIVE. Remove the
quoting.

Amends 9ff1e6d80b

Change-Id: Ia396b0ef638d656a9ea947a378d5623c11e5a544
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-27 16:41:54 +01:00
Alexey Edelev 4fcf6f5164 Set the CMP0159 to NEW where applicable
The policy controls the file(STRING ... REGEX) behavior. This
suppresses warnings produced by  CMake versions >= 3.29.

Pick-to: 6.5 6.6 6.7
Change-Id: I6067bb719b7d35aa2464a91ed198399ff9b1c9af
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-27 16:06:29 +01:00
Alexey Edelev 967732f7f7 Consider INSTALL_LIBDIR when calculating various cmake paths
Task-number: QTBUG-123039
Change-Id: I111cd612afe64a4f8456ab05d6ff3caf828c4712
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2024-03-27 10:37:16 +01:00
Joerg Bornemann 6e12a298f4 configure: Fix -system-zlib and -system-sqlite options
These options are declared with TYPE enum and a MAPPING that's supposed
to control the feature 'system-zlib' or 'system-sqlite'. Since only
inputs of type boolean control features now, we need to somehow declare
that this non-boolean input controls a feature.

We do this by adding the keyword CONTROLS_FEATURE to
qt_commandline_option. For example,

    qt_commandline_option(zlib
        CONTROLS_FEATURE
        TYPE enum
        NAME system-zlib
        MAPPING system yes qt no
    )

declares
- commandline option "zlib" sets the input "system-zlib",
  because of the "NAME system-zlib" argument
- accepted input values are "system" and "qt", because
  we have "TYPE enum" and the odd values of MAPPING
- those values are translated to yes/no, because of the
  even values of MAPPING
- CONTROLS_FEATURE forces the translated input's type
  to boolean, and with that it will set the corresponding
  feature 'system-zlib'

Luckily, only qtbase has command line options with MAPPING declared.

Change-Id: I82d06cec43ece3b002c8f5dd414c68dc730909af
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-27 06:56:09 +01:00
Joerg Bornemann c11beb8d32 configure: Fix -c++std and -sanitize options
This amends commit 110f656da9.

Command line options with a TYPE that denotes a custom command line
argument handler cannot set a feature "foo" anymore by just setting
INPUT_foo to "yes". Instead, they must use the newly introduced
functions qtConfCommandlineEnableFeature and
qtConfCommandlineDisableFeature.

These functions will set INPUT_foo and augment the input with the
information "this input is of boolean type". This information is used
when deciding whether to use this input as feature switch.

Change-Id: I83c691cc57424159148f059c2a1c8cd72e39ee63
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-27 00:14:02 +01:00
Alexey Edelev 018504f4f3 Move QtInstallPaths.cmake to the Qt6 package
QtInstallPaths needs to be loaded at early stages

Change-Id: Ie275ad2a8855b7555b110c35814ebadafe1817c6
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-22 15:31:40 +01:00
Thiago Macieira e0940081bc CMake/ELF: allow using Qt's full version number in the private tags
We added the feature to tag private symbols using the Qt major version
only, because us developers often move between versions and need to keep
compiled code working, even when using private API (we're supposed to
know what we're doing). Linux distributions, however, want to be told
that something used private API and therefore needs to be rebuilt. See
[1][2][3].

Distributors will learn about this feature when updating Qt causes the
existing patch to fail to apply.

[1] https://build.opensuse.org/projects/openSUSE:Factory/packages/qt6-base/files/0001-Tell-the-truth-about-private-API.patch?expand=1
[2] https://src.fedoraproject.org/rpms/qt6-qtbase/blob/rawhide/f/qtbase-tell-the-truth-about-private-API.patch
[3] https://github.com/clearlinux-pkgs/qtbase/blob/main/tell-the-truth-about-private-api.patch

Pick-to: 6.7
Change-Id: I5f663c2f9f4149af84fefffd17bed69026f4038d
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-03-21 21:13:57 -07:00
Alexandru Croitor 07e7340c0d CMake: Reconfigure whenever module EXTRA_FILES are touched
Otherwise the touched files will not be re-copied and re-installed
until an explicit rerun of cmake.

Pick-to: 6.7
Change-Id: I5abb752b45d8b33885a59363fe987225a89e713a
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-03-22 00:04:20 +01:00
Alexey Edelev e5bb392f72 Set the missing _qt_is_versionless_target property for versionless targets
Remove the versionless targets handling from pri helpers. This logic is
not relevant anymore since versionless targets hold all the related
properties now.

Amends 173164cd47

Change-Id: I933bf7409a3668333929387b8232d002ab6fa66b
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-21 16:23:00 +01:00
Alexey Edelev 840f5c1760 Set the _qt_ module properties for interface targets
The module properties starting with _qt can be set on interface
targets. We should set them to handle _qt_config_module_name
property for Private targets correctly. Otherwise private imported
modules do not land in .pri files as dependencies.

Amends 173164cd47

Fixes: QTBUG-123410
Change-Id: I14866eb407e6ddcbd625f5546cba22ccc7b6a297
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-21 16:22:59 +01:00
Alexey Edelev dc9c67c260 Allow filtering modules that will use pre-built tools
Add the support for QT_INTERNAL_FORCE_FIND_HOST_TOOLS_MODULE_LIST
argument which allows to set the list of tool targets that should not
build their tools if QT_FORCE_FIND_TOOLS is set to ON.

This mechanism doesn't work when crosscompiling.

Change-Id: I597ed766cc741cacf9cb73dd8dd255644c4c9e66
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-20 10:07:21 +01:00
Alexandru Croitor 224b7c6b6a CMake: Allow configuring a minimal subset of examples to deploy
When building examples as part of Qt in the CI, it's best to skip
running deployment for all examples to save resources
(space and time).

Add a QT_DEPLOY_MINIMAL_EXAMPLES option similar to our
QT_BUILD_MINIMAL_STATIC_TESTS option, which will set
QT_INTERNAL_SKIP_DEPLOYMENT at the root examples directory scope, to
skip deployment for all examples.
Each example can then opt into the minimal subset by unsetting the
QT_INTERNAL_SKIP_DEPLOYMENT variable before its
qt_internal_add_example call.

Add Coin instructions to enable this option when building our examples
in the CI.

Pick-to: 6.7
Task-number: QTBUG-90820
Task-number: QTBUG-96232
Task-number: QTBUG-102057
Change-Id: I2efcda455b400c27fe1efd1bcf81b133137fa2d1
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-03-19 18:22:16 +01:00
Alexandru Croitor c5d0e93199 CMake: Recompute QT_DEPLOY_PREFIX for each built example
The current deployment api implementation sets the value of
QT_DEPLOY_PREFIX based on CMAKE_INSTALL_PREFIX, if no QT_DEPLOY_PREFIX
was previously specified.

This does not work properly when multiple examples are placed in the
same subdirectory and are using deployment api.

Make sure to unset the QT_DEPLOY_PREFIX for each
qt_internal_add_example call, so that a correct prefix is computed for
each example, based on the modified CMAKE_INSTALL_PREFIX value that we
set for each example.

Pick-to: 6.7
Task-number: QTBUG-102057
Change-Id: I931e5f2d683ab94a940e20a2bdfeaa4ac5d8c5f8
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2024-03-19 17:20:24 +01:00
Alexandru Croitor 270315e019 CMake: Fix finding standalone parts config file for yocto
When building standalone tests of qtsvg targeting yocto, the
standalone parts config file was not found.

That's because it specifies a new CMAKE_STAGING_PREFIX for each built
repo, and the QtSvgTestsConfig.cmake file will be located there,
rather than in QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX, where
the QtBuildInternalsConfig.cmake file is.

So in this case, we always have to prefer looking into
CMAKE_STAGING_PREFIX for the file.

Amends 62905163bf

Task-number: QTBUG-90820
Task-number: QTBUG-96232
Change-Id: I8902381afa4267e40dfb2ad47e44285a806a35e2
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-03-19 16:04:59 +01:00
Tor Arne Vestbø 5e81a17b22 cmake: Merge Apple platform auto-detect functions
Makes it easier to see the interaction between the different
parts, and extract some of them to apply to a wider set of
platforms later on.

Change-Id: I3dd71dd6ad7a5b2870ab60bfbe4cf31be418bd8a
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-19 14:52:48 +01:00
Giuseppe D'Angelo 9ff1e6d80b Add hardening build options
This commit enables hardened-specific checks and codegen, inspired by
GCC 14's -fhardened command line switch and LLVM/libc++'s hardened
modes.

We enable (depending on compiler capabilities):

* -ftrivial-auto-var-init=pattern;
* -fstack-protector-strong;
* -fstack-clash-protection;
* -fcf-protection=full or /CETCOMPAT;
* -D_FORTIFY_SOURCE=3 or 2 on Glibc, depending on the Glibc version,
  provided that some optimization level is enabled (release build or
  optimized debug build);
* on libstdc++, -D_GLIBCXX_ASSERTIONS;
* on libc++, -D_LIBCPP_HARDENING_MODE set to
  _LIBCPP_HARDENING_MODE_EXTENSIVE in debug and to
  _LIBCPP_HARDENING_MODE_FAST in release (_DEBUG is too slow);
* -Wl,-z,relro,-z,now.

This aligns us 100% with -fhardened (we already pass -fPIE and -pie
anyhow). Some Linux distributions already ship GCC/Clang with some of
these options enabled by default.

The check for Intel CET has been amended to always test if the compiler
supports the corresponding flag; and, if so, enable the feature. Before,
it was behind a configure option and the test only checked if the
compiler had CET support automatically active (the test didn't pass
-fcf-protection to the compiler).

The check for -fstack-protector-strong has been made general (rather
than QNX-specific). We don't support QNX < 7 anyhow.

Finally, the qt_config_linker_supports_flag_test test has been
amended to also support MSVC.

All of the hardening options are enabled by default.

[ChangeLog][Build System] Qt builds by default in "hardened mode",
meaning that a series of security-related compiler options are
automatically enabled. In the unlikely case in which these options
constitute an unacceptable performance hit, it is possible to disable
individual hardening options when configuring Qt.

Change-Id: I2c026b0438010ad10d5e7b1136fedf4ae3af8822
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2024-03-19 02:52:43 +01:00
Alexandru Croitor 990b60120e cmake: Override generator for iOS projects to Xcode in qt-cmake.in
Instead of maintaining a separate qt-cmake.ios.in wrapper script that
can easily diverge from qt-cmake.in

Change-Id: I53f4eac02188be89a4c11b3e71cde04ac2a24b51
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2024-03-18 22:34:48 +01:00
Tor Arne Vestbø 7826a96652 cmake: Move iOS detection into qt_auto_detect_ios
We don't need to deal with the input arguments to configure. We
can instead look at QT_QMAKE_TARGET_MKSPEC, like we do when we
auto detect other platforms. This handles both the -xplatform
and the -platform arguments.

Change-Id: I8d987d23e16bfa106833d521f67e8b5a931d9169
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-18 19:04:14 +01:00
Tor Arne Vestbø 70e69f334e cmake: Don't set CMAKE_SYSTEM_NAME=iOS when configuring with -sdk
The -sdk argument is documented as:

  Build Qt using Apple provided SDK <sdk>. The argument should be
  one of the available SDKs as listed by 'xcodebuild -showsdks'.

[ChangeLog][configure] The -sdk argument no longer auto-enables
the macx-ios-clang makespec. Pass -xplatform macx-ios-clang to
explicitly build Qt for iOS.

Change-Id: Ia4074015aba2c8296a65534c38eb2f06db32f286
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-18 19:04:14 +01:00
Tor Arne Vestbø d04cf2c58b cmake: Rename QT_UIKIT_SDK to QT_APPLE_SDK
The SDK is relevant for all Apple systems, including macOS, iOS, tvOS,
watchOS, and visionOS.

We still pick up -DQT_UIKIT_SDK for iOS for compatibility.

[ChangeLog][CMake] The -sdk configure argument now maps
to the QT_APPLE_SDK CMake variable. QT_UIKIT_SDK is still
supported for iOS builds for compatibility.

Change-Id: I983a2f23c2414eb73cd35bb83738088defb45cbd
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-18 19:04:14 +01:00
Tor Arne Vestbø 640a3f2474 cmake: Propagate Apple platform build requirements to qconfig.pri
So we don't have to maintain the requirements in two places.

None of the variables removed from the qmake configs are
referenced before we do load(qt_config), so this should
be safe.

Pick-to: 6.7
Change-Id: Iabd5884a2fd1c4b1cd7b44416bebb2624050229e
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-14 14:50:36 +01:00
Alexandru Croitor d644f2e02c coin: Add instructions to build standalone examples
If a qt5.git configuration is marked with the StandaloneTests feature,
tell CMake not to build the examples in-tree, and instead use
qt-internal-configure-examples to build the examples out-of-tree.

This brings a couple of improvements:
- higher chance of building examples as ExternalProjects without
  issues
- ability to use deployment api in examples, without installing the
  examples into a main install prefix

The new coin instructions files use a copy of the standalone tests
instructions as a base.

Task-number: QTBUG-90820
Task-number: QTBUG-96232
Change-Id: If89e6da0b327a38b9c2738f58aa1b5b5fb9fda37
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2024-03-14 11:44:16 +01:00
Alexandru Croitor 62905163bf CMake: Allow building all examples as standalone just like tests
Introduce a new libexec/qt-internal-configure-examples script that
allows to configure and build "standalone examples" just like
"standalone tests".

This is a prerequisite for using deployment api in examples for prefix
builds, otherwise deployment api gets confused not finding various
information that it expects from an installed qt.

Because the various conditions in the build system for standalone
examples are similar to standalone tests, introduce a new
QT_BUILD_STANDALONE_PARTS variable and use that in the conditions.
The variable should not be set by the user, and is instead set by the
build system whenever QT_BUILD_STANDALONE_TESTS/EXAMPLES is set.

Unfortunately due to no common file being available before the first
project() call, in qtbase builds, per-repo builds and top-level builds,
we need to duplicate the code for setting QT_BUILD_STANDALONE_PARTS for
all three cases.

Task-number: QTBUG-90820
Task-number: QTBUG-96232
Change-Id: Ia40d03a0e8f5142abe5c7cd4ff3000df4a5f7a8a
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2024-03-14 11:44:16 +01:00
Alexandru Croitor d298a05ed1 CMake: Move most of CMakeLists.txt into QtBaseHelpers.cmake
Pick-to: 6.7
Change-Id: I19761dbeebdd2529ef0c493a9a61a1c6fe58667b
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2024-03-14 11:44:16 +01:00
Alexey Edelev e7d7eded4c Fix the condition for creating of the plugin init target aliases
Make sure that plugin_init_target is not empty. It's empty when
creating qml plugins.

Amends 566b726b84

Pick-to: 6.7
Change-Id: If23998d50d8d31e20b3966730afb8b4b46b9990c
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-03-13 19:34:22 +00:00
Alexey Edelev 8db0a12e84 Collect CMAKE_MODULE_PATH from QT_ADDITIONAL_PACKAGES_PREFIX_PATH
This is sensitive for the 'include' calls that expect cmake scripts
to be found in some staging prefixes. In yocto
QT_ADDITIONAL_PACKAGES_PREFIX_PATH points to the package image
path(installation snapshot). If repo provides bundled 3rdparties
the 'include' statement that includes 'FindWrap<3rdparty>ConfigExtra'
is unnable to locate it, since it's expected to be found in Qt
installation, but the file didn't land there at ptest stage.

Fixes: QTBUG-122205
Pick-to: 6.5 6.6 6.7
Change-Id: Idd03f44efd2e3fdaa476873068c73ac28cd0a7b5
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-13 15:38:52 +01:00
Giuseppe D'Angelo 03baf08d2b QT_NO_AS_CONST: rename and add docs
Give it a name in line with the function name:
qAsConst -> QT_NO_QASCONST, as already done for qExchange.
We can do this because we never documented the macro itself.
So, while at it: also document the macro.

Change-Id: I6eb0834df438e4f4e818ef2cf8e702ed156dc253
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2024-03-13 13:08:29 +01:00
Alexandru Croitor 566b726b84 CMake: Create alias targets for plugin init targets
When building tests in-tree targeting iOS, we run
_qt_internal_finalize_executable via
qt_internal_add_test_finalizers.
This in turn calls __qt_internal_apply_plugin_imports_finalizer_mode
which tries to link to versioned plugin int targets.

Because the linked plugin init target is built in-tree as well, and
did not have versioned alias targets created, configuration fails
with:
 Target "tst_baseline_qsvgrenderer" links to:

    Qt6::QSvgIconPlugin_init
 but the target was not found.

Make sure to create versioned alias targets for the plugin init
targets.

Amends 6c9f4f5ebc

Pick-to: 6.7
Fixes: QTBUG-123186
Task-number: QTBUG-122181
Change-Id: I0048b724d465dc3c176d238d144feb072262d76e
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-03-12 21:51:42 +01:00
Alexey Edelev 173164cd47 "Simplify" versionless targets
Versionless targets in Qt6 are interface libraries that link the
versioned libraries using the INTERFACE link type. This makes the
linking chain more complicated than it can be. Also we miss some
significant interface properties in the versionless targets comparing
to the versioned targets.

The new approach manually generates the versionless targets, instead
of using CMake exports.

For CMake versions < 3.18 we now create a copy of the versioned
targets. The copy includes all the relevant INTERFACE properties from
the versioned targets and imported locations for all configs.

For CMake versions >= 3.18 we now create the versionless target ALIASes
which should behave give the transparent access to the versioned
targets.

Using the QT_USE_OLD_VERSION_LESS_TARGETS flag you may force the
behavor of the CMake versions <= 3.18

The change is partial workaround for QTBUG-86533.

Task-number: QTBUG-114706
Change-Id: Iafadf6154eb4912df0697648c031fcc1cbde04e0
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-12 20:27:42 +01:00
Joerg Bornemann b481393941 CMake: Add public helper _qt_internal_add_phony_target
This function can be used to create a custom target like
update_translations or all_qmllint that should be excluded from build
and be triggered by the user.

The function works around certain peculiarities of the Visual Studio
project generators that are described at length in QTBUG-115166 and
associated patches.

Follow-up patches in qttools and qtdeclarative will use this function
and remove duplicated code.

Task-number: QTBUG-115166
Task-number: QTBUG-118980
Change-Id: I87b89a658f35a5a09e3f7b04bdd5cae2166f8d62
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-12 12:38:57 +01:00
Lucie Gérard 0886035bcd Correct license for qbatchedtestrunner.in.cpp file
File is is part of the internal test infrastructure.
According to QUIP-18 [1], all test files should be
LicenseRef-Qt-Commercial OR GPL-3.0-only

[1]: https://contribute.qt-project.org/quips/18

Pick-to: 6.7
Task-number: QTBUG-121787
Change-Id: Ia5bc4e0abeea210ee501596330b2b63216e9e9c7
Reviewed-by: Kai Köhne <kai.koehne@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2024-03-12 12:38:56 +01:00
Alexandru Croitor dd052a0a01 CMake: Warn when examples are not added via qt_internal_add_example
To ensure examples can be built as ExternalProjects, the example
subdirectories need to be added via qt_internal_add_example rather
than just add_subdirectory.
qt_internal_add_example is also needed for correct installation of
example sources.

To catch examples that are still not added via
qt_internal_add_example, set a QT_WARN_ABOUT_EXAMPLE_ADD_SUBDIRECTORY
variable at the top of the examples/CMakeLists.txt directory scope
and show a warning in qt_add_executable whenever that variable is
TRUE.

Calls of qt_internal_add_example will set the variable to FALSE,
making sure the warning is not shown for properly added examples.

This is limited to developer builds and can be opted out of via the
QT_NO_WARN_ABOUT_EXAMPLE_ADD_SUBDIRECTORY_WARNING variable.

qt_add_executable is used as the 'hook' for showing the error, because
that is the most likely function to be used in examples.
We don't use qt_standard_project_setup in all projects yet, so we
don't want to use that one.

Task-number: QTBUG-90820
Task-number: QTBUG-123096
Change-Id: I7a0b0b2cc60c70903db03b56c06494c127a62420
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2024-03-11 13:48:23 +01:00
Alexandru Croitor 06fef6219e CMake: Adjust QT_ADDITIONAL_QML_PLUGIN_GLOB_PREFIXES for EP examples
Make sure to consider all qt_prefixes for adjusting
QT_ADDITIONAL_QML_PLUGIN_GLOB_PREFIXES with locations where qml plugin
config files might be present.

Task-number: QTBUG-90820
Task-number: QTBUG-96232
Change-Id: I5a7eec434635db1953871d735e2420c331ccee48
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2024-03-11 13:48:08 +01:00
Alexandru Croitor 40fa36db22 CMake: Allow specifying additional glob paths for QmlPlugins.cmake
Currently we hard-code to look for qml plugin Config.cmake files
in the current list dir, whether the Qt6Qml directory is.

This is not sufficient for finding qml plugins in a prefix build of a
repo that has not been installed yet.
For example qtquick3d plugins will be in
qtquick3d_build_dir/lib/cmake/Qt6Qml/QmlPlugins, which
won't be picked up by the Qt6Qml Config file in the installed Qt
location.

Allow specifying extra qml plugin glob prefixes via a new
QT_ADDITIONAL_QML_PLUGIN_GLOB_PREFIXES variable.
This is similar to QT_ADDITIONAL_PACKAGES_PREFIX_PATH.

Any path specified via QT_ADDITIONAL_QML_PLUGIN_GLOB_PREFIXES
will have the
 QmlPlugins/${INSTALL_CMAKE_NAMESPACE}*Config.cmake
glob appended to it, and then used for globbing files in that
location, after processing the main location wherever Qt6Qml is.

This will be used by ExternalProject example machinery.

Task-number: QTBUG-90820
Task-number: QTBUG-96232
Change-Id: I469863c965b8b13cf007c611976a64fbff6e9111
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2024-03-11 13:48:03 +01:00
Alexandru Croitor c668dd4044 CMake: Disable ExternalProject examples for -debug-and-release builds
Unfortunately when using CMake <= 3.27 together with
-debug-and-release, it's not possible to reliably build examples as
external projects due to clobbered files in the same build dir.

Disable building examples as EPs in such a case.

Task-number: QTBUG-90820
Task-number: QTBUG-96232
Change-Id: Icea9fdab47986c2608e1952a0bbae72365ac7a62
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-03-11 13:48:01 +01:00
Alexandru Croitor 31c5d50e84 CMake: Adjust CMAKE_MODULE_PATH for ExternalProject examples
When building EP examples for a repo that defines a bundled library,
we need to make sure the relevant FindWrapBundledFooConfigExtra.cmake
file is found when looking up dependencies.

For a prefix build, that file is placed in the build dir of the repo.
Use the list of qt_prefixes that includes the build dir of the repo,
append lib/cmake/Qt6 to it and pass that as additional values to
the CMAKE_MODULE_PATH variable of the external project.

Task-number: QTBUG-90820
Task-number: QTBUG-96232
Change-Id: I85d5f360380856fcfb8be7235b8365dcf15aa0c0
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-03-11 13:47:59 +01:00
Alexandru Croitor cc537d927b CMake: Fix syncqt IMPORTED_LOCATION path for multi-config builds
When building examples as ExternalProjects as part of a multi-config
qtbase build, syncqt can not be located with the following error:

CMake Error at Qt6CoreToolsAdditionalTargetInfo.cmake:10 (message):
   Unable to add configure time executable Qt6::syncqt
   qtbase/libexec/syncqt doesn't exist
Call Stack (most recent call first):
  qtbase/lib/cmake/Qt6CoreTools/Qt6CoreToolsConfig.cmake:44 (include)
  qtbase/cmake/QtPublicDependencyHelpers.cmake:65 (find_package)
  qtbase/lib/cmake/Qt6Core/Qt6CoreDependencies.cmake:34
      (_qt_internal_find_tool_dependencies)
  qtbase/lib/cmake/Qt6Core/Qt6CoreConfig.cmake:42 (include)
  qtbase/lib/cmake/Qt6/Qt6Config.cmake:165 (find_package)
  CMakeLists.txt:13 (find_package)

The Qt6CoreToolsAdditionalTargetInfo.cmake file is used both for
install(EXPORT) Config files as well as export(EXPORT) Config files,
and in the latter case, the path that syncqt is looked up in is not
correct because syncqt is not yet installed.

In addition to checking whether syncqt exists in the install path,
also check if it exists in the build dir.

Ideally the additional path would be stored in a separate file that
is not installed, but the current code infrastructure does not provide
such a feature. Because we store a relative path instead of an
absolute path, the build path does not leak, so the situation is
bearable.

Task-number: QTBUG-90820
Task-number: QTBUG-96232
Change-Id: I16ad5c280751e050bc9b039ebd38ec9a66a6554c
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-03-11 13:47:57 +01:00
Alexandru Croitor 20bd9fad1c CMake: Pass CMAKE_MODULE_PATH to external project examples
Some examples depend on FindWrapFoo.cmake scripts that are part of
a repo. An example is qtgrpc with FindWrapProtoc.cmake.

These need to be available when building external project examples in
a prefix build where the repo is not installed yet, and thus the
source dir FindWrap scripts need to be used instead.

Make sure to pass the value of CMAKE_MODULE_PATH to the external
projects to ensure these scripts are found. CMAKE_MODULE_PATH is
populated by qt_set_up_build_internals_paths as part of the
qt repo build.

Task-number: QTBUG-90820
Task-number: QTBUG-96232
Change-Id: I3e977919bc137ed60e8eb9300625e5d8b87b373e
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-03-11 13:47:55 +01:00
Alexandru Croitor 43d0c5ed6e CMake: Allow passing extra variables to external project examples
In some repos we need to be able to pass extra cache variables to find
3rd party packages when building examples as external projects.

Introduce QT_EXAMPLE_CMAKE_VARS_TO_PASS to allow passing vars like
OpenSSL_ROOT or Protobuf_ROOT if they are set in the repo project.

It should be noted that QT_EXAMPLE_CMAKE_VARS_TO_PASS expects a
special syntax for its values, of the from VAR_NAME:CMAKE_TYPE, due
to the pre-existing implementation on how we pass variables
to ExternalProject.

Task-number: QTBUG-90820
Task-number: QTBUG-96232
Change-Id: Ie3e74d4fde106f947d12e51d27e41a310157aab6
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-03-11 13:47:53 +01:00
Mitch Curtis d130886997 configure-cmake-mapping.md: add -qt-host-path and -DQT_HOST_PATH
Pick-to: 6.5 6.6 6.7
Change-Id: I6deb7b648c39adb8fb2765de5be29b0743ef2836
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-08 10:30:10 +08:00
Giuseppe D'Angelo 9069b7fb20 Realign columns in the configure-cmake-mapping
Change-Id: Ie7c3c35b6e5a8d02d05650b86f6c2d47b72c3835
Pick-to: 6.7 6.6 6.5
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-07 16:09:57 +01:00
Lucie Gérard bf1e76408e Change license for .in files
According to QUIP-18 [1], all build system files
should be BSD-3-Clause.
The files in this patch are part of the build system.

[1]: https://contribute.qt-project.org/quips/18

Pick-to: 6.7
Task-number: QTBUG-121787
Change-Id: Ibc6a60a9b009fab0c953e8e3269533c121e4511e
Reviewed-by: Kai Köhne <kai.koehne@qt.io>
2024-03-05 12:59:21 +01:00
Alexandru Croitor aacc31815d CMake: Fix assignment in internal_get_build_vars_for_external_projects
The check and variable name were incorrect after a refactoring.

Amends ba96238600

Pick-to: 6.6 6.7
Task-number: QTBUG-84884
Task-number: QTBUG-90820
Change-Id: I33b6b81695a6352c7869ef6186e00881b47bd6f3
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2024-03-05 12:59:21 +01:00
Alexandru Croitor 375f386930 CMake: Don't add default rpaths to qt qml plugins when requested
qt_add_qml_plugin has code to set a sensible install rpath for user
project qml plugins.

If Qt was configured without rpath support, we should not add any
rpaths to qt qml plugins:
- qt-computed rpaths added by qt_apply_rpaths
- user-project rpaths added by qt_add_qml_plugin

This is done by setting QT_NO_QML_PLUGIN_RPATH to TRUE as part of
QtSetup, effectively applying the option to any qml plugin that is
built by internal qt api.

User projects will still be able to use the default rpaths added
by qt_add_qml_plugin, even if qt itself was configured with no rpath
support.

Pick-to: 6.7
Fixes: QTBUG-122687
Change-Id: I8178b527553dd00436d0abb3b44061ea16edc121
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2024-03-05 12:59:21 +01:00
Joerg Bornemann 110f656da9 configure: Translate only boolean options to features
This amends commit be009c6857.

The configure option -no-opengl was mistakenly translated to the CMake
argument -DFEATURE_opengl=no. The command line option "opengl" however
is defined as
    qt_commandline_option(opengl
        TYPE optionalString
        VALUES no yes desktop es2 dynamic
    )
which is not boolean. And only boolean command-line options may
automagically control features of the same name. It just happens that
the values "no" and "yes" look boolean.

Setting FEATURE_opengl instead of INPUT_opengl broke feature conditions
that check the INPUT_opengl value.

Fix this by checking the type of the corresponding command line option
instead of guessing the type from the INPUT_* value.

An option (e.g. force-asserts) can be diverted to a differently named
input (e.g. force_asserts) with the NAME argument of
qt_commandline_option. In this case, we cannot deduce the option name
from the input's name. To handle this, we store the input's type in
commandline_input_${name}_type and read it when translating feature
values.

Fixes: QTBUG-122914
Change-Id: Ibb4b0633b6635bd2ef6f26ed8f4b19d239bf5854
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-05 12:59:21 +01:00
Samuli Piippo 762c56d65b CMake: add options to not generate target wrappers
The target wrappers for qmake and qtpaths do not work on Yocto
builds and only create confusion when they are available in target.
Add option to disable their generation.

Pick-to: 6.7
Task-number: QTBUG-122420
Change-Id: Ibb829cc846ad6c470fe29e746ade42fccaa33a6f
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-05 12:30:15 +02:00
Tor Arne Vestbø 5736e0b655 cmake: Allow silencing CMake generator warning from environment
Pick-to: 6.7 6.6 6.5
Change-Id: I13d3000121be39f204b4374118690fe27702dd12
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-03-04 20:31:47 +01:00
Morten Sørvig 6bf3f7ebdc wasm: remove DISABLE_EXCEPTION_CATCHING workaround
Qt no longer sets DISABLE_EXCEPTION_CATCHING and can
use the common logic here.

Task-number: QTBUG-121822
Change-Id: If02feafe9eeac49fa2861d2357b358a19e756438

Reviewed-by: Lorn Potter <lorn.potter@gmail.com>
2024-02-27 14:09:32 +01:00
Morten Sørvig d795dbc643 wasm: don't set DISABLE_EXCEPTION_CATCHING
This is on by default anyway (see Emscripten settings.js),
and setting it here interferes if exceptions are enabled
by other means.

Fixes: QTBUG-121822
Change-Id: I61d3f1960208e928a4144cff56a0b03c39087a34
Reviewed-by: Lorn Potter <lorn.potter@gmail.com>
2024-02-27 14:09:32 +01:00
Alexey Edelev 2c0120d35b Add the support for custom definitions to the qt_manual_moc function
The function now support two new arguments:
 - DEFINITIONS, which allows specifying the custom definitions
 - TARGETS, the list of targets thart will be used to collect
   the [INTERFACE_]INCLUDE_DIRECTORIES and COMPILE_DEFINITIONS.

Task-number: QTBUG-104898
Change-Id: I3f67537057f91a97597788f1bd4db6904bac6d9c
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-23 20:41:30 +01:00
Alexey Edelev 7ac969e146 Wrap condition in _qt_internal_check_depfile_support with parentheses
The AND/OR combinations are not evaluated correctly. Wrap them with
parentheses explicitly to ensure the expected evaluation order.

Pick-to: 6.5 6.6 6.7
Change-Id: Ib2515ba85417b32cef3f799e0cb2c89d2c4257ab
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-22 16:08:32 +01:00
Joerg Bornemann b387a6cd8a CMake: Rename I18N_*LANGUAGES variables and parameters
...according to the Qt 6.7 CMake API review.

Pick-to: 6.7
Task-number: QTBUG-122396
Change-Id: I42012e346325ff05d63fa4dac44276eef15320fe
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-21 18:21:41 +01:00
André Klitzing f926ccbf64 Add newline after import
This avoids -Wnewline-eof for clang compilers.

error: no newline at end of file [-Werror,-Wnewline-eof]
    Q_IMPORT_PLUGIN(Governikus_AnimationsPlugin)

Pick-to: 6.7 6.6 6.5
Change-Id: I8de21f1f27cd177211ebf70fac0e01292cfa410c
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-21 18:21:41 +01:00
Alexandru Croitor 3334a77ecf CMake: Teach qt_config_compile_test to set the build output
The qt_config_compile_test command now assigns the build output of a
config test to the TEST_${name}_OUTPUT variable in the callers scope.

We can use this to show error messages, and it can also be seen in
trace files for better troubleshooting.

It works for all project based calls with CMake 3.16, but for source
code based tests, due to the usage of check_cxx_source_compiles instead
of try_compile, it will only work for CMake 3.23+.

Pick-to: 6.5 6.6 6.7
Task-number: QTBUG-122596
Change-Id: Ib9664c158ba9a391bd17bf30a28f9a34eba991d5
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-02-21 18:21:41 +01:00
Lorn Potter 87738e8b81 wasm: update Emscripten to 3.1.50
Pick-to: 6.7
Change-Id: Id147a927420a1743ef1cfd952b36e90ac0c319dd
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
2024-02-21 12:30:01 +00:00
Alexandru Croitor 573778de60 CMake: Introduce a CMake coding style document
Better to have something, than nothing at all.

Mention it in the cmake readme.

Task-number: QTBUG-120225
Change-Id: Ieffeeaac714b89d5d8b5a8b0c51abf3fe8e0a6c6
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-02-19 16:41:47 +01:00
Alexey Edelev 1c287cea29 Force linking against versioned libraries when building Qt artifacts
Replace Qt:: namespace with Qt6:: namespace in target_link_libraries
for the Qt modules/plugins/libraries.

Fixes: QTBUG-114706
Change-Id: Idfd0917dbe1a6a266bc4e9d5f465e550788b5aaf
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-19 15:24:07 +01:00
Alexey Edelev 02e516281b Fix framework headers copying when module don't have header files
Amends 103eca1070

Change-Id: I3caae60c022cd46a6d33691760b619920d6e778e
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-15 14:04:44 +01:00
Alexey Edelev 7c9efdf40c Add configure mappings for QT_BUILD_<TESTS|EXAMPLES>_PROJECT
Pick-to: 6.7
Change-Id: I1e9f877c4c9b6257f4f90e3361d5a0226e62e841
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-14 20:47:29 +00:00
Alexey Edelev 103eca1070 Change the mechanism that copies framework header files
Split the header copy custom commands into two blocks and add
<module>_sync_headers_fw_copy target that is responsible for the copy
of CaMeL-case header aliases. For the Ninja generator we leave the
file-level dependencies between the <module>_sync_headers_fw_copy
target and header copy commands. For the Unix Makefiles generator we
put the command directly to the target to make sure it's executed by
make.

Also add the explicit commands for creating the output header
directories.

Fixes: QTBUG-122200
Pick-to: 6.5 6.6 6.7
Change-Id: I71ba716d17a879f20ae0869cf2257d246ac17eff
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-14 10:47:41 +01:00
Alexey Edelev 0b79ee6d3b Make possible partial tool lookup when using QT_HOST_PATH
Consider QT_HOST_PATH when setting the QT_WILL_BUILD_TOOLS flag.
In this case if we do not crosscompile or require building tools
aka QT_FORCE_BUILD_TOOLS=ON, we may by pass tool_FOUND check and
assume that we will try building the missing tool.
Set qt_require_find_tools GLOBAL property to indicate the tools
lookup requirement.

For tools that can be found we will try re-using them from
QT_HOST_PATH, but not building from scratch.

Change-Id: I94e92f62eb799308e38721b4d580052bb4bb35f9
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-14 10:47:40 +01:00
Kai Köhne 6ea922b584 Remove year from generic Qt copyright information
While at it, also add the missing dot in Ltd. (as
it's an abbreviation). Also, prefer https:// over
http://.

Fixes: QTBUG-121906
Task-number: QTBUG-121928
Pick-to: 6.7 6.6
Change-Id: I4e1f1563376ae36b3c260359d830f00969ab9351
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2024-02-14 09:30:07 +00:00
Tor Arne Vestbø 9b940cfc3b Bump iOS minimum deployment target to iOS 16
According to https://developer.apple.com/support/app-store/ iOS 16
and 17 together cover 89% of devices that transacted on the App Store
on February 4, 2024. And by the time Qt 6.8 is ready, iOS 18
will likely be out or close to being released.

Change-Id: Ice853d0136ee4c697d61add68a996548ac44a0ce
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-14 04:17:16 +01:00
Tor Arne Vestbø 9cca899574 cmake: Generate Apple privacy manifest files for Qt modules
The default manifest is a minimal file that claims NSPrivacyTracking
false, along with an empty list of NSPrivacyTrackingDomains and
NSPrivacyCollectedDataTypes, as Qt does not generally do user tracking.

Modules can override the default manifest by setting the
PRIVACY_MANIFEST target property, specifying a custom privacy
manifest.

The NSPrivacyAccessedAPITypes key is only required for iOS for now.
Even though we don't build Qt for iOS as frameworks yet, which is
required to embed a privacy manifest, we include the keys for the
APIs we known we use.

Task-number: QTBUG-114319
Change-Id: I654bb52b98ee963adeeb744b35f3a1c2a1270969
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-13 21:53:34 +01:00
Even Oscar Andersen 5c05f5cd7f wasm: Make sure emrun.bat is used when running autotests on windows
The test system tried to run emrun (No .bat). This failed with a
file-not-found error on windows.

Also there was a test for (WIN32) when deciding to use cmd /c.
This test has been updated to (CMAKE_HOST_WIN32)

Also the aforementioned cmd /c was not present in the test run
output. It has been added.

Fixes: QTBUG-121996
Change-Id: Ib3c053949865038ad43abd479402f5e8e3c015ac
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
Reviewed-by: Piotr Wierciński <piotr.wiercinski@qt.io>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2024-02-13 20:53:33 +00:00
Joerg Bornemann 53eb8dd06d CMake: Simplify feature calculation
Since configure doesn't translate -feature-foo to INPUT_foo=ON anymore,
we can remove the code that tries to calculate the feature value from
INPUT_foo.

Task-number: QTBUG-120529
Change-Id: I4829bb634ca8c3f08b489469532b65541d76fa70
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-13 20:11:21 +01:00
Joerg Bornemann 55d81b3eff CMake: Remove qt_internal_compute_features_from_possible_inputs
This function calculated the values of the features 'no-prefix' and
'developer-build' from INPUT_* values. Since configure directly
translates -no-prefix and -developer-build to FEATURE_no_prefix and
FEATURE_developer_build, we can remove the function.

Task-number: QTBUG-120529
Change-Id: Ide1fa61af175d8f6a6aa6363dfdfa94912836345
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-13 20:11:21 +01:00
Joerg Bornemann be009c6857 configure: translate inputs matching feature names to FEATURE_foo
Inputs (in the sense of configure commandline options) are now
translated to -DFEATURE_foo=ON/OFF if the input name matches a feature
name. This is going to replace more complicated logic in our feature
evaluation.

Task-number: QTBUG-120529
Change-Id: I3ef45cd0e0a1462c53543cd2152eaf7f94318d9d
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-02-13 20:11:21 +01:00
Joerg Bornemann 037439ad4b configure: Set -DFEATURE_stdlib_libcpp on "-platform *-libc++"
Directly set the feature variable instead of the INPUT_* variable.
The magic translation from INPUT_* to FEATURE_* is removed in a
subsequent commit.

Change-Id: I8156a20e9af6883783c9a7fa6b4f591d7a2f587c
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-02-13 20:11:21 +01:00
Joerg Bornemann faa06fc6f5 configure: Convert -feature-* arguments to -DFEATURE_foo CMake args
We now convert the configure arguments -feature-foo and -no-feature-foo
to the CMake arguments -DFEATURE_foo=ON and -DFEATURE_foo=OFF. This is
done, because the former behavior was surprising, and it allows us to
remove quite some code that was needed to calculate feature values from
INPUT_foo and FEATURE_foo.

Task-number: QTBUG-120529
Change-Id: I94f8eb4adbbcaa1090aedce6e711012781c62a3c
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-02-13 20:11:21 +01:00
Alexey Edelev 3d4a5c513a Fix the namespaceless target condition in __qt_internal_walk_libs
Access the target name value, but not use the variable name in
when checking the target existence.

Pick-to: 6.2 6.5 6.6 6.7
Change-Id: I0f86e3c7665d9c028bf4cbdc5aa8fb840fe1d542
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2024-02-13 15:58:43 +01:00
Alexey Edelev 721641d38c Add the missing versioned alias for the GlobalConfigPrivate target
The build tree versioned alias is missing for the GlobalConfigPrivate
target.

Change-Id: I42e9f63363be472e661b656f665e29ea894b7e33
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-12 10:29:03 +01:00
Alexey Edelev d2f7015184 Introduce NO_GENERATE_CPP_EXPORTS argument for qt_internal_add_module
The argument is inverted GENERATE_CPP_EXPORTS argument. Use it
explicitly for the modules that do not require the autogenerated cpp
exports.

Task-number: QTBUG-90492
Change-Id: Ic67772ba9ed5e40f132a97e7d6844102ad023ff3
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-09 23:00:04 +01:00
Tim Blechmann 25b89f2c88 cmake: build repo helpers - fine-grained test/example options
the tests/examples could only be enabled globally. when working on a
specific repo, it's beneficial to disable tests/examples for other
projects to reduce project sizes (and cmake configure/generate times)

Change-Id: I0026ba87b667d427043cc8eb1baa6c28b2046dd7
Pick-to: 6.7
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-08 23:30:29 +08:00
Tim Blechmann 27383285a1 cmake: improve documentation of NO_PCH_SOURCES
Add the reference to unity builds in the documentation of
NO_PCH_SOURCES to fully describe the semantics.

Change-Id: Icfd3ee401efa154da4b8ed9a307d29f2605d948a
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
2024-02-08 10:12:09 +00:00
Alexey Edelev 4370532500 Add sanity check for QT_NAMESPACE validness
It looks like we don't even support nested namespace(RCC namespace
mangling fails). Assuming that QT_NAMESPACE should be
the valid C/C++ indentifier.

Change-Id: I5c2073c21964eb96abb3e894d83e1df65f7730b4
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-07 00:31:38 +01:00
Alexey Edelev 1fb225db13 Improve the QT_NAMESPACE definition in Qt6CoreExtras
The perivous version generated weird condition, and seems changing
the QT_NAMESPACE after qtbase configuration is noop, we may replace
the generated condition with the conditional generation.

Change-Id: Ifa09dba4db00099a07da2cff5505e6fd0b008289
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-07 00:31:38 +01:00
Alexey Edelev 75d83d5a65 Add plugins of imported QtModules to the _qt_plugins property
This covers the following use case:
QtModuleX is pre-built and installed, it's imported. The plugin has
a PLUGIN_TYPE that is associated with QtModuleX and is built with
application that links QtModuleX. When deploying the application
it's expected that the plugin is deployed, as the one that belongs
to the linked QtModuleX.

This ensures that we udpate the internal _qt_plugins property that
is used in the __qt_internal_collect_plugin_targets_from_dependencies
function.

Pick-to: 6.5 6.6 6.7
Change-Id: I9824351ebab5a24509800da4db69f1e282a35884
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-02-06 20:23:18 +01:00
Alexandru Croitor cec2e42052 CMake: Fix configuring a standalone test on Apple platforms
Configuring a test as standalone would fail with the following error:
 Invalid max SDK version: It should be a major version number,
 without minor

This happened because _qt_internal_check_apple_sdk_and_xcode_versions
expects QT_SUPPORTED_MAX_MACOS_SDK_VERSION to be available, but it is
not yet set due to Qt6 package not being found yet.

Avoid the issue by exporting the version requirements into both
Qt6ConfigExtras.cmake and Qt6BuildInternalsConfigExtra.cmake.

Make sure to assign the variables only once.

Amends a29bff3d80
Amends a0bdd2195f

Pick-to: 6.6 6.7
Task-number: QTBUG-119490
Change-Id: Ic297eeaabf22c8c42ded1a766906f88fdb91fd3d
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2024-02-02 17:53:56 +01:00
Elias Toivola 79363ed6c8 Bump macOS minimum deployment target to 12 (Monterey)
macOS 11 is at its end-of-life and no longer supported by Apple. It
should be dropped from dev (Qt 6.8).

Task-number: QTQAINFRA-6009
Change-Id: Ib5fc5adbc13eb08e4603b226b9d7748417765b15
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2024-02-01 01:50:35 +02:00
Alexey Edelev 161c2f9544 Add the the implicit promotion to global for Qt platform targets
Bundled 3rdparty libraries link Qt platform targets implicitly, which
lead to the dependency resolution when the library is used by another
targets. For qtbase this works just fine since all platform targets
are not imported and they are used from a build tree. But in case if
3rdparty library is built as part of Qt repo different from qtbase
platform targets are imported and trigger the global promotion in
CMake. Usually qt_find_package for the 3rdparty libraries is called
somewhere in src/... directory and since Qt::Platform* targets are
already created in the top-level repo CMakeLists.txt by the
find_package(Qt ...) call, this leads to an error.

The propsed fix forces the global promotion of Qt platform targets
as soon as they created by the one of the initial find_package(Qt ...)
calls.

Change-Id: Iceb53f9ecccbdc438f9bc3bcc836583cfd4de535
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2024-01-31 19:20:06 +01:00
Alexey Edelev 180afc7321 Change the way we detect the need of adding Qt<Module>Plugins.cmake
Currently we assume that only modules that have plugins built in the
current build tree need to generate and install the
Qt<Module>Plugins.cmake file. This approach is weak since other Qt
modules might still want to provide the plugins of the certain types,
even if the module that the plugin type belongs too didn't have plugins
initially.

The fix unblocks the formally 3rd-party plugin installation and loading
chain.

Pick-to: 6.2 6.5 6.6 6.7
Fixes: QAA-2266
Change-Id: Ifc616e26a00674371c8e2fe2ca12237d153e5707
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-01-31 19:20:06 +01:00
Alexandru Croitor 49902cc6ce CMake: Simplify default CMAKE_BUILD_TYPE logic
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 48841c34d2
Amends 8c912cddeb

Pick-to: 6.7
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>
2024-01-26 14:51:35 +01:00
Alexandru Croitor 9932f2dd47 CMake: Warn about unsupported generator for all qt submodules
Previously we only warned about unsupported cmake generators when
configuring qtbase.
Now we do it for other submodules as well.

Pick-to: 6.7 6.6 6.5
Task-number: QTBUG-120602
Change-Id: I9d78db546bcf1238604362b248d41d4516b60b2a
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-01-25 17:57:56 +01:00
Venugopal Shivashankar 5f6f4903a6 CMake: Enable overriding the QT_INSTALL_DOCS environment variable
The QT_INSTALL_DOCS is configured with incorrect path sometimes,
especially while configuring qtbase with QT_HOST_PATH,
which also lets you build documentation for the essential modules
such as QtCore, QtGui, and so on. If the default QT_INSTALL_DOCS
path is wrong, a way to override the path would enable building
documentation for the essential modules without having to build
parts of qtbase.

Change-Id: I686e0bc103f9722aa98f3c02d2a5af9e645cc9d9
Done-with: Topi Reinio <topi.reinio@qt.io>
Task-number: QTBUG-121459
Pick-to: 6.7
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-01-24 19:01:29 +00:00
Venugopal Shivashankar c024af0d12 CMake: Accept additional arguments for qt_internal_add_docs
The current implementation of the API accepts only two
arguments, {target} and {qdocconf}. It passes a few
environment variables to build targets, providing info.
about the Qt version being used. QT_INSTALL_DOCS is one
of these environment variables, and it is the install
path for all the Qt module/addon documentation sets.
QT_INSTALL_DOCS is also the path where the global QDoc
configuration files are available.

If a project uses the qt_internal_add_docs to create
the build targets for the documentation, and the Qt
version used to configure the project is a pkg installed
using the qt-online-installer, the QT_INSTALL_DOCS path
is always wrong. Such projects should either maintain a
CMake setup for documentation or configure and
build Qt from source with the correct QT_INSTALL_DOCS
path, which is then passed to qdoc.

This change enables passing additional indexdir
and other arguments to QDoc, which is useful. For example,
if QDoc cannot find all the cross-module link targets,
you could either pass extra indexdir argument to resolve
the links or turn off the link errors.

For example, if your qdocconf has the following depends
entry to enble linking to other modules:

    depends += qtcore qtmultimedia

And the documentation for these modules are not part
of the Qt installation used to build the projects, you
could pass additional index dirs to enable cross-module
linking.

    qt_internal_add_docs{target_name qdocconf
                         INDEX_DIRECTORIES /absolute/path/Qt6/Docs /one/more/Qt6/Docs /another/Qt6/Docs)

Change-Id: Ieac271ddf92990d722602487c41af7f18546d096
Done-with: Topi Reinio <topi.reinio@qt.io>
Task-number: QTBUG-121457
Pick-to: 6.7
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-01-24 19:01:29 +00:00
Alexandru Croitor 081e50d768 CMake: Fix unity build for qtgraphs
qtgraphs defines a target in one directory, and then calls
qt_internal_extend_target with NO_UNITY_BUILD_SOURCES in another
subdirectory scope. That in turn calls set_source_files_properties
but only for the latter subdirectory, and not the main target
directory.

Because CMake has per-directory-scope source file properties, the
'no unity sources' option was effectively ignored.

When using CMake 3.18, make sure to specify the TARGET_DIRECTORY
option so that the source file properties are added to the scope of
the defining target.

Pick-to: 6.5 6.6 6.7
Change-Id: I4190d4073a2955aa7053b5faaaa57f683bc768a2
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2024-01-23 19:08:23 +01:00
Alexey Edelev 868e91474c Cut off the IMPORTED targets from the sync header dependencies
IMPORTED targets obviously have nothing to sync. So we should ignore
them when collecting dependencies for header sync.

Pick-to: 6.5 6.6 6.7
Change-Id: Ief68ff5eb2eb13a3fe1608445e8f5e6abb5971b4
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2024-01-23 14:30:50 +01:00
Alexandru Croitor 5b5fa7b75a CMake: Fix sqldrivers project to allow building as Debug MSVC config
When the user:
- has a non-developer-build -debug-and-release Qt
- and tries to configure the sqldrivers project with
  -DCMAKE_BUILD_TYPE=Debug
our build system discarded the user request, and defaulted to
'Release'.

That happens because CMake sets CMAKE_BUILD_TYPE_INIT to 'Debug' by
default on Windows-MSVC, and we have no marker to differentiate
that the 'Debug' value was user-specified.

We have such a marker
- via the
  __qt_auto_detect_cmake_build_type_before_project_call variable
  when configuring qtbase / top-level qt
- via the
  __qt_toolchain_cmake_build_type_before_project_call variable when
  configuring via the qt toolchain file (although that doesn't apply
  when configuring a multi-config build for obscure reasons, which
  should be addressed).

A conservative fix is to add a new variable / marker called
__qt_internal_standalone_project_cmake_build_type_before_project_call
which the 'sqldrivers' project will set with the build type that is
detected before the first project() call, and use that to decide
whether to override the build type, similar how we do with toolchain
file variable.

We could reuse one of the previous variables, but I figured it's better
to be explicit with a new one. And hopefully we can clean up the whole
logic in a follow-up commit.

Amends 48841c34d2
Amends 8c912cddeb

Pick-to: 6.5 6.6 6.7
Fixes: QTBUG-120436
Task-number: QTBUG-114958
Change-Id: I37e3d8041088fe6084a9976ecc80ddd62d73ef81
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-01-23 14:26:21 +01:00
Alexey Edelev 6ce6ff1c52 Force CMake to look for static versions of xcb components
Add the USE_XCB_<component>_STATIC switches that force using the
static versions of xcb components if necessary.

The xcb components needs to be built with -fPIC option, to make the
static linking possible.

When Qt is built staticaly USE_XCB_<component>_STATIC needs to be
passed to the application command line, since in static case xcb
libraries are resolved and linked when configuring application, but
not when building Qt.

Pick-to: 6.7 6.6 6.5
Task-number: QTBUG-120769
Change-Id: I274e9cf4a6a111dc87ad84bb7f49cad76a3d364a
Reviewed-by: Liang Qi <liang.qi@qt.io>
2024-01-19 20:44:59 +00:00
Alexey Edelev f3305ae07c Remove the deprecated GENERATE_PRIVATE_CPP_EXPORTS argument
Remove the deprecated GENERATE_PRIVATE_CPP_EXPORTS argument from
qt_internal_add_module.

Task-number: QTBUG-117983
Change-Id: I52e6210e10a6b6207ec2a7709484eae4002d6dcd
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2024-01-17 20:30:36 +01:00
Alexey Edelev bd31014031 Avoid generating private cpp exports
Ignore GENERATE_PRIVATE_CPP_EXPORTS argument of qt_internal_add_module.

Task-number: QTBUG-117983
Change-Id: I03a443cb575628f3225b944316507a033d262894
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2024-01-17 20:30:36 +01:00
Alexey Edelev 02a556674f Allow configuring the qtbase documentation-only build
Use the QT_SUPERBUILD procedure when configuring the qtbase
documentation-only build. This only makes sense for qtbase since we
disallow building it using existing Qt installation. Other repositories
should be configured using qt-configure-module script from the existing
Qt installation and simply run 'ninja docs'.

Fixes: QTBUG-120485
Pick-to: 6.7 6.6 6.5
Change-Id: Iafed5c17bea5c61edc239f08045922497215fb73
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2024-01-17 17:44:24 +01:00