diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2019-06-11 11:06:32 +0200 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@qt.io> | 2019-06-12 11:56:19 +0000 |
commit | a51b8a061e91ed615bd48b348dcc133e01f49dbf (patch) | |
tree | b952c77e998680eaae855a0e6ac08a3f5ce91bc2 /src/plugins/cmakeprojectmanager/cmaketool.cpp | |
parent | d5383c92a8392b6a89584f6e823bdc1378d00264 (diff) |
CMakeTool: Update cmake fileapi detection
CMake rejected a patch to add fileapi detection via cmake -E capabilities
output and asked to base the detection on the version number. This decision
has been revisited now and starting with cmake 3.15 the supported fileapi
object kinds and there version are reported.
Update Creator to use this information and to fill in the missing data for
cmake 3.14.
Change-Id: I382310a098925491921acf1b59099bbe0859cde2
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src/plugins/cmakeprojectmanager/cmaketool.cpp')
-rw-r--r-- | src/plugins/cmakeprojectmanager/cmaketool.cpp | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index c685b37cb9d..1e186defe79 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -61,6 +61,12 @@ namespace Internal { // CMakeIntrospectionData: // -------------------------------------------------------------------- +class FileApi { +public: + QString kind; + std::pair<int, int> version; +}; + class IntrospectionData { public: @@ -73,6 +79,7 @@ public: QList<CMakeTool::Generator> m_generators; QMap<QString, QStringList> m_functionArgs; + QVector<FileApi> m_fileApis; QStringList m_variables; QStringList m_functions; CMakeTool::Version m_version; @@ -250,9 +257,14 @@ bool CMakeTool::hasServerMode() const bool CMakeTool::hasFileApi() const { - readInformation(QueryType::VERSION); - return m_introspection->m_version.major > 3 - || (m_introspection->m_version.major == 3 && m_introspection->m_version.minor >= 14); + readInformation(QueryType::SERVER_MODE); + return !m_introspection->m_fileApis.isEmpty(); +} + +QVector<std::pair<QString, int> > CMakeTool::supportedFileApiObjects() const +{ + readInformation(QueryType::SERVER_MODE); + return Utils::transform(m_introspection->m_fileApis, [](const Internal::FileApi &api) { return std::make_pair(api.kind, api.version.first); }); } CMakeTool::Version CMakeTool::version() const @@ -495,6 +507,15 @@ void CMakeTool::fetchFromCapabilities() const parseFromCapabilities(response.stdOut()); } +static int getVersion(const QVariantMap &obj, const QString value) +{ + bool ok; + int result = obj.value(value).toInt(&ok); + if (!ok) + return -1; + return result; +} + void CMakeTool::parseFromCapabilities(const QString &input) const { auto doc = QJsonDocument::fromJson(input.toUtf8()); @@ -512,11 +533,32 @@ void CMakeTool::parseFromCapabilities(const QString &input) const gen.value("toolsetSupport").toBool())); } + { + const QVariantMap fileApis = data.value("fileApi").toMap(); + const QVariantList requests = fileApis.value("requests").toList(); + for (const QVariant &r: requests) { + const QVariantMap object = r.toMap(); + const QString kind = object.value("kind").toString(); + const QVariantMap versionObject = object.value("version").toMap(); + const std::pair<int, int> version = std::make_pair(getVersion(versionObject, "major"), + getVersion(versionObject, "minor")); + if (!kind.isNull() && version.first != -1 && version.second != -1) + m_introspection->m_fileApis.append({kind, version}); + } + } + const QVariantMap versionInfo = data.value("version").toMap(); m_introspection->m_version.major = versionInfo.value("major").toInt(); m_introspection->m_version.minor = versionInfo.value("minor").toInt(); m_introspection->m_version.patch = versionInfo.value("patch").toInt(); m_introspection->m_version.fullVersion = versionInfo.value("string").toByteArray(); + + // Fix up fileapi support for cmake 3.14: + if (m_introspection->m_version.major == 3 && m_introspection->m_version.minor == 14) { + m_introspection->m_fileApis.append({QString("codemodel"), std::make_pair(2, 0)}); + m_introspection->m_fileApis.append({QString("cache"), std::make_pair(2, 0)}); + m_introspection->m_fileApis.append({QString("cmakefiles"), std::make_pair(1, 0)}); + } } } // namespace CMakeProjectManager |