forked from qt-creator/qt-creator
CMakePM: Scan files only on CMake configuration failure
The file tree scanner will only be started on CMake configuration failure to generate the <File System> fall back project node. Change-Id: I873ef1189fd43dc9bffa03aeafabb00bb3b8b6af Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
@@ -35,6 +35,7 @@
|
||||
#include "cmakeprojectnodes.h"
|
||||
#include "cmakeprojectplugin.h"
|
||||
#include "cmakespecificsettings.h"
|
||||
#include "projecttreehelper.h"
|
||||
#include "utils/algorithm.h"
|
||||
|
||||
#include <android/androidconstants.h>
|
||||
@@ -158,8 +159,7 @@ CMakeBuildSystem::CMakeBuildSystem(CMakeBuildConfiguration *bc)
|
||||
|
||||
m_treeScanner.setFilter([this](const MimeType &mimeType, const FilePath &fn) {
|
||||
// Mime checks requires more resources, so keep it last in check list
|
||||
auto isIgnored = fn.toString().startsWith(projectFilePath().toString() + ".user")
|
||||
|| TreeScanner::isWellKnownBinary(mimeType, fn);
|
||||
auto isIgnored = TreeScanner::isWellKnownBinary(mimeType, fn);
|
||||
|
||||
// Cache mime check result for speed up
|
||||
if (!isIgnored) {
|
||||
@@ -213,7 +213,6 @@ CMakeBuildSystem::~CMakeBuildSystem()
|
||||
|
||||
delete m_cppCodeModelUpdater;
|
||||
qDeleteAll(m_extraCompilers);
|
||||
qDeleteAll(m_allFiles.allFiles);
|
||||
}
|
||||
|
||||
void CMakeBuildSystem::triggerParsing()
|
||||
@@ -244,28 +243,11 @@ void CMakeBuildSystem::triggerParsing()
|
||||
|
||||
qCDebug(cmakeBuildSystemLog) << "ParseGuard acquired.";
|
||||
|
||||
if (m_allFiles.allFiles.isEmpty()) {
|
||||
qCDebug(cmakeBuildSystemLog)
|
||||
<< "No treescanner information available, forcing treescanner run.";
|
||||
updateReparseParameters(REPARSE_SCAN);
|
||||
}
|
||||
|
||||
int reparseParameters = takeReparseParameters();
|
||||
|
||||
m_waitingForScan = (reparseParameters & REPARSE_SCAN) != 0;
|
||||
m_waitingForParse = true;
|
||||
m_combinedScanAndParseResult = true;
|
||||
|
||||
if (m_waitingForScan) {
|
||||
qCDebug(cmakeBuildSystemLog) << "Starting TreeScanner";
|
||||
QTC_CHECK(m_treeScanner.isFinished());
|
||||
if (m_treeScanner.asyncScanForFiles(projectDirectory()))
|
||||
Core::ProgressManager::addTask(m_treeScanner.future(),
|
||||
tr("Scan \"%1\" project tree")
|
||||
.arg(project()->displayName()),
|
||||
"CMake.Scan.Tree");
|
||||
}
|
||||
|
||||
QTC_ASSERT(m_parameters.isValid(), return );
|
||||
|
||||
TaskHub::clearTasks(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM);
|
||||
@@ -365,8 +347,6 @@ QString CMakeBuildSystem::reparseParametersString(int reparseFlags)
|
||||
result += " FORCE_CMAKE_RUN";
|
||||
if (reparseFlags & REPARSE_FORCE_INITIAL_CONFIGURATION)
|
||||
result += " FORCE_CONFIG";
|
||||
if (reparseFlags & REPARSE_SCAN)
|
||||
result += " SCAN";
|
||||
}
|
||||
return result.trimmed();
|
||||
}
|
||||
@@ -442,7 +422,7 @@ void CMakeBuildSystem::runCMakeAndScanProjectTree()
|
||||
BuildDirParameters parameters(cmakeBuildConfiguration());
|
||||
qCDebug(cmakeBuildSystemLog) << "Requesting parse due to \"Rescan Project\" command";
|
||||
setParametersAndRequestParse(parameters,
|
||||
REPARSE_FORCE_CMAKE_RUN | REPARSE_SCAN | REPARSE_URGENT);
|
||||
REPARSE_FORCE_CMAKE_RUN | REPARSE_URGENT);
|
||||
}
|
||||
|
||||
void CMakeBuildSystem::runCMakeWithExtraArguments()
|
||||
@@ -461,18 +441,6 @@ void CMakeBuildSystem::buildCMakeTarget(const QString &buildTarget)
|
||||
cmakeBuildConfiguration()->buildTarget(buildTarget);
|
||||
}
|
||||
|
||||
void CMakeBuildSystem::handleTreeScanningFinished()
|
||||
{
|
||||
QTC_CHECK(m_waitingForScan);
|
||||
|
||||
qDeleteAll(m_allFiles.allFiles);
|
||||
m_allFiles = m_treeScanner.release();
|
||||
|
||||
m_waitingForScan = false;
|
||||
|
||||
combineScanAndParse(m_reader.lastCMakeExitCode() != 0);
|
||||
}
|
||||
|
||||
bool CMakeBuildSystem::persistCMakeState()
|
||||
{
|
||||
BuildDirParameters parameters(cmakeBuildConfiguration());
|
||||
@@ -524,17 +492,10 @@ void CMakeBuildSystem::clearCMakeCache()
|
||||
path.removeRecursively();
|
||||
}
|
||||
|
||||
std::unique_ptr<CMakeProjectNode> CMakeBuildSystem::generateProjectTree(
|
||||
const TreeScanner::Result &allFiles, bool failedToParse)
|
||||
{
|
||||
auto root = m_reader.generateProjectTree(allFiles, failedToParse);
|
||||
return root;
|
||||
}
|
||||
|
||||
void CMakeBuildSystem::combineScanAndParse(bool restoredFromBackup)
|
||||
{
|
||||
if (cmakeBuildConfiguration()->isActive()) {
|
||||
if (m_waitingForParse || m_waitingForScan)
|
||||
if (m_waitingForParse)
|
||||
return;
|
||||
|
||||
if (m_combinedScanAndParseResult) {
|
||||
@@ -548,6 +509,15 @@ void CMakeBuildSystem::combineScanAndParse(bool restoredFromBackup)
|
||||
"<p>The backup of the previous configuration has been restored.</p>"
|
||||
"<p>Have a look at the Issues pane or in the \"Projects > Build\" settings "
|
||||
"for more information about the failure.</p"));
|
||||
|
||||
m_reader.resetData();
|
||||
|
||||
m_currentGuard = {};
|
||||
m_testNames.clear();
|
||||
|
||||
emitBuildSystemUpdated();
|
||||
|
||||
runCTest();
|
||||
} else {
|
||||
updateFallbackProjectData();
|
||||
|
||||
@@ -558,15 +528,6 @@ void CMakeBuildSystem::combineScanAndParse(bool restoredFromBackup)
|
||||
"for more information about the failure.</p"));
|
||||
}
|
||||
}
|
||||
|
||||
m_reader.resetData();
|
||||
|
||||
m_currentGuard = {};
|
||||
m_testNames.clear();
|
||||
|
||||
emitBuildSystemUpdated();
|
||||
|
||||
runCTest();
|
||||
}
|
||||
|
||||
void CMakeBuildSystem::checkAndReportError(QString &errorMessage)
|
||||
@@ -614,7 +575,7 @@ void CMakeBuildSystem::updateProjectData()
|
||||
|
||||
Project *p = project();
|
||||
{
|
||||
auto newRoot = generateProjectTree(m_allFiles, false);
|
||||
auto newRoot = m_reader.rootProjectNode();
|
||||
if (newRoot) {
|
||||
setRootProjectNode(std::move(newRoot));
|
||||
|
||||
@@ -707,16 +668,51 @@ void CMakeBuildSystem::updateProjectData()
|
||||
qCDebug(cmakeBuildSystemLog) << "All CMake project data up to date.";
|
||||
}
|
||||
|
||||
void CMakeBuildSystem::handleTreeScanningFinished()
|
||||
{
|
||||
TreeScanner::Result result = m_treeScanner.release();
|
||||
m_allFiles = result.folderNode;
|
||||
qDeleteAll(result.allFiles);
|
||||
|
||||
updateFileSystemNodes();
|
||||
}
|
||||
|
||||
void CMakeBuildSystem::updateFileSystemNodes()
|
||||
{
|
||||
auto newRoot = std::make_unique<CMakeProjectNode>(m_parameters.sourceDirectory);
|
||||
newRoot->setDisplayName(m_parameters.sourceDirectory.fileName());
|
||||
|
||||
if (!m_reader.topCmakeFile().isEmpty()) {
|
||||
auto node = std::make_unique<FileNode>(m_reader.topCmakeFile(), FileType::Project);
|
||||
node->setIsGenerated(false);
|
||||
|
||||
std::vector<std::unique_ptr<FileNode>> fileNodes;
|
||||
fileNodes.emplace_back(std::move(node));
|
||||
|
||||
addCMakeLists(newRoot.get(), std::move(fileNodes));
|
||||
}
|
||||
|
||||
addFileSystemNodes(newRoot.get(), m_allFiles);
|
||||
setRootProjectNode(std::move(newRoot));
|
||||
|
||||
m_reader.resetData();
|
||||
|
||||
m_currentGuard = {};
|
||||
emitBuildSystemUpdated();
|
||||
|
||||
qCDebug(cmakeBuildSystemLog) << "All fallback CMake project data up to date.";
|
||||
}
|
||||
|
||||
void CMakeBuildSystem::updateFallbackProjectData()
|
||||
{
|
||||
qCDebug(cmakeBuildSystemLog) << "Updating fallback CMake project data";
|
||||
|
||||
QTC_ASSERT(m_treeScanner.isFinished() && !m_reader.isParsing(), return );
|
||||
|
||||
auto newRoot = generateProjectTree(m_allFiles, true);
|
||||
setRootProjectNode(std::move(newRoot));
|
||||
|
||||
qCDebug(cmakeBuildSystemLog) << "All fallback CMake project data up to date.";
|
||||
qCDebug(cmakeBuildSystemLog) << "Starting TreeScanner";
|
||||
QTC_CHECK(m_treeScanner.isFinished());
|
||||
if (m_treeScanner.asyncScanForFiles(projectDirectory()))
|
||||
Core::ProgressManager::addTask(m_treeScanner.future(),
|
||||
tr("Scan \"%1\" project tree")
|
||||
.arg(project()->displayName()),
|
||||
"CMake.Scan.Tree");
|
||||
}
|
||||
|
||||
void CMakeBuildSystem::updateCMakeConfiguration(QString &errorMessage)
|
||||
@@ -899,7 +895,7 @@ void CMakeBuildSystem::becameDirty()
|
||||
if (isParsing())
|
||||
return;
|
||||
|
||||
setParametersAndRequestParse(BuildDirParameters(cmakeBuildConfiguration()), REPARSE_SCAN);
|
||||
setParametersAndRequestParse(BuildDirParameters(cmakeBuildConfiguration()), REPARSE_DEFAULT);
|
||||
}
|
||||
|
||||
void CMakeBuildSystem::updateReparseParameters(const int parameters)
|
||||
|
||||
Reference in New Issue
Block a user