forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/4.3'
Conflicts: src/plugins/genericprojectmanager/genericproject.cpp src/plugins/genericprojectmanager/genericproject.h src/plugins/projectexplorer/projectmodels.cpp Change-Id: I290cba328212cadd3c12909d1f2f3642d326a1ca
This commit is contained in:
@@ -75,7 +75,7 @@ const Utils::FileName BuildDirManager::workDirectory() const
|
||||
if (!m_tempDir) {
|
||||
m_tempDir.reset(new Utils::TemporaryDirectory("qtc-cmake-XXXXXXXX"));
|
||||
if (!m_tempDir->isValid())
|
||||
emit errorOccured(tr("Failed to create temporary directory \"%1\".").arg(m_tempDir->path()));
|
||||
emitErrorOccured(tr("Failed to create temporary directory \"%1\".").arg(m_tempDir->path()));
|
||||
}
|
||||
return Utils::FileName::fromString(m_tempDir->path());
|
||||
}
|
||||
@@ -86,6 +86,13 @@ void BuildDirManager::emitDataAvailable()
|
||||
emit dataAvailable();
|
||||
}
|
||||
|
||||
void BuildDirManager::emitErrorOccured(const QString &message) const
|
||||
{
|
||||
m_isHandlingError = true;
|
||||
emit errorOccured(message);
|
||||
m_isHandlingError = false;
|
||||
}
|
||||
|
||||
void BuildDirManager::updateReaderType(std::function<void()> todo)
|
||||
{
|
||||
BuildDirReader::Parameters p(m_buildConfiguration);
|
||||
@@ -98,7 +105,7 @@ void BuildDirManager::updateReaderType(std::function<void()> todo)
|
||||
connect(m_reader.get(), &BuildDirReader::dataAvailable,
|
||||
this, &BuildDirManager::emitDataAvailable);
|
||||
connect(m_reader.get(), &BuildDirReader::errorOccured,
|
||||
this, &BuildDirManager::errorOccured);
|
||||
this, &BuildDirManager::emitErrorOccured);
|
||||
connect(m_reader.get(), &BuildDirReader::dirty, this, &BuildDirManager::becameDirty);
|
||||
}
|
||||
m_reader->setParameters(p);
|
||||
@@ -216,6 +223,8 @@ void BuildDirManager::becameDirty()
|
||||
|
||||
void BuildDirManager::forceReparse()
|
||||
{
|
||||
QTC_ASSERT(!m_isHandlingError, return);
|
||||
|
||||
if (m_buildConfiguration->target()->activeBuildConfiguration() != m_buildConfiguration)
|
||||
return;
|
||||
|
||||
@@ -228,6 +237,8 @@ void BuildDirManager::forceReparse()
|
||||
|
||||
void BuildDirManager::resetData()
|
||||
{
|
||||
QTC_ASSERT(!m_isHandlingError, return);
|
||||
|
||||
if (m_reader)
|
||||
m_reader->resetData();
|
||||
|
||||
@@ -259,6 +270,7 @@ bool BuildDirManager::persistCMakeState()
|
||||
|
||||
void BuildDirManager::generateProjectTree(CMakeProjectNode *root, const QList<const FileNode *> &allFiles)
|
||||
{
|
||||
QTC_ASSERT(!m_isHandlingError, return);
|
||||
QTC_ASSERT(m_reader, return);
|
||||
|
||||
const Utils::FileName projectFile = m_buildConfiguration->target()->project()->projectFilePath();
|
||||
@@ -272,6 +284,7 @@ void BuildDirManager::generateProjectTree(CMakeProjectNode *root, const QList<co
|
||||
|
||||
void BuildDirManager::updateCodeModel(CppTools::RawProjectParts &rpps)
|
||||
{
|
||||
QTC_ASSERT(!m_isHandlingError, return);
|
||||
QTC_ASSERT(m_reader, return);
|
||||
return m_reader->updateCodeModel(rpps);
|
||||
}
|
||||
@@ -283,6 +296,8 @@ void BuildDirManager::parse()
|
||||
|
||||
void BuildDirManager::clearCache()
|
||||
{
|
||||
QTC_ASSERT(!m_isHandlingError, return);
|
||||
|
||||
auto cmakeCache = Utils::FileName(workDirectory()).appendPath(QLatin1String("CMakeCache.txt"));
|
||||
auto cmakeFiles = Utils::FileName(workDirectory()).appendPath(QLatin1String("CMakeFiles"));
|
||||
|
||||
@@ -298,6 +313,8 @@ void BuildDirManager::clearCache()
|
||||
|
||||
QList<CMakeBuildTarget> BuildDirManager::buildTargets() const
|
||||
{
|
||||
QTC_ASSERT(!m_isHandlingError, return {});
|
||||
|
||||
if (!m_reader)
|
||||
return QList<CMakeBuildTarget>();
|
||||
if (m_buildTargets.isEmpty())
|
||||
@@ -307,6 +324,8 @@ QList<CMakeBuildTarget> BuildDirManager::buildTargets() const
|
||||
|
||||
CMakeConfig BuildDirManager::parsedConfiguration() const
|
||||
{
|
||||
QTC_ASSERT(!m_isHandlingError, return {});
|
||||
|
||||
if (!m_reader)
|
||||
return m_cmakeCache;
|
||||
if (m_cmakeCache.isEmpty())
|
||||
@@ -389,6 +408,9 @@ void BuildDirManager::checkConfiguration()
|
||||
|
||||
void BuildDirManager::maybeForceReparse()
|
||||
{
|
||||
if (m_isHandlingError)
|
||||
return;
|
||||
|
||||
if (!m_reader || !m_reader->hasData()) {
|
||||
forceReparse();
|
||||
return;
|
||||
|
||||
@@ -86,6 +86,7 @@ signals:
|
||||
|
||||
private:
|
||||
void emitDataAvailable();
|
||||
void emitErrorOccured(const QString &message) const;
|
||||
void checkConfiguration();
|
||||
|
||||
const Utils::FileName workDirectory() const;
|
||||
@@ -109,6 +110,7 @@ private:
|
||||
std::unique_ptr<BuildDirReader> m_reader;
|
||||
|
||||
mutable QList<CMakeBuildTarget> m_buildTargets;
|
||||
mutable bool m_isHandlingError = false;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
@@ -185,7 +185,6 @@ void CMakeProject::updateProjectData(CMakeBuildConfiguration *bc)
|
||||
|
||||
updateQmlJSCodeModel();
|
||||
|
||||
emit displayNameChanged();
|
||||
emit fileListChanged();
|
||||
|
||||
emit bc->emitBuildTypeChanged();
|
||||
@@ -220,7 +219,7 @@ void CMakeProject::updateQmlJSCodeModel()
|
||||
}
|
||||
|
||||
foreach (const QString &cmakeImport, CMakeConfigItem::cmakeSplitValue(cmakeImports))
|
||||
projectInfo.importPaths.maybeInsert(FileName::fromString(cmakeImport),QmlJS::Dialect::Qml);
|
||||
projectInfo.importPaths.maybeInsert(FileName::fromString(cmakeImport), QmlJS::Dialect::Qml);
|
||||
|
||||
modelManager->updateProjectInfo(projectInfo, this);
|
||||
}
|
||||
@@ -307,21 +306,6 @@ QString CMakeProject::displayName() const
|
||||
return root ? root->displayName() : projectDirectory().fileName();
|
||||
}
|
||||
|
||||
QStringList CMakeProject::files(FilesMode fileMode) const
|
||||
{
|
||||
QStringList result;
|
||||
if (ProjectNode *rpn = rootProjectNode()) {
|
||||
rpn->forEachNode([&](const FileNode *fn) {
|
||||
const bool isGenerated = fn->isGenerated();
|
||||
if ((fileMode & Project::SourceFiles) && !isGenerated)
|
||||
result.append(fn->filePath().toString());
|
||||
if ((fileMode & Project::GeneratedFiles) && isGenerated)
|
||||
result.append(fn->filePath().toString());
|
||||
});
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
Project::RestoreResult CMakeProject::fromMap(const QVariantMap &map, QString *errorMessage)
|
||||
{
|
||||
RestoreResult result = Project::fromMap(map, errorMessage);
|
||||
|
||||
@@ -88,7 +88,6 @@ public:
|
||||
|
||||
QString displayName() const final;
|
||||
|
||||
QStringList files(FilesMode fileMode) const final;
|
||||
QStringList buildTargetTitles(bool runnable = false) const;
|
||||
bool hasBuildTarget(const QString &title) const;
|
||||
|
||||
|
||||
@@ -62,7 +62,8 @@ const char TITLE_KEY[] = "CMakeProjectManager.CMakeRunConfiguation.Title";
|
||||
CMakeRunConfiguration::CMakeRunConfiguration(Target *parent, Core::Id id, const QString &target,
|
||||
const Utils::FileName &workingDirectory, const QString &title) :
|
||||
RunConfiguration(parent, id),
|
||||
m_buildTarget(target),
|
||||
m_buildSystemTarget(target),
|
||||
m_executable(target),
|
||||
m_title(title)
|
||||
{
|
||||
addExtraAspect(new LocalEnvironmentAspect(this, LocalEnvironmentAspect::BaseEnvironmentModifier()));
|
||||
@@ -78,7 +79,8 @@ CMakeRunConfiguration::CMakeRunConfiguration(Target *parent, Core::Id id, const
|
||||
|
||||
CMakeRunConfiguration::CMakeRunConfiguration(Target *parent, CMakeRunConfiguration *source) :
|
||||
RunConfiguration(parent, source),
|
||||
m_buildTarget(source->m_buildTarget),
|
||||
m_buildSystemTarget(source->m_buildSystemTarget),
|
||||
m_executable(source->m_executable),
|
||||
m_title(source->m_title),
|
||||
m_enabled(source->m_enabled)
|
||||
{
|
||||
@@ -93,7 +95,7 @@ void CMakeRunConfiguration::ctor()
|
||||
Runnable CMakeRunConfiguration::runnable() const
|
||||
{
|
||||
StandardRunnable r;
|
||||
r.executable = m_buildTarget;
|
||||
r.executable = m_executable;
|
||||
r.commandLineArguments = extraAspect<ArgumentsAspect>()->arguments();
|
||||
r.workingDirectory = extraAspect<WorkingDirectoryAspect>()->workingDirectory().toString();
|
||||
r.environment = extraAspect<LocalEnvironmentAspect>()->environment();
|
||||
@@ -103,9 +105,9 @@ Runnable CMakeRunConfiguration::runnable() const
|
||||
|
||||
QString CMakeRunConfiguration::baseWorkingDirectory() const
|
||||
{
|
||||
const QString exe = m_buildTarget;
|
||||
const QString exe = m_executable;
|
||||
if (!exe.isEmpty())
|
||||
return QFileInfo(m_buildTarget).absolutePath();
|
||||
return QFileInfo(m_executable).absolutePath();
|
||||
return QString();
|
||||
}
|
||||
|
||||
@@ -116,7 +118,7 @@ QString CMakeRunConfiguration::title() const
|
||||
|
||||
void CMakeRunConfiguration::setExecutable(const QString &executable)
|
||||
{
|
||||
m_buildTarget = executable;
|
||||
m_executable = executable;
|
||||
}
|
||||
|
||||
void CMakeRunConfiguration::setBaseWorkingDirectory(const Utils::FileName &wd)
|
||||
|
||||
@@ -56,7 +56,7 @@ public:
|
||||
bool isEnabled() const override;
|
||||
QString disabledReason() const override;
|
||||
|
||||
QString buildSystemTarget() const final { return m_buildTarget; }
|
||||
QString buildSystemTarget() const final { return m_buildSystemTarget; }
|
||||
|
||||
protected:
|
||||
CMakeRunConfiguration(ProjectExplorer::Target *parent, CMakeRunConfiguration *source);
|
||||
@@ -67,7 +67,8 @@ private:
|
||||
QString baseWorkingDirectory() const;
|
||||
void ctor();
|
||||
|
||||
QString m_buildTarget;
|
||||
const QString m_buildSystemTarget;
|
||||
QString m_executable;
|
||||
QString m_title;
|
||||
bool m_enabled = true;
|
||||
};
|
||||
|
||||
@@ -284,8 +284,8 @@ void ServerModeReader::generateProjectTree(CMakeProjectNode *root,
|
||||
addCMakeInputs(root, m_parameters.sourceDirectory, m_parameters.buildDirectory,
|
||||
cmakeFilesSource, cmakeFilesBuild, cmakeFilesOther);
|
||||
|
||||
addCMakeLists(root, cmakeLists);
|
||||
addProjects(root, m_projects, allFiles);
|
||||
QHash<Utils::FileName, ProjectNode *> cmakeListsNodes = addCMakeLists(root, cmakeLists);
|
||||
addProjects(cmakeListsNodes, m_projects, allFiles);
|
||||
}
|
||||
|
||||
void ServerModeReader::updateCodeModel(CppTools::RawProjectParts &rpps)
|
||||
@@ -488,6 +488,8 @@ void ServerModeReader::extractCMakeInputsData(const QVariantMap &data)
|
||||
QTC_ASSERT(src == m_parameters.sourceDirectory, return);
|
||||
QDir srcDir(src.toString());
|
||||
|
||||
m_cmakeFiles.clear();
|
||||
|
||||
const QVariantList buildFiles = data.value("buildFiles").toList();
|
||||
for (const QVariant &bf : buildFiles) {
|
||||
const QVariantMap §ion = bf.toMap();
|
||||
@@ -528,30 +530,36 @@ void ServerModeReader::extractCacheData(const QVariantMap &data)
|
||||
m_cmakeCache = config;
|
||||
}
|
||||
|
||||
void ServerModeReader::addCMakeLists(CMakeProjectNode *root, const QList<FileNode *> &cmakeLists)
|
||||
QHash<Utils::FileName, ProjectNode *>
|
||||
ServerModeReader::addCMakeLists(CMakeProjectNode *root, const QList<FileNode *> &cmakeLists)
|
||||
{
|
||||
const QDir baseDir = QDir(m_parameters.sourceDirectory.toString());
|
||||
QHash<Utils::FileName, ProjectNode *> cmakeListsNodes;
|
||||
cmakeListsNodes.insert(root->filePath(), root);
|
||||
|
||||
const QSet<Utils::FileName> cmakeDirs
|
||||
= Utils::transform<QSet>(cmakeLists, [](const Node *n) { return n->filePath().parentDir(); });
|
||||
root->addNestedNodes(cmakeLists, Utils::FileName(),
|
||||
[&cmakeLists](const Utils::FileName &fp) -> ProjectExplorer::FolderNode * {
|
||||
if (Utils::contains(cmakeLists, [&fp](const FileNode *fn) { return fn->filePath().parentDir() == fp; }))
|
||||
return new CMakeListsNode(fp);
|
||||
else
|
||||
return new FolderNode(fp);
|
||||
[&cmakeDirs, &cmakeListsNodes](const Utils::FileName &fp)
|
||||
-> ProjectExplorer::FolderNode * {
|
||||
FolderNode *fn = nullptr;
|
||||
if (cmakeDirs.contains(fp)) {
|
||||
CMakeListsNode *n = new CMakeListsNode(fp);
|
||||
cmakeListsNodes.insert(fp, n);
|
||||
fn = n;
|
||||
} else {
|
||||
fn = new FolderNode(fp);
|
||||
}
|
||||
return fn;
|
||||
});
|
||||
root->compress();
|
||||
return cmakeListsNodes;
|
||||
}
|
||||
|
||||
static ProjectNode *findCMakeNode(ProjectNode *root, const Utils::FileName &dir)
|
||||
static ProjectNode *createProjectNode(const QHash<Utils::FileName, ProjectNode *> &cmakeListsNodes,
|
||||
const Utils::FileName &dir, const QString &displayName)
|
||||
{
|
||||
Node *n = root->findNode([&dir](Node *n) { return n->asProjectNode() && n->filePath() == dir; });
|
||||
return n ? n->asProjectNode() : nullptr;
|
||||
}
|
||||
|
||||
static ProjectNode *findOrCreateProjectNode(ProjectNode *root, const Utils::FileName &dir,
|
||||
const QString &displayName)
|
||||
{
|
||||
ProjectNode *cmln = findCMakeNode(root, dir);
|
||||
QTC_ASSERT(cmln, return nullptr);
|
||||
ProjectNode *cmln = cmakeListsNodes.value(dir);
|
||||
QTC_ASSERT(cmln, qDebug() << dir.toUserOutput() ; return nullptr);
|
||||
|
||||
Utils::FileName projectName = dir;
|
||||
projectName.appendPath(".project::" + displayName);
|
||||
@@ -565,7 +573,7 @@ static ProjectNode *findOrCreateProjectNode(ProjectNode *root, const Utils::File
|
||||
return pn;
|
||||
}
|
||||
|
||||
void ServerModeReader::addProjects(CMakeProjectNode *root,
|
||||
void ServerModeReader::addProjects(const QHash<Utils::FileName, ProjectNode *> &cmakeListsNodes,
|
||||
const QList<Project *> &projects,
|
||||
const QList<const FileNode *> &allFiles)
|
||||
{
|
||||
@@ -577,16 +585,16 @@ void ServerModeReader::addProjects(CMakeProjectNode *root,
|
||||
}
|
||||
|
||||
for (const Project *p : projects) {
|
||||
ProjectNode *pNode = findOrCreateProjectNode(root, p->sourceDirectory, p->name);
|
||||
QTC_ASSERT(pNode, continue);
|
||||
addTargets(root, p->targets, includeFiles);
|
||||
ProjectNode *pNode = createProjectNode(cmakeListsNodes, p->sourceDirectory, p->name);
|
||||
QTC_ASSERT(pNode, qDebug() << p->sourceDirectory.toUserOutput() ; continue);
|
||||
addTargets(cmakeListsNodes, p->targets, includeFiles);
|
||||
}
|
||||
}
|
||||
|
||||
static CMakeTargetNode *findOrCreateTargetNode(ProjectNode *root, const Utils::FileName &dir,
|
||||
const QString &displayName)
|
||||
static CMakeTargetNode *createTargetNode(const QHash<Utils::FileName, ProjectNode *> &cmakeListsNodes,
|
||||
const Utils::FileName &dir, const QString &displayName)
|
||||
{
|
||||
ProjectNode *cmln = findCMakeNode(root, dir);
|
||||
ProjectNode *cmln = cmakeListsNodes.value(dir);
|
||||
QTC_ASSERT(cmln, return nullptr);
|
||||
|
||||
Utils::FileName targetName = dir;
|
||||
@@ -601,12 +609,12 @@ static CMakeTargetNode *findOrCreateTargetNode(ProjectNode *root, const Utils::F
|
||||
return tn;
|
||||
}
|
||||
|
||||
void ServerModeReader::addTargets(CMakeProjectNode *root,
|
||||
void ServerModeReader::addTargets(const QHash<Utils::FileName, ProjectNode *> &cmakeListsNodes,
|
||||
const QList<ServerModeReader::Target *> &targets,
|
||||
const QHash<FileName, QList<const FileNode *>> &headers)
|
||||
{
|
||||
for (const Target *t : targets) {
|
||||
CMakeTargetNode *tNode = findOrCreateTargetNode(root, t->sourceDirectory, t->name);
|
||||
CMakeTargetNode *tNode = createTargetNode(cmakeListsNodes, t->sourceDirectory, t->name);
|
||||
QTC_ASSERT(tNode, qDebug() << "No target node for" << t->sourceDirectory << t->name; return);
|
||||
tNode->setTargetInformation(t->artifacts, t->type);
|
||||
addFileGroups(tNode, t->sourceDirectory, t->buildDirectory, t->fileGroups, headers);
|
||||
|
||||
@@ -113,10 +113,13 @@ private:
|
||||
void extractCMakeInputsData(const QVariantMap &data);
|
||||
void extractCacheData(const QVariantMap &data);
|
||||
|
||||
void addCMakeLists(CMakeProjectNode *root, const QList<ProjectExplorer::FileNode *> &cmakeLists);
|
||||
void addProjects(CMakeProjectNode *root, const QList<Project *> &projects,
|
||||
QHash<Utils::FileName, ProjectExplorer::ProjectNode *>
|
||||
addCMakeLists(CMakeProjectNode *root, const QList<ProjectExplorer::FileNode *> &cmakeLists);
|
||||
void addProjects(const QHash<Utils::FileName, ProjectExplorer::ProjectNode *> &cmakeListsNodes,
|
||||
const QList<Project *> &projects,
|
||||
const QList<const ProjectExplorer::FileNode *> &allFiles);
|
||||
void addTargets(CMakeProjectNode *root, const QList<Target *> &targets,
|
||||
void addTargets(const QHash<Utils::FileName, ProjectExplorer::ProjectNode *> &cmakeListsNodes,
|
||||
const QList<Target *> &targets,
|
||||
const QHash<Utils::FileName, QList<const ProjectExplorer::FileNode *>> &headers);
|
||||
void addFileGroups(ProjectExplorer::ProjectNode *targetRoot,
|
||||
const Utils::FileName &sourceDirectory,
|
||||
|
||||
Reference in New Issue
Block a user