CMake: Check parseGuard.guardsProject()

... before overwriting the current guard, retaining the
state of the current guard in the error case.

Change-Id: I45ec43d48a9a13b9b59a5bbe6415a457b974b654
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
hjk
2020-02-27 14:46:16 +01:00
parent a670e203b1
commit 488bd7eddb

View File

@@ -204,7 +204,7 @@ CMakeBuildSystem::CMakeBuildSystem(CMakeBuildConfiguration *bc)
});
connect(project(), &Project::projectFileIsDirty, this, [this]() {
if (m_buildConfiguration->isActive()) {
if (m_buildConfiguration->isActive() && !isParsing()) {
const auto cmake = CMakeKitAspect::cmakeTool(m_buildConfiguration->target()->kit());
if (cmake && cmake->isAutoRun()) {
qCDebug(cmakeBuildSystemLog) << "Requesting parse due to dirty project file";
@@ -235,9 +235,20 @@ CMakeBuildSystem::~CMakeBuildSystem()
void CMakeBuildSystem::triggerParsing()
{
qCDebug(cmakeBuildSystemLog) << "Parsing has been triggered";
m_currentGuard = guardParsingRun();
QTC_ASSERT(m_currentGuard.guardsProject(), return );
auto guard = guardParsingRun();
if (!guard.guardsProject()) {
// This can legitimately trigger if e.g. Build->Run CMake
// is selected while this here is already running.
// FIXME: Instead of aborting the second run here we could try to
// cancel the first one in the Build->Run CMake handler and then
// continue to here normally. This here could then be an Assert.
return;
}
m_currentGuard = std::move(guard);
if (m_allFiles.isEmpty())
m_buildDirManager.requestFilesystemScan();