QmlProjectManager: Ignore build folder when parsing the project

Fixes: QDS-12519
Change-Id: Idff419d22eb7c13fdce27fcbed7f04426f85dc94
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
This commit is contained in:
Knud Dollereder
2024-04-26 10:32:10 +02:00
committed by Thomas Hartmann
parent 1f24a2fa4a
commit f08a31fd66
2 changed files with 36 additions and 8 deletions

View File

@@ -17,8 +17,9 @@
#include "coreplugin/actionmanager/actioncontainer.h" #include "coreplugin/actionmanager/actioncontainer.h"
#include <QDirIterator> #include <QDirIterator>
#include <QRegularExpression> #include <QFileInfo>
#include <QMenu> #include <QMenu>
#include <QRegularExpression>
#include <set> #include <set>
@@ -87,8 +88,8 @@ void CMakeGenerator::updateMenuAction()
CMakeGenerator::CMakeGenerator(QmlBuildSystem *bs, QObject *parent) CMakeGenerator::CMakeGenerator(QmlBuildSystem *bs, QObject *parent)
: QObject(parent) : QObject(parent)
, m_root(std::make_shared<Node>())
, m_buildSystem(bs) , m_buildSystem(bs)
, m_root(std::make_shared<Node>())
{} {}
const QmlProject *CMakeGenerator::qmlProject() const const QmlProject *CMakeGenerator::qmlProject() const
@@ -170,6 +171,9 @@ void CMakeGenerator::update(const QSet<QString> &added, const QSet<QString> &rem
std::set<NodePtr> dirtyModules; std::set<NodePtr> dirtyModules;
for (const QString &add : added) { for (const QString &add : added) {
const Utils::FilePath path = Utils::FilePath::fromString(add); const Utils::FilePath path = Utils::FilePath::fromString(add);
if (ignore(path.parentDir()))
continue;
if (auto node = findOrCreateNode(m_root, path.parentDir())) { if (auto node = findOrCreateNode(m_root, path.parentDir())) {
insertFile(node, path); insertFile(node, path);
if (auto module = findModuleFor(node)) if (auto module = findModuleFor(node))
@@ -208,10 +212,28 @@ bool CMakeGenerator::isResource(const Utils::FilePath &path) const
return suffixes.contains(path.suffix(), Qt::CaseInsensitive); return suffixes.contains(path.suffix(), Qt::CaseInsensitive);
} }
bool CMakeGenerator::ignoreFile(const Utils::FilePath &path) const bool CMakeGenerator::ignore(const Utils::FilePath &path) const
{ {
if (path.isFile()) {
static const QStringList suffixes = { "hints" }; static const QStringList suffixes = { "hints" };
return suffixes.contains(path.suffix(), Qt::CaseInsensitive); return suffixes.contains(path.suffix(), Qt::CaseInsensitive);
} else if (path.isDir()) {
if (!m_root->dir.exists())
return true;
static const QStringList fileNames = { "CMakeCache.txt", "build.ninja" };
Utils::FilePath dir = path;
while (dir.isChildOf(m_root->dir)) {
for (const QString& fileName : fileNames) {
Utils::FilePath checkFile = dir.pathAppended(fileName);
if (checkFile.exists())
return true;
}
dir = dir.parentDir();
}
}
return false;
} }
void CMakeGenerator::createCMakeFiles(const NodePtr &node) const void CMakeGenerator::createCMakeFiles(const NodePtr &node) const
@@ -445,6 +467,9 @@ void CMakeGenerator::parseNodeTree(NodePtr &generatorNode,
{ {
for (const auto *childNode : folderNode->nodes()) { for (const auto *childNode : folderNode->nodes()) {
if (const auto *subFolderNode = childNode->asFolderNode()) { if (const auto *subFolderNode = childNode->asFolderNode()) {
if (ignore(subFolderNode->filePath()))
continue;
NodePtr childGeneratorNode = std::make_shared<Node>(); NodePtr childGeneratorNode = std::make_shared<Node>();
childGeneratorNode->parent = generatorNode; childGeneratorNode->parent = generatorNode;
childGeneratorNode->dir = subFolderNode->filePath(); childGeneratorNode->dir = subFolderNode->filePath();
@@ -499,7 +524,10 @@ void CMakeGenerator::compareWithFileSystem(const NodePtr &node) const
while (iter.hasNext()) { while (iter.hasNext()) {
auto next = Utils::FilePath::fromString(iter.next()); auto next = Utils::FilePath::fromString(iter.next());
if (isResource(next) && !findFile(next) && !ignoreFile(next)) if (ignore(next.parentDir()))
continue;
if (isResource(next) && !findFile(next) && !ignore(next))
files.push_back(next); files.push_back(next);
} }

View File

@@ -47,7 +47,7 @@ public:
private: private:
bool isQml(const Utils::FilePath &path) const; bool isQml(const Utils::FilePath &path) const;
bool isResource(const Utils::FilePath &path) const; bool isResource(const Utils::FilePath &path) const;
bool ignoreFile(const Utils::FilePath &path) const; bool ignore(const Utils::FilePath &path) const;
void createCMakeFiles(const NodePtr &node) const; void createCMakeFiles(const NodePtr &node) const;
void createSourceFiles() const; void createSourceFiles() const;
@@ -70,12 +70,12 @@ private:
void compareWithFileSystem(const NodePtr &node) const; void compareWithFileSystem(const NodePtr &node) const;
bool m_enabled = false; bool m_enabled = false;
QmlBuildSystem *m_buildSystem = nullptr;
CMakeWriter::Ptr m_writer = {}; CMakeWriter::Ptr m_writer = {};
QString m_projectName = {}; QString m_projectName = {};
NodePtr m_root = {}; NodePtr m_root = {};
QStringList m_moduleNames = {}; QStringList m_moduleNames = {};
QmlBuildSystem *m_buildSystem = nullptr;
}; };
} // namespace GenerateCmake } // namespace GenerateCmake