diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index 54776ed122d..aff84521426 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -269,7 +269,10 @@ bool BuildDirManager::persistCMakeState() BuildDirParameters newParameters = m_parameters; newParameters.workDirectory.clear(); - setParametersAndRequestParse(newParameters, REPARSE_URGENT | REPARSE_FORCE_CONFIGURATION | REPARSE_CHECK_CONFIGURATION, + setParametersAndRequestParse(newParameters, + REPARSE_URGENT + | REPARSE_FORCE_CMAKE_RUN | REPARSE_FORCE_CONFIGURATION + | REPARSE_CHECK_CONFIGURATION, REPARSE_FAIL); return true; } @@ -289,10 +292,11 @@ void BuildDirManager::parse(int reparseParameters) reparseParameters |= REPARSE_FORCE_CONFIGURATION | REPARSE_FORCE_CMAKE_RUN; } else if (reparseParameters & REPARSE_CHECK_CONFIGURATION) { if (checkConfiguration()) - reparseParameters |= REPARSE_FORCE_CONFIGURATION; + reparseParameters |= REPARSE_FORCE_CONFIGURATION | REPARSE_FORCE_CMAKE_RUN; } - m_reader->parse(reparseParameters & REPARSE_FORCE_CONFIGURATION); + m_reader->parse(reparseParameters & REPARSE_FORCE_CMAKE_RUN, + reparseParameters & REPARSE_FORCE_CONFIGURATION); } void BuildDirManager::generateProjectTree(CMakeProjectNode *root, const QList &allFiles) const diff --git a/src/plugins/cmakeprojectmanager/builddirreader.h b/src/plugins/cmakeprojectmanager/builddirreader.h index 9b6e9228256..94e85ca1878 100644 --- a/src/plugins/cmakeprojectmanager/builddirreader.h +++ b/src/plugins/cmakeprojectmanager/builddirreader.h @@ -57,7 +57,7 @@ public: virtual bool isCompatible(const BuildDirParameters &p) = 0; virtual void resetData() = 0; - virtual void parse(bool forceConfiguration) = 0; + virtual void parse(bool forceCMakeRun, bool forceConfiguration) = 0; virtual void stop() = 0; virtual bool isParsing() const = 0; diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index fac86e923eb..525dcca05f4 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -102,40 +102,8 @@ void ServerModeReader::setParameters(const BuildDirParameters &p) QTC_ASSERT(cmake, return); m_parameters = p; - if (!m_cmakeServer) { - m_cmakeServer.reset(new ServerMode(p.environment, - p.sourceDirectory, p.workDirectory, - cmake->cmakeExecutable(), - p.generator, p.extraGenerator, p.platform, p.toolset, - true, 1)); - connect(m_cmakeServer.get(), &ServerMode::errorOccured, - this, &ServerModeReader::errorOccured); - connect(m_cmakeServer.get(), &ServerMode::cmakeReply, - this, &ServerModeReader::handleReply); - connect(m_cmakeServer.get(), &ServerMode::cmakeError, - this, &ServerModeReader::handleError); - connect(m_cmakeServer.get(), &ServerMode::cmakeProgress, - this, &ServerModeReader::handleProgress); - connect(m_cmakeServer.get(), &ServerMode::cmakeSignal, - this, &ServerModeReader::handleSignal); - connect(m_cmakeServer.get(), &ServerMode::cmakeMessage, [this](const QString &m) { - const QStringList lines = m.split('\n'); - for (const QString &l : lines) { - m_parser.stdError(l); - Core::MessageManager::write(l); - } - }); - connect(m_cmakeServer.get(), &ServerMode::message, - this, [](const QString &m) { Core::MessageManager::write(m); }); - connect(m_cmakeServer.get(), &ServerMode::connected, - this, &ServerModeReader::isReadyNow, Qt::QueuedConnection); // Delay - connect(m_cmakeServer.get(), &ServerMode::disconnected, - this, [this]() { - stop(); - Core::MessageManager::write(tr("Parsing of CMake project failed: Connection to CMake server lost.")); - m_cmakeServer.reset(); - }, Qt::QueuedConnection); // Delay - } + + createNewServer(); } bool ServerModeReader::isCompatible(const BuildDirParameters &p) @@ -171,13 +139,16 @@ void ServerModeReader::resetData() m_fileGroups.clear(); } -void ServerModeReader::parse(bool forceConfiguration) +void ServerModeReader::parse(bool forceCMakeRun, bool forceConfiguration) { emit configurationStarted(); QTC_ASSERT(m_cmakeServer, return); QVariantMap extra; - if (forceConfiguration || !QDir(m_parameters.buildDirectory.toString()).exists("CMakeCache.txt")) { + if (forceCMakeRun) + createNewServer(); + + if (forceConfiguration) { QStringList cacheArguments = transform(m_parameters.configuration, [this](const CMakeConfigItem &i) { return i.toArgument(m_parameters.expander); @@ -401,6 +372,49 @@ CppTools::RawProjectParts ServerModeReader::createRawProjectParts() const return rpps; } +void ServerModeReader::createNewServer() +{ + QTC_ASSERT(m_parameters.cmakeTool(), return); + m_cmakeServer + = std::make_unique( + m_parameters.environment, + m_parameters.sourceDirectory, m_parameters.workDirectory, + m_parameters.cmakeTool()->cmakeExecutable(), + m_parameters.generator, + m_parameters.extraGenerator, + m_parameters.platform, m_parameters.toolset, + true, 1); + + connect(m_cmakeServer.get(), &ServerMode::errorOccured, + this, &ServerModeReader::errorOccured); + connect(m_cmakeServer.get(), &ServerMode::cmakeReply, + this, &ServerModeReader::handleReply); + connect(m_cmakeServer.get(), &ServerMode::cmakeError, + this, &ServerModeReader::handleError); + connect(m_cmakeServer.get(), &ServerMode::cmakeProgress, + this, &ServerModeReader::handleProgress); + connect(m_cmakeServer.get(), &ServerMode::cmakeSignal, + this, &ServerModeReader::handleSignal); + connect(m_cmakeServer.get(), &ServerMode::cmakeMessage, [this](const QString &m) { + const QStringList lines = m.split('\n'); + for (const QString &l : lines) { + m_parser.stdError(l); + Core::MessageManager::write(l); + } + }); + connect(m_cmakeServer.get(), &ServerMode::message, + this, [](const QString &m) { Core::MessageManager::write(m); }); + connect(m_cmakeServer.get(), &ServerMode::connected, + this, &ServerModeReader::isReadyNow, Qt::QueuedConnection); // Delay + connect(m_cmakeServer.get(), &ServerMode::disconnected, + this, [this]() { + stop(); + Core::MessageManager::write(tr("Parsing of CMake project failed: Connection to CMake server lost.")); + m_cmakeServer.reset(); + }, Qt::QueuedConnection); // Delay + +} + void ServerModeReader::handleReply(const QVariantMap &data, const QString &inReplyTo) { if (!m_delayedErrorMessage.isEmpty()) { diff --git a/src/plugins/cmakeprojectmanager/servermodereader.h b/src/plugins/cmakeprojectmanager/servermodereader.h index e26b3ec3cf8..e0c0cd5d685 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.h +++ b/src/plugins/cmakeprojectmanager/servermodereader.h @@ -50,7 +50,7 @@ public: bool isCompatible(const BuildDirParameters &p) final; void resetData() final; - void parse(bool forceConfiguration) final; + void parse(bool forceCMakeRun, bool forceConfiguration) final; void stop() final; bool isParsing() const final; @@ -62,6 +62,7 @@ public: CppTools::RawProjectParts createRawProjectParts() const final; private: + void createNewServer(); void handleReply(const QVariantMap &data, const QString &inReplyTo); void handleError(const QString &message); void handleProgress(int min, int cur, int max, const QString &inReplyTo); diff --git a/src/plugins/cmakeprojectmanager/tealeafreader.cpp b/src/plugins/cmakeprojectmanager/tealeafreader.cpp index 448d424f8c9..6f8c738dcb5 100644 --- a/src/plugins/cmakeprojectmanager/tealeafreader.cpp +++ b/src/plugins/cmakeprojectmanager/tealeafreader.cpp @@ -170,7 +170,7 @@ static QString findCbpFile(const QDir &directory) return file; } -void TeaLeafReader::parse(bool forceConfiguration) +void TeaLeafReader::parse(bool forceCMakeRun, bool forceConfiguration) { emit configurationStarted(); @@ -182,7 +182,7 @@ void TeaLeafReader::parse(bool forceConfiguration) return; } - const bool mustUpdate = m_cmakeFiles.isEmpty() + const bool mustUpdate = forceCMakeRun || m_cmakeFiles.isEmpty() || anyOf(m_cmakeFiles, [&cbpFileFi](const FilePath &f) { return f.toFileInfo().lastModified() > cbpFileFi.lastModified(); }); diff --git a/src/plugins/cmakeprojectmanager/tealeafreader.h b/src/plugins/cmakeprojectmanager/tealeafreader.h index 847f38d3aa0..a305d0276a3 100644 --- a/src/plugins/cmakeprojectmanager/tealeafreader.h +++ b/src/plugins/cmakeprojectmanager/tealeafreader.h @@ -51,7 +51,7 @@ public: bool isCompatible(const BuildDirParameters &p) final; void resetData() final; - void parse(bool forceConfiguration) final; + void parse(bool forceCMakeRun, bool forceConfiguration) final; void stop() final; bool isParsing() const final;