CMake: Make sure to run cmake when that is requested

Pass on the request to run cmake on to the builddirreaders.

Task-number: QTCREATORBUG-19704
Change-Id: Iafeba61f46d6bb6783fc62d0504bb07dde2c4612
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Tobias Hunger
2019-06-06 15:07:17 +02:00
parent 0981a0af25
commit 202506ce16
6 changed files with 63 additions and 44 deletions

View File

@@ -269,7 +269,10 @@ bool BuildDirManager::persistCMakeState()
BuildDirParameters newParameters = m_parameters; BuildDirParameters newParameters = m_parameters;
newParameters.workDirectory.clear(); 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); REPARSE_FAIL);
return true; return true;
} }
@@ -289,10 +292,11 @@ void BuildDirManager::parse(int reparseParameters)
reparseParameters |= REPARSE_FORCE_CONFIGURATION | REPARSE_FORCE_CMAKE_RUN; reparseParameters |= REPARSE_FORCE_CONFIGURATION | REPARSE_FORCE_CMAKE_RUN;
} else if (reparseParameters & REPARSE_CHECK_CONFIGURATION) { } else if (reparseParameters & REPARSE_CHECK_CONFIGURATION) {
if (checkConfiguration()) 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<const FileNode *> &allFiles) const void BuildDirManager::generateProjectTree(CMakeProjectNode *root, const QList<const FileNode *> &allFiles) const

View File

@@ -57,7 +57,7 @@ public:
virtual bool isCompatible(const BuildDirParameters &p) = 0; virtual bool isCompatible(const BuildDirParameters &p) = 0;
virtual void resetData() = 0; virtual void resetData() = 0;
virtual void parse(bool forceConfiguration) = 0; virtual void parse(bool forceCMakeRun, bool forceConfiguration) = 0;
virtual void stop() = 0; virtual void stop() = 0;
virtual bool isParsing() const = 0; virtual bool isParsing() const = 0;

View File

@@ -102,40 +102,8 @@ void ServerModeReader::setParameters(const BuildDirParameters &p)
QTC_ASSERT(cmake, return); QTC_ASSERT(cmake, return);
m_parameters = p; m_parameters = p;
if (!m_cmakeServer) {
m_cmakeServer.reset(new ServerMode(p.environment, createNewServer();
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
}
} }
bool ServerModeReader::isCompatible(const BuildDirParameters &p) bool ServerModeReader::isCompatible(const BuildDirParameters &p)
@@ -171,13 +139,16 @@ void ServerModeReader::resetData()
m_fileGroups.clear(); m_fileGroups.clear();
} }
void ServerModeReader::parse(bool forceConfiguration) void ServerModeReader::parse(bool forceCMakeRun, bool forceConfiguration)
{ {
emit configurationStarted(); emit configurationStarted();
QTC_ASSERT(m_cmakeServer, return); QTC_ASSERT(m_cmakeServer, return);
QVariantMap extra; QVariantMap extra;
if (forceConfiguration || !QDir(m_parameters.buildDirectory.toString()).exists("CMakeCache.txt")) { if (forceCMakeRun)
createNewServer();
if (forceConfiguration) {
QStringList cacheArguments = transform(m_parameters.configuration, QStringList cacheArguments = transform(m_parameters.configuration,
[this](const CMakeConfigItem &i) { [this](const CMakeConfigItem &i) {
return i.toArgument(m_parameters.expander); return i.toArgument(m_parameters.expander);
@@ -401,6 +372,49 @@ CppTools::RawProjectParts ServerModeReader::createRawProjectParts() const
return rpps; return rpps;
} }
void ServerModeReader::createNewServer()
{
QTC_ASSERT(m_parameters.cmakeTool(), return);
m_cmakeServer
= std::make_unique<ServerMode>(
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) void ServerModeReader::handleReply(const QVariantMap &data, const QString &inReplyTo)
{ {
if (!m_delayedErrorMessage.isEmpty()) { if (!m_delayedErrorMessage.isEmpty()) {

View File

@@ -50,7 +50,7 @@ public:
bool isCompatible(const BuildDirParameters &p) final; bool isCompatible(const BuildDirParameters &p) final;
void resetData() final; void resetData() final;
void parse(bool forceConfiguration) final; void parse(bool forceCMakeRun, bool forceConfiguration) final;
void stop() final; void stop() final;
bool isParsing() const final; bool isParsing() const final;
@@ -62,6 +62,7 @@ public:
CppTools::RawProjectParts createRawProjectParts() const final; CppTools::RawProjectParts createRawProjectParts() const final;
private: private:
void createNewServer();
void handleReply(const QVariantMap &data, const QString &inReplyTo); void handleReply(const QVariantMap &data, const QString &inReplyTo);
void handleError(const QString &message); void handleError(const QString &message);
void handleProgress(int min, int cur, int max, const QString &inReplyTo); void handleProgress(int min, int cur, int max, const QString &inReplyTo);

View File

@@ -170,7 +170,7 @@ static QString findCbpFile(const QDir &directory)
return file; return file;
} }
void TeaLeafReader::parse(bool forceConfiguration) void TeaLeafReader::parse(bool forceCMakeRun, bool forceConfiguration)
{ {
emit configurationStarted(); emit configurationStarted();
@@ -182,7 +182,7 @@ void TeaLeafReader::parse(bool forceConfiguration)
return; return;
} }
const bool mustUpdate = m_cmakeFiles.isEmpty() const bool mustUpdate = forceCMakeRun || m_cmakeFiles.isEmpty()
|| anyOf(m_cmakeFiles, [&cbpFileFi](const FilePath &f) { || anyOf(m_cmakeFiles, [&cbpFileFi](const FilePath &f) {
return f.toFileInfo().lastModified() > cbpFileFi.lastModified(); return f.toFileInfo().lastModified() > cbpFileFi.lastModified();
}); });

View File

@@ -51,7 +51,7 @@ public:
bool isCompatible(const BuildDirParameters &p) final; bool isCompatible(const BuildDirParameters &p) final;
void resetData() final; void resetData() final;
void parse(bool forceConfiguration) final; void parse(bool forceCMakeRun, bool forceConfiguration) final;
void stop() final; void stop() final;
bool isParsing() const final; bool isParsing() const final;