aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cmakeprojectmanager/cmaketool.cpp
diff options
context:
space:
mode:
authorTobias Hunger <tobias.hunger@qt.io>2019-06-11 11:06:32 +0200
committerTobias Hunger <tobias.hunger@qt.io>2019-06-12 11:56:19 +0000
commita51b8a061e91ed615bd48b348dcc133e01f49dbf (patch)
treeb952c77e998680eaae855a0e6ac08a3f5ce91bc2 /src/plugins/cmakeprojectmanager/cmaketool.cpp
parentd5383c92a8392b6a89584f6e823bdc1378d00264 (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.cpp48
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