aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qtsupport
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2019-03-14 18:07:56 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2019-03-19 17:19:38 +0000
commite94f5b496ecd9ca212009bd24368265e1df8199b (patch)
treed0f9f9351153e93ff9ab9f9c04fc1aea64965d42 /src/plugins/qtsupport
parenta2c7257c9b24103b1f6c05b96c8a2d67a8d1404a (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.cpp51
-rw-r--r--src/plugins/qtsupport/qtkitinformation.h2
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);