forked from qt-creator/qt-creator
CMake: make project file system tree scanner persistent
Project source tree is a same for all build configurations so it is a good idea to keep it persistent between CMake runs, configurations switches and so on. It safes a lot of time for big projects. Move more operations to the scanner thread: - Nodes filtering: skip .user files on top level of the project, skip well-known extensions and octet-streams: In most cases these are not required to be shown in the project tree. - Nodes sorting Fix small memory leak: we have .user in the scanner result. After this node filtered out, but is not feed (old code at the BuildDirManager::generateProjectTree()). Now .user file skips during scan without memory allocation at all. Allow user manually rescan project tree by call Build -> Rescan project tree. It runs CMake and Tree Scanner together: in most cases only CMake run requires but time to time (VCS update) full rescan also required. Change-Id: I4a6e6c897202da557509291c79932dd7751860e5 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
@@ -56,7 +56,8 @@ using namespace CMakeProjectManager::Internal;
|
||||
CMakeManager::CMakeManager() :
|
||||
m_runCMakeAction(new QAction(QIcon(), tr("Run CMake"), this)),
|
||||
m_clearCMakeCacheAction(new QAction(QIcon(), tr("Clear CMake Configuration"), this)),
|
||||
m_runCMakeActionContextMenu(new QAction(QIcon(), tr("Run CMake"), this))
|
||||
m_runCMakeActionContextMenu(new QAction(QIcon(), tr("Run CMake"), this)),
|
||||
m_rescanProjectAction(new QAction(QIcon(), tr("Rescan project"), this))
|
||||
{
|
||||
Core::ActionContainer *mbuild =
|
||||
Core::ActionManager::actionContainer(ProjectExplorer::Constants::M_BUILDPROJECT);
|
||||
@@ -93,6 +94,14 @@ CMakeManager::CMakeManager() :
|
||||
runCMake(ProjectTree::currentProject());
|
||||
});
|
||||
|
||||
command = Core::ActionManager::registerAction(m_rescanProjectAction,
|
||||
Constants::RESCANPROJECT, globalContext);
|
||||
command->setAttribute(Core::Command::CA_Hide);
|
||||
mbuild->addAction(command, ProjectExplorer::Constants::G_BUILD_DEPLOY);
|
||||
connect(m_rescanProjectAction, &QAction::triggered, [this]() {
|
||||
rescanProject(ProjectTree::currentProject());
|
||||
});
|
||||
|
||||
connect(SessionManager::instance(), &SessionManager::startupProjectChanged,
|
||||
this, &CMakeManager::updateCmakeActions);
|
||||
connect(BuildManager::instance(), &BuildManager::buildStateChanged,
|
||||
@@ -107,6 +116,7 @@ void CMakeManager::updateCmakeActions()
|
||||
const bool visible = project && !BuildManager::isBuilding(project);
|
||||
m_runCMakeAction->setVisible(visible);
|
||||
m_clearCMakeCacheAction->setVisible(visible);
|
||||
m_rescanProjectAction->setVisible(visible);
|
||||
}
|
||||
|
||||
void CMakeManager::clearCMakeCache(Project *project)
|
||||
@@ -134,6 +144,18 @@ void CMakeManager::runCMake(Project *project)
|
||||
cmakeProject->runCMake();
|
||||
}
|
||||
|
||||
void CMakeManager::rescanProject(Project *project)
|
||||
{
|
||||
if (!project)
|
||||
return;
|
||||
CMakeProject *cmakeProject = qobject_cast<CMakeProject *>(project);
|
||||
if (!cmakeProject || !cmakeProject->activeTarget() || !cmakeProject->activeTarget()->activeBuildConfiguration())
|
||||
return;
|
||||
|
||||
cmakeProject->scanProjectTree();
|
||||
cmakeProject->runCMake(); // by my experience: every rescan run requires cmake run too
|
||||
}
|
||||
|
||||
Project *CMakeManager::openProject(const QString &fileName, QString *errorString)
|
||||
{
|
||||
Utils::FileName file = Utils::FileName::fromString(fileName);
|
||||
|
Reference in New Issue
Block a user