From f51f3c897ed34156c652f768ba55a577ff7c87bf Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 22 Apr 2020 11:18:01 +0200 Subject: CMake: Do not crash without a supported CMake Do not crash when a CMake < 3.7 (no server-mode and no file-api) is used. Change-Id: I72a4ce6bb81d4fcf3d59508c72e46f422a8a00c0 Reviewed-by: Cristian Adam --- .../cmakeprojectmanager/builddirmanager.cpp | 7 ++++ src/plugins/cmakeprojectmanager/builddirreader.cpp | 7 ++-- src/plugins/cmakeprojectmanager/cmaketool.cpp | 37 +++++++++++----------- src/plugins/cmakeprojectmanager/cmaketool.h | 2 +- 4 files changed, 30 insertions(+), 23 deletions(-) (limited to 'src/plugins/cmakeprojectmanager') diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index 44aec2346e7..2e99326d944 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -143,6 +143,13 @@ void BuildDirManager::updateReaderType(const BuildDirParameters &p, } m_reader = BuildDirReader::createReader(p); + if (!m_reader) { + TaskHub::addTask(BuildSystemTask( + Task::Error, + tr("The kit does not define a valid CMake tool to parse this project with."))); + return; + } + connect(m_reader.get(), &BuildDirReader::configurationStarted, this, diff --git a/src/plugins/cmakeprojectmanager/builddirreader.cpp b/src/plugins/cmakeprojectmanager/builddirreader.cpp index 031f1ec6c72..091e6d1a6f5 100644 --- a/src/plugins/cmakeprojectmanager/builddirreader.cpp +++ b/src/plugins/cmakeprojectmanager/builddirreader.cpp @@ -44,13 +44,14 @@ std::unique_ptr BuildDirReader::createReader(const BuildDirParam CMakeTool *cmake = p.cmakeTool(); QTC_ASSERT(p.isValid() && cmake, return {}); - switch (cmake->readerType()) { + auto type = cmake->readerType(); + if (!type) + return {}; + switch (type.value()) { case CMakeTool::FileApi: return std::make_unique(); case CMakeTool::ServerMode: return std::make_unique(); - default: - return {}; } } diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index 8c77d3bccdd..f487734b3d8 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -69,10 +69,11 @@ static bool ignoreFileApi() static Utils::optional readerTypeFromString(const QString &input) { + // Do not try to be clever here, just use whatever is in the string! if (input == READER_TYPE_SERVERMODE) return CMakeTool::ServerMode; if (input == READER_TYPE_FILEAPI) - return ignoreFileApi() ? CMakeTool::ServerMode : CMakeTool::FileApi; + return CMakeTool::FileApi; return {}; } @@ -84,7 +85,6 @@ static QString readerTypeToString(const CMakeTool::ReaderType &type) case CMakeTool::FileApi: return QString(READER_TYPE_FILEAPI); } - return QString(""); } // -------------------------------------------------------------------- @@ -120,9 +120,10 @@ public: /////////////////////////// // CMakeTool /////////////////////////// -CMakeTool::CMakeTool(Detection d, const Core::Id &id) : - m_id(id), m_isAutoDetected(d == AutoDetection), - m_introspection(std::make_unique()) +CMakeTool::CMakeTool(Detection d, const Core::Id &id) + : m_id(id) + , m_isAutoDetected(d == AutoDetection) + , m_introspection(std::make_unique()) { QTC_ASSERT(m_id.isValid(), m_id = Core::Id::fromString(QUuid::createUuid().toString())); } @@ -198,7 +199,7 @@ bool CMakeTool::isValid() const if (!m_introspection->m_didAttemptToRun) supportedGenerators(); - return m_introspection->m_didRun && (hasFileApi() || hasServerMode()); + return m_introspection->m_didRun && readerType().has_value(); } Utils::SynchronousProcessResponse CMakeTool::run(const QStringList &args, int timeoutS) const @@ -223,7 +224,7 @@ QVariantMap CMakeTool::toMap() const data.insert(CMAKE_INFORMATION_QCH_FILE_PATH, m_qchFilePath.toString()); data.insert(CMAKE_INFORMATION_AUTORUN, m_isAutoRun); data.insert(CMAKE_INFORMATION_AUTO_CREATE_BUILD_DIRECTORY, m_autoCreateBuildDirectory); - if (m_readerType.has_value()) + if (m_readerType) data.insert(CMAKE_INFORMATION_READERTYPE, Internal::readerTypeToString(m_readerType.value())); data.insert(CMAKE_INFORMATION_AUTODETECTED, m_isAutoDetected); @@ -368,19 +369,17 @@ CMakeTool::PathMapper CMakeTool::pathMapper() const return [](const Utils::FilePath &fn) { return fn; }; } -CMakeTool::ReaderType CMakeTool::readerType() const +Utils::optional CMakeTool::readerType() const { - if (!m_readerType.has_value()) { - // Find best possible reader type: - if (hasFileApi()) { - if (hasServerMode() && Internal::ignoreFileApi()) - return ServerMode; // We were asked to fall back to server mode - return FileApi; - } - if (hasServerMode()) - return ServerMode; - } - return m_readerType.value(); + if (m_readerType) + return m_readerType; // Allow overriding the auto-detected value via .user files + + // Find best possible reader type: + if (hasFileApi() && !Internal::ignoreFileApi()) + return FileApi; + if (hasServerMode()) + return ServerMode; + return {}; } Utils::FilePath CMakeTool::searchQchFile(const Utils::FilePath &executable) diff --git a/src/plugins/cmakeprojectmanager/cmaketool.h b/src/plugins/cmakeprojectmanager/cmaketool.h index 40a79071cff..1d7bcde82e8 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.h +++ b/src/plugins/cmakeprojectmanager/cmaketool.h @@ -110,7 +110,7 @@ public: void setPathMapper(const PathMapper &includePathMapper); PathMapper pathMapper() const; - ReaderType readerType() const; + Utils::optional readerType() const; static Utils::FilePath searchQchFile(const Utils::FilePath &executable); -- cgit v1.2.3