aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qbsprojectmanager/qbsinstallstep.cpp
Commit message (Collapse)AuthorAgeFilesLines
* QbsBuildStep: Remove qbsBuildOptionsChanged() signalJarek Kobus2023-07-311-6/+1
| | | | | | | | It is never emitted. Change-Id: Ib0650a2139213a117796ebbfaf8e596752b14f6b Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* QbsInstallStep: Remove stepData() from the public APIJarek Kobus2023-07-311-14/+9
| | | | | | | | Inline it instead, as it's used only once. Change-Id: I4b8882334640493fed66504799d7cdfe367be1d9 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
* QbsInstallStep: Reuse installRoot()Jarek Kobus2023-07-311-3/+1
| | | | | | Change-Id: I3f563ea4a452b72c3a4eac478560ce65a0712713 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* BuildStep: Some cleanupJarek Kobus2023-07-271-2/+0
| | | | | | | | | | | | | | | Remove unused BuildStep API. Remove outdated docs. Cleanup includes. Don't repeat custom cancel messages from build/deploy steps, as in case of cancel action the follow-up message: "Canceled build/deployment." always appears anyway. Change-Id: I50b31e0cc688ee66d76a3a1dbe58eb72702112ad Reviewed-by: hjk <hjk@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
* QbsBuildStep: Employ task tree for runningJarek Kobus2023-07-251-0/+2
| | | | | | | | Task-number: QTCREATORBUG-29168 Change-Id: I508b7951f53f25f7cfd3e7f7e80086281cc7168e Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* QbsInstallStep: Employ task tree for runningJarek Kobus2023-07-241-70/+35
| | | | | | | Task-number: QTCREATORBUG-29168 Change-Id: I0fa0face3bcc567b8e29db2b23b2a48364252fed Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* Qbs: Use aspects in QbsInstallStep more directlyhjk2023-07-141-30/+18
| | | | | Change-Id: I5fca944d8c2c93e0f7249cc9c0532f66e5b9b33c Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
* Utils: Remove LabelPlacement::AtCheckBoxWithoutDummyLabelhjk2023-05-241-1/+1
| | | | | | | | | | This is identical in remaining functionality to AtCheckBox after the recent layout builder changes (or rather, can be adjusted on the layouting side by having appropriate empty cells) Task-number: QTCREATORBUG-29167 Change-Id: Ic357de6fb756acb5926afe1fd361ee4b18b17afd Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
* LayoutBuilder: Reworkhjk2023-05-031-9/+6
| | | | | | | | | | | | | | | Everying is a LayoutItem now, and everything is split into a proper setup and execution phase. Execution happens only via LayoutBuilder (directly or via convenience wrappers in LayoutItem). No direct access to the widget in creation, funnel out is via the new bindTo() facility. Change-Id: I7eb38fd736ae57a68f9a72a6add5c767da82b49f Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
* Utils: Remove one LayoutBuilder::addRow() overloadhjk2023-04-251-1/+1
| | | | | | | | | | The flexibility here is getting in the way later when trying to remove the dependency on aspects. Change-Id: I7221e80f2067292c7c80aead8f6d739fb7878f7e Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Eike Ziller <eike.ziller@qt.io>
* Qbs: Return FilePath from QbsInstallStep::installRoot()hjk2023-03-271-5/+5
| | | | | | Change-Id: Ie4943ec3dfd760a37b9d85c65095ae0d6cad7fe1 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Christian Stenger <christian.stenger@qt.io>
* Remove GPL-3.0+ from license identifiersKai Köhne2023-01-061-1/+1
| | | | | | | | | | | | | | | Since we also license under GPL-3.0 WITH Qt-GPL-exception-1.0, this applies only to a hypothetical newer version of GPL, that doesn't exist yet. If such a version emerges, we can still decide to relicense... While at it, replace (deprecated) GPL-3.0 with more explicit GPL-3.0-only Change was done by running find . -type f -exec perl -pi -e "s/LicenseRef-Qt-Commercial OR GPL-3.0\+ OR GPL-3.0 WITH Qt-GPL-exception-1.0/LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0/g" {} \; Change-Id: I5097e6ce8d10233993ee30d7e25120e2659eb10b Reviewed-by: Eike Ziller <eike.ziller@qt.io>
* QbsProjectManager: Convert to using Tr::trAlessandro Portale2022-09-061-10/+11
| | | | | Change-Id: I7a369ee5fd3dcdd7dcf669704d4966eca4578fa2 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
* Use SPDX license identifiersLucie Gérard2022-08-261-24/+2
| | | | | | | | | Replace the current license disclaimer in files by a SPDX-License-Identifier. Task-number: QTBUG-67283 Change-Id: I708fd1f9f2b73d60f57cc3568646929117825813 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
* Utils: Avoid intermediate widgets when using LayoutBuilderhjk2021-03-161-1/+2
| | | | | | | | | | | | In most cases, the layout constructed in the builder was set on a widget which in turn was put into a vbox in the actual widget. This is not necessary, but needs some re-ordering. Also make sure that using not-yet-parented widgets during layout construction does not cause visible artifacts. Change-Id: I75727a571da093d3131ea6fba467c2c646cdb6f1 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
* ProjectExplorer: Remove BuildStepConfigWidgethjk2020-10-061-2/+2
| | | | | | | After the previous changes it was only an empty wrapper around QWidget. Change-Id: I58dcd82d8342c7de5e2df537044f6cf3de878a67 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* ProjectExplorer: Move BuildStepWidget::summary etc to BuildStephjk2020-10-051-2/+1
| | | | | | | | | | | | | The step is the source of information anyway, and available at the only place of use. No need to copy that over to the widget, neither for keeping it up-to-date there when the mechanism is already available in the step itself. This creates quite some potential for the simplification of the various createConfigWidget implementations in follow-up patches. Change-Id: I4474665f194a1ff7c5792ad086ed53c8d3ce13e6 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* Utils: Consolidate LayoutBuilder interface a bithjk2020-09-241-6/+3
| | | | | | | | | | | | | - the var args template for addItems was overkill creating a lot of instantiations. Use a temporary list instead. - allow default constructed LayoutItems to be used for an empty cell, avoiding the use of a QLabel with empty text - add an addRow({...}) overload as convenience shortcut for .startNewRow().addItems({...} - rename startNewRow() to finishRow() Change-Id: I6d49dacbac3d7acf140ca526884ba1ceeeca2e0d Reviewed-by: Eike Ziller <eike.ziller@qt.io>
* Utils/ProjectExplorer: Move re-usabled bits of aspects to Utilshjk2020-09-231-0/+2
| | | | | | | | | | | Classes involved are BaseAspect and some derived classes, LayoutBuilder and VariableChooser. This is mostly mechanical, with various include/using changes to make it compile. Change-Id: I624a457f3555f102e541c4c71e33a9423af32250 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
* Merge remote-tracking branch 'origin/4.13' into masterEike Ziller2020-08-311-5/+5
|\ | | | | | | | | | | | | | | | | | | | | | | Conflicts: cmake/QtCreatorIDEBranding.cmake qbs/modules/qtc/qtc.qbs qtcreator_ide_branding.pri src/plugins/clangtools/virtualfilesystemoverlay.h src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildstepconfigwidget.ui src/plugins/qmldesigner/designercore/model/abstractview.cpp Change-Id: I5013bd8fdd28d79cdea74380bec01d4c106adfaf
| * QbsProjectManager: Fix install stepChristian Kandeler2020-08-271-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | We got the install command name wrong, which caused the installation to fail. In addition, we forgot to add handling for the "protocol-error" message from qbs, so the step was hanging, rather than aborting. Finally, we triggered a number of assertions in BuildStep::buildConfiguration(). This went all unnoticed for a while, because the install step is not enabled by default these days. Change-Id: I906e7e472563d4ad8fc7557bd706a7cb67f9f2ba Reviewed-by: hjk <hjk@qt.io>
| * Fix qmake build of unittestsChristian Stenger2020-08-271-1/+1
| | | | | | | | | | | | | | | | | | This basically continues / amends work done with e1c88116b3. Change-Id: Ia8b3a4694e7fea4c15e344839f87c11fbe8fbbf4 Reviewed-by: hjk <hjk@qt.io> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* | Qbs: Continue QbsInstallStep aspectificationhjk2020-08-251-40/+25
| | | | | | | | | | | | | | Special QbsInstallStepWidget can be dropped. Change-Id: I9040bbaa59c9da201c66a60a6ce9285cd53cf607 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* | Qbs: Start using aspects for some bool items in install stephjk2020-08-181-167/+68
|/ | | | | Change-Id: If5e702ba6cf9727fe209c96988701d76f373a78d Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* Merge output formatters and output parsersChristian Kandeler2020-04-231-2/+1
| | | | | | | | | | | | | | | | | | | | | | | Now only one piece of code needs to be written to both linkify output in an output pane and create tasks for it in the issues pane. The calling sites are also simplified. For instance, until now, build steps had to feed their output parsers manually and then push the created tasks up the signal stack in parallel with the actual output, which the build manager relied upon for cross-linking the output pane content. Afterwards, the output would get forwarded to the formatter (and parsed for ANSI escape codes a second time). In contrast, a build step now just forwards the process output, and task parsing as well as output formatting is done centrally further up the stack. Concrete user-visible improvements so far: - File paths in compiler/linker messages are clickable links now. - QtTest applications now create clickable links also when run as part of a build step, not just in the app output pane. Task-number: QTCREATORBUG-22665 Change-Id: Ic9fb95b2d97f2520ab3ec653315e9219466ec08d Reviewed-by: Christian Kandeler <christian.kandeler@qt.io> Reviewed-by: hjk <hjk@qt.io> Reviewed-by: Christian Stenger <christian.stenger@qt.io>
* Merge remote-tracking branch 'origin/4.12'Eike Ziller2020-02-261-2/+1
|\ | | | | | | Change-Id: I3e7049da2c3da6f784e3cb3407c22ada556e5d24
| * Qbs: Use more sensible build step summariesChristian Kandeler2020-02-201-2/+1
| | | | | | | | | | | | | | | | It makes no sense to use the "equivalent command line" value as the step summary. It's much too long and will never fit into that label. Change-Id: I55f291c370c97481d37e9f9ba9baec48d7215774 Reviewed-by: hjk <hjk@qt.io>
* | ProjectExplorer: Introduce some BuildStep convenience accessorshjk2020-02-191-1/+1
|/ | | | | | | ... and use in ProcessStep and related classes. Change-Id: Ie6f1403d0aa2b9f5bcde06e994809466700b1357 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* Qbs: Avoid a FilePath<->QString roundtrip in QbsInstallStephjk2020-02-141-4/+4
| | | | | Change-Id: I8366fc694ba899bf74e0fea8e85aa99e709a57b4 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* Qbs: Pass related info directly to command line creation functionhjk2020-02-141-1/+16
| | | | | | | Saves a few casts and otherwise unneeded accessors. Change-Id: I7a6ff1e8348a24690f35e69d300463a6c5c18867 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* ProjectManager: Add convenience Task subclasseshjk2020-01-201-3/+1
| | | | | | | | For Compile, BuildSystem and Deployment. Unclutters user code and reduces binary size. Change-Id: Ia18e917bb411754162e9f4ec6056d752a020bb50 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* ProjectExplorer: Pass Id to BuildStep constructorhjk2020-01-091-2/+2
| | | | | | | | Allows to use constants in fewer places, similar to what e.g. RunConfiguration does. Change-Id: I9d049128206c4acf0ce14b06b66d6c090a7c5242 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* QbsProjectManager: Switch to an out-of-process approachChristian Kandeler2019-11-211-70/+41
| | | | | | | | | | | | | | | | That is, do not link to the qbscore library anymore. Instead, use the JSON-based API. Advantages: - We can build Qt Creator with qbs support without qbs being present on the build machine. - Smaller memory footprint for Qt Creator, as the qbs build graphs are now being managed by a separate process. - Potential crashes in qbs will not kill the Qt Creator process. Fixes: QTCREATORBUG-20622 Task-number: QTCREATORBUG-22904 Change-Id: If7d344b0ac65a99ff0a3a3db215d61b8d903e47e Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
* ProjectExplorer: Move BuildSystem owership to BuildConfigurationhjk2019-11-191-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | ... or Target. This patch moves build system from conceptually "one per project" to "one per target (i.e. per project-and-kit)" or "per BuildConfigurations" for targets where the builds differ significantly. Building requires usually items from the kit (Qt version, compiler, ...) so a target-agnostic build is practically almost always wrong. Moving the build system to the target also has the potential to solve issues caused by switching targets while parsing, that used Project::activeTarget() regularly, with potentially different results before and after the switch. This patch might create performance/size regressions when several targets are set up per project as the build system implementation's internal data are duplicated in this case. The idea is to fix that by sharing per-project pieces again in the project implementation once these problems occur. Change-Id: I87f640ce418b93175b5029124eaa55f3b8721dca Reviewed-by: Christian Stenger <christian.stenger@qt.io> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* Fix lack of Q_OBJECT macro lupdate warningSergey Belyashov2019-11-081-1/+1
| | | | | Change-Id: Ida21090229aca6b900d80d4a1be1fa63e40e946f Reviewed-by: Eike Ziller <eike.ziller@qt.io>
* Qbs: Inline qbsinstallstepconfigwidget.uihjk2019-06-261-36/+92
| | | | | | | Prelimimary step towards aspectification. Change-Id: I3ce6e3ca3ecd3fbb858525a533202af2fd0e6ff5 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* Utils: Rename FileName to FilePathhjk2019-05-281-1/+1
| | | | | | | | More in line with QFileInfo terminonlogy which appears to be best-of-breed within Qt. Change-Id: I1d051ff1c8363ebd4ee56376451df45216c4c9ab Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* ProjectExplorer: Rework the build step run interfaceChristian Kandeler2019-01-311-17/+10
| | | | | | | | | | | | | | | | | | | | | Originally, the build manager used to run all build steps in a dedicated thread. Communication between the step and the manager happened via a QFutureInterface that was passed into the step's run() function. Later, new steps were added that operated asynchronously, so the build manager had to differentiate between the different kinds of steps for starting and stopping. These days, almost all build and deploy steps work asynchronously, which made the QFuture-based interface look increasingly odd. With this patch, all build steps are expected to work asynchronously, so the build manager no longer needs to differentiate. Steps are started and requested to stop via the run() and cancel() functions, respectively, and emit the finished() signal when they are done. Build step implementors no longer have to deal with a QFutureInterface. For steps whose implementation is inherently synchronous, the BuildStep base class offers a runInThread() function. Change-Id: If905c68b234c5a669f6e19f43142eaa57d594803 Reviewed-by: hjk <hjk@qt.io>
* ProjectExplorer: Simplify BuildStep::init() signaturehjk2019-01-181-2/+1
| | | | | | | | The extra parameter was always computed but used only in one place, and that use got removed lately. Change-Id: Ie10c0107ca70ee97ce03f83294992aab8d1a3ffe Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* ProjectExplorer: Use a data member for BuildStep::runInGuiThreadhjk2018-10-231-5/+1
| | | | | Change-Id: Ia219fcf595c05c6f1b82f420454bd906c6870ee7 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* ProjectExplorer: Change BuildStepConfigWidget::summaryWidget()hjk2018-10-171-10/+1
| | | | | | | | | | From a virtual function to a normal one backed by a real data member. That's essentially what several re-implementations did, the other ones used a fixed value instead. Change-Id: I61e45f1d4f7f0f80fe2eb1f2729785f37e7bb803 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* ProjectExplorer: Make BuildStepConfigWidget::displayName a valuehjk2018-10-151-5/+0
| | | | | | | | | | | Use BuildStep::displayName() as default. This probably could be the only possibility, but currently there are some discrepancies that are kept in this patch to make the patch mechanical. Change-Id: I2a1e5c2ff37ad95e25309eb16e07099e42191f60 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* ProjectExplorer: Merge SimpleBuildStepWidget into BuildStepWidgethjk2018-10-121-1/+1
| | | | | | | | | | The extra m_step member is not worth the abstraction, especially since almost all non-SimpleBuildStepWidget have something similar, too. Also, as several derived classes needed to correct SimpleBuildStepWidget's setShowWidget(false). Change-Id: I6e80d8c84c363b90dc27c70abd7fa6cefa1ed91e Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* QbsProjectManager: ModernizeAlessandro Portale2018-07-271-5/+5
| | | | | | | | | modernize-use-auto modernize-use-nullptr modernize-use-override Change-Id: I8a67b87e614f54554f9ca50c9f5e3f3297458ec1 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* ProjectExplorer: Simplify BuildStepFactoryhjk2018-05-311-1/+1
| | | | | | | | | | | | | | | De-QObject-ify class, tr contexts are now the product's context, which was the case in some BuildStepFactories already, and is current state in {Run,DeployConfiguration}Factory. One spurious object name removed. De-virtualize canHandle(), it was never overloaded and is not intended to be overloaded anymore. Remove unused clone() function. Change-Id: Iff7fba5f707505f868f94458084a18650535fa23 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
* Centralize retrieving the "parent" build configurationEike Ziller2018-05-221-2/+1
| | | | | | | | | | | | | If a step is part of a build configuration, that is used, but many steps can be used as part of a deploy configuration. In that case the active build configuration of the step's target must be used, and that logic was duplicated many times. Instead, let BuildStep::buildConfiguration take care of that logic. For steps that are not offered for deploy configurations there is no semantic difference, and for the others this removes code duplication. Change-Id: I02f3bb50226590092cedcec02fce6fde9c7c6e63 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
* QbsProject: Use base Project::isParsing() functionhjk2018-01-031-1/+1
| | | | | | | | While the base function is not virtual the "hiding" re-implementation effectively appears to do the same. So drop it. Change-Id: I4ab0e0690b948ce3f590c87262d10622b169450e Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* ProjectExplorer/all: Re-organize BuildSteps/{Deploy,Build}Config setuphjk2017-12-081-44/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This follow the rough pattern of recent *RunConfigurationFactory changes for build and deploy configurations. - Collapse the two lines of constructors similar to what 890c1906e6fb2ec did for RunConfigurations * Deploy* was purely mechanical * Build* ctors are split in connects() in the ctor body to create "empty shell for clone" etc and build step additions in initialize() functions which are only used in the create() case. -- Allows to collapse the shared 'ctor()' functions, too. - Move FooBuildConfigurationFactory::create() implementations to FooBuildConfiguration() constructor. That was a strange and unneeded ping-pong between factories and objects, and furthermore allows one level less of indirection (and for a later, left out here, some reduction of the FooBuildConfiguration interfaces that were only used to accommodate the *Factory::create() functions. - Most {Build,Deploy}Configuration{,Factory} classes had a canHandle(), but there wasn't one in the base classses. Have one there. - Most canHandle() functions were checking simple restrictions on e.g. project or target types, specify those by setters in the constructors instead and check them in the base canHandle() - clone() is generally replaced by a creation of a "shell object" and a fromMap(source->toMap()), implemented in the base, there are two cases left for Android and Qbs that needed(?) some extra polish - generally use canHandle() in base implementation, instead of doing that in all Derived::canFoo() - as a result, canCreate/create/canClone/clone reimplementations are not needed anymore, keep the base implementation for now (could be inlined into their only users later), but de-virtualize them. - Combine Ios{Preset,DSym}BuildStepFactory. There was only one 'dsym' build step they could create. - Split the 'mangled' id into the ProjectConfiguration subtype specific constant identifier, and a QString extraId() bit. Only maintain the mangled id in saved settings. - Make ProjectConfiguration::m_id a constant member, adapt all constructors of derived classe. Not done in this patch: - Finish possible cosmetic changes on top - Add a way to specify restrictions to supported Qt versions (used in Android/Ios), as the base implementation does not depend on the qtsupport plugin - Combine the QList<X> availableFoo() + createFoo(X) function pairs to somthing like a direct QList<struct { X; std::function<X()>; }> fooCreators() to avoid e.g. the baseId.withSuffix() <-> id.suffixAfter(base) pingpong - Remove the *Factories from the global object pool - Do something about priority(). Falling back to plain qmake in android+qmake setup is not helpful. Change-Id: I2be7d88d554c5aa8b7db8edf5b93278e1ae0112a Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
* Project: Move signalling of parsing state into ProjectTobias Hunger2017-07-261-1/+1
| | | | | | | Get rid of duplicated code to do such signaling in derived Project types. Change-Id: I26914a1d751d72ee65c15a7943e0e7f34978f042 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
* QbsProjectManager: Re-introduce install stepChristian Kandeler2017-05-161-0/+376
| | | | | | | | | | | ... in a modified variant. The install root is now taken from the build step to ensure consistency. A dedicated deploy step can be useful on Windows if one wants to rebuild while the application is running. Task-number: QTCREATORBUG-17958 Change-Id: I93bc59b0e6d954d61d84bcfc81576cdb4fac1216 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>