diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2019-03-14 18:07:56 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2019-03-19 17:19:38 +0000 |
commit | e94f5b496ecd9ca212009bd24368265e1df8199b (patch) | |
tree | d0f9f9351153e93ff9ab9f9c04fc1aea64965d42 /src/plugins/qtsupport | |
parent | a2c7257c9b24103b1f6c05b96c8a2d67a8d1404a (diff) |
Improve kit auto-detection
The old code was too simplistic: Basically, we just took a random
toolchain, slapped a random Qt onto it and made that the default kit.
Instead, we now go through all toolchains, try to find a matching Qt
version, debugger etc and create a kit for that combination unless there
is a better one.
Fixes: QTCREATORBUG-22138
Change-Id: Ib57ca4453a93ee9253c75398328c3bca33087dc6
Reviewed-by: hjk <hjk@qt.io>
Diffstat (limited to 'src/plugins/qtsupport')
-rw-r--r-- | src/plugins/qtsupport/qtkitinformation.cpp | 51 | ||||
-rw-r--r-- | src/plugins/qtsupport/qtkitinformation.h | 2 |
2 files changed, 42 insertions, 11 deletions
diff --git a/src/plugins/qtsupport/qtkitinformation.cpp b/src/plugins/qtsupport/qtkitinformation.cpp index 1181e5b359d..3cd0b2d36b7 100644 --- a/src/plugins/qtsupport/qtkitinformation.cpp +++ b/src/plugins/qtsupport/qtkitinformation.cpp @@ -163,17 +163,32 @@ QtKitAspect::QtKitAspect() void QtKitAspect::setup(ProjectExplorer::Kit *k) { - Q_UNUSED(k); - - // find "Qt in PATH": - BaseQtVersion *result = QtVersionManager::version(equal(&BaseQtVersion::autodetectionSource, - QString::fromLatin1("PATH"))); - if (!result) { - // Use *any* desktop Qt: - result = QtVersionManager::version(equal(&BaseQtVersion::type, - QString::fromLatin1(QtSupport::Constants::DESKTOPQT))); - } - k->setValue(id(), result ? result->uniqueId() : -1); + const Abi tcAbi = ToolChainKitAspect::targetAbi(k); + const Core::Id deviceType = DeviceTypeKitAspect::deviceTypeId(k); + + const QList<BaseQtVersion *> matches + = QtVersionManager::versions([&tcAbi, &deviceType](const BaseQtVersion *qt) { + return qt->targetDeviceTypes().contains(deviceType) + && Utils::contains(qt->qtAbis(), [&tcAbi](const Abi &qtAbi) { + return qtAbi.isCompatibleWith(tcAbi); }); + }); + if (matches.empty()) + return; + + // An MSVC 2015 toolchain is compatible with an MSVC 2017 Qt, but we prefer an + // MSVC 2015 Qt if we find one. + const QList<BaseQtVersion *> exactMatches = Utils::filtered(matches, + [&tcAbi](const BaseQtVersion *qt) { + return qt->qtAbis().contains(tcAbi); + }); + const QList<BaseQtVersion *> &candidates = !exactMatches.empty() ? exactMatches : matches; + + BaseQtVersion * const qtFromPath = QtVersionManager::version( + equal(&BaseQtVersion::autodetectionSource, QString::fromLatin1("PATH"))); + if (qtFromPath && candidates.contains(qtFromPath)) + k->setValue(id(), qtFromPath->uniqueId()); + else + k->setValue(id(), candidates.first()->uniqueId()); } QList<ProjectExplorer::Task> QtKitAspect::validate(const ProjectExplorer::Kit *k) const @@ -370,4 +385,18 @@ QSet<Core::Id> QtKitAspect::availableFeatures(const Kit *k) const return version ? version->features() : QSet<Core::Id>(); } +int QtKitAspect::weight(const Kit *k) const +{ + const BaseQtVersion * const qt = qtVersion(k); + if (!qt) + return 0; + if (!qt->targetDeviceTypes().contains(DeviceTypeKitAspect::deviceTypeId(k))) + return 0; + const Abi tcAbi = ToolChainKitAspect::targetAbi(k); + if (qt->qtAbis().contains(tcAbi)) + return 2; + return Utils::contains(qt->qtAbis(), [&tcAbi](const Abi &qtAbi) { + return qtAbi.isCompatibleWith(tcAbi); }) ? 1 : 0; +} + } // namespace QtSupport diff --git a/src/plugins/qtsupport/qtkitinformation.h b/src/plugins/qtsupport/qtkitinformation.h index 5a9be938029..565e5aef0f9 100644 --- a/src/plugins/qtsupport/qtkitinformation.h +++ b/src/plugins/qtsupport/qtkitinformation.h @@ -73,6 +73,8 @@ public: QSet<Core::Id> availableFeatures(const ProjectExplorer::Kit *k) const override; private: + int weight(const ProjectExplorer::Kit *k) const override; + void qtVersionsChanged(const QList<int> &addedIds, const QList<int> &removedIds, const QList<int> &changedIds); |