forked from qt-creator/qt-creator
QMakeProjectManager: Use ProjectPartBuilder
...as the other project managers. This removes extra code paths, duplication and improves classification of source files (ambiguous headers). Change-Id: Iae05cbbc61ab2e5dd841ae617bec994e0a1e52d5 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
@@ -101,6 +101,11 @@ void BaseProjectPartBuilder::setPreCompiledHeaders(const QStringList &preCompile
|
|||||||
m_templatePart->precompiledHeaders = preCompiledHeaders;
|
m_templatePart->precompiledHeaders = preCompiledHeaders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BaseProjectPartBuilder::setSelectedForBuilding(bool yesno)
|
||||||
|
{
|
||||||
|
m_templatePart->selectedForBuilding = yesno;
|
||||||
|
}
|
||||||
|
|
||||||
void BaseProjectPartBuilder::setProjectFile(const QString &projectFile)
|
void BaseProjectPartBuilder::setProjectFile(const QString &projectFile)
|
||||||
{
|
{
|
||||||
m_templatePart->projectFile = projectFile;
|
m_templatePart->projectFile = projectFile;
|
||||||
@@ -262,13 +267,6 @@ private:
|
|||||||
|
|
||||||
} // anynomous
|
} // anynomous
|
||||||
|
|
||||||
void BaseProjectPartBuilder::evaluateToolChain(ProjectPart &projectPart,
|
|
||||||
const ToolChainInterface &toolChain)
|
|
||||||
{
|
|
||||||
ToolChainEvaluator evaluator(projectPart, toolChain);
|
|
||||||
evaluator.evaluate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void BaseProjectPartBuilder::createProjectPart(const ProjectFiles &projectFiles,
|
void BaseProjectPartBuilder::createProjectPart(const ProjectFiles &projectFiles,
|
||||||
const QString &partName,
|
const QString &partName,
|
||||||
ProjectPart::LanguageVersion languageVersion,
|
ProjectPart::LanguageVersion languageVersion,
|
||||||
@@ -281,8 +279,10 @@ void BaseProjectPartBuilder::createProjectPart(const ProjectFiles &projectFiles,
|
|||||||
QTC_ASSERT(part->project, return);
|
QTC_ASSERT(part->project, return);
|
||||||
|
|
||||||
// TODO: If not toolchain is set, show a warning
|
// TODO: If not toolchain is set, show a warning
|
||||||
if (const ToolChainInterfacePtr toolChain = selectToolChain(languageVersion))
|
if (const ToolChainInterfacePtr toolChain = selectToolChain(languageVersion)) {
|
||||||
evaluateToolChain(*part.data(), *toolChain.get());
|
ToolChainEvaluator evaluator(*part.data(), *toolChain.get());
|
||||||
|
evaluator.evaluate();
|
||||||
|
}
|
||||||
|
|
||||||
part->languageExtensions |= languageExtensions;
|
part->languageExtensions |= languageExtensions;
|
||||||
part->updateLanguageFeatures();
|
part->updateLanguageFeatures();
|
||||||
|
|||||||
@@ -60,13 +60,12 @@ public:
|
|||||||
|
|
||||||
void setPreCompiledHeaders(const QStringList &preCompiledHeaders);
|
void setPreCompiledHeaders(const QStringList &preCompiledHeaders);
|
||||||
|
|
||||||
|
void setSelectedForBuilding(bool yesno);
|
||||||
|
|
||||||
using FileClassifier = std::function<ProjectFile::Kind (const QString &filePath)>;
|
using FileClassifier = std::function<ProjectFile::Kind (const QString &filePath)>;
|
||||||
QList<Core::Id> createProjectPartsForFiles(const QStringList &filePaths,
|
QList<Core::Id> createProjectPartsForFiles(const QStringList &filePaths,
|
||||||
FileClassifier fileClassifier = FileClassifier());
|
FileClassifier fileClassifier = FileClassifier());
|
||||||
|
|
||||||
static void evaluateToolChain(ProjectPart &projectPart,
|
|
||||||
const ToolChainInterface &selectToolChain);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void createProjectPart(const ProjectFiles &projectFiles,
|
void createProjectPart(const ProjectFiles &projectFiles,
|
||||||
const QString &partName,
|
const QString &partName,
|
||||||
|
|||||||
@@ -140,13 +140,4 @@ ProjectPartBuilder::ProjectPartBuilder(ProjectInfo &projectInfo)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProjectPartBuilder::evaluateToolChain(ProjectPart &projectPart,
|
|
||||||
ProjectExplorer::ToolChain &toolChain,
|
|
||||||
const ProjectExplorer::Kit *kit,
|
|
||||||
const QStringList commandLineFlags)
|
|
||||||
{
|
|
||||||
const ToolChainImpl toolChainImpl(toolChain, kit, commandLineFlags);
|
|
||||||
BaseProjectPartBuilder::evaluateToolChain(projectPart, toolChainImpl);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace CppTools
|
} // namespace CppTools
|
||||||
|
|||||||
@@ -29,11 +29,6 @@
|
|||||||
|
|
||||||
#include "cppbaseprojectpartbuilder.h"
|
#include "cppbaseprojectpartbuilder.h"
|
||||||
|
|
||||||
namespace ProjectExplorer {
|
|
||||||
class Kit;
|
|
||||||
class ToolChain;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace CppTools {
|
namespace CppTools {
|
||||||
|
|
||||||
class ProjectInfo;
|
class ProjectInfo;
|
||||||
@@ -42,11 +37,6 @@ class CPPTOOLS_EXPORT ProjectPartBuilder : public BaseProjectPartBuilder
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ProjectPartBuilder(ProjectInfo &projectInfo);
|
ProjectPartBuilder(ProjectInfo &projectInfo);
|
||||||
|
|
||||||
static void evaluateToolChain(ProjectPart &projectPart,
|
|
||||||
ProjectExplorer::ToolChain &toolChain,
|
|
||||||
const ProjectExplorer::Kit *kit,
|
|
||||||
const QStringList commandLineFlags);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace CppTools
|
} // namespace CppTools
|
||||||
|
|||||||
@@ -357,7 +357,6 @@ void QmakeProject::updateCodeModels()
|
|||||||
void QmakeProject::updateCppCodeModel()
|
void QmakeProject::updateCppCodeModel()
|
||||||
{
|
{
|
||||||
using ProjectPart = CppTools::ProjectPart;
|
using ProjectPart = CppTools::ProjectPart;
|
||||||
using ProjectFile = CppTools::ProjectFile;
|
|
||||||
|
|
||||||
m_toolChainWarnings.clear();
|
m_toolChainWarnings.clear();
|
||||||
|
|
||||||
@@ -380,95 +379,54 @@ void QmakeProject::updateCppCodeModel()
|
|||||||
FindQmakeProFiles findQmakeProFiles;
|
FindQmakeProFiles findQmakeProFiles;
|
||||||
const QList<QmakeProFileNode *> proFiles = findQmakeProFiles(rootProjectNode());
|
const QList<QmakeProFileNode *> proFiles = findQmakeProFiles(rootProjectNode());
|
||||||
CppTools::ProjectInfo projectInfo(this);
|
CppTools::ProjectInfo projectInfo(this);
|
||||||
|
CppTools::ProjectPartBuilder ppBuilder(projectInfo);
|
||||||
|
|
||||||
QList<ProjectExplorer::ExtraCompiler *> generators;
|
QList<ProjectExplorer::ExtraCompiler *> generators;
|
||||||
|
|
||||||
foreach (QmakeProFileNode *pro, proFiles) {
|
foreach (QmakeProFileNode *pro, proFiles) {
|
||||||
warnOnToolChainMismatch(pro);
|
warnOnToolChainMismatch(pro);
|
||||||
|
|
||||||
ProjectPart::Ptr templatePart(new ProjectPart);
|
ppBuilder.setDisplayName(pro->displayName());
|
||||||
templatePart->project = this;
|
ppBuilder.setProjectFile(pro->filePath().toString());
|
||||||
templatePart->displayName = pro->displayName();
|
ppBuilder.setCxxFlags(pro->variableValue(CppFlagsVar)); // TODO: Handle QMAKE_CFLAGS
|
||||||
templatePart->projectFile = pro->filePath().toString();
|
ppBuilder.setDefines(pro->cxxDefines());
|
||||||
templatePart->selectedForBuilding = pro->includedInExactParse();
|
ppBuilder.setPreCompiledHeaders(pro->variableValue(PrecompiledHeaderVar));
|
||||||
templatePart->projectDefines += pro->cxxDefines();
|
ppBuilder.setSelectedForBuilding(pro->includedInExactParse());
|
||||||
templatePart->precompiledHeaders.append(pro->variableValue(PrecompiledHeaderVar));
|
|
||||||
|
|
||||||
|
// Qt Version
|
||||||
if (pro->variableValue(ConfigVar).contains(QLatin1String("qt")))
|
if (pro->variableValue(ConfigVar).contains(QLatin1String("qt")))
|
||||||
templatePart->qtVersion = qtVersionForPart;
|
ppBuilder.setQtVersion(qtVersionForPart);
|
||||||
else
|
else
|
||||||
templatePart->qtVersion = ProjectPart::NoQt;
|
ppBuilder.setQtVersion(ProjectPart::NoQt);
|
||||||
|
|
||||||
|
// Header paths
|
||||||
|
CppTools::ProjectPartHeaderPaths headerPaths;
|
||||||
|
using CppToolsHeaderPath = CppTools::ProjectPartHeaderPath;
|
||||||
foreach (const QString &inc, pro->variableValue(IncludePathVar)) {
|
foreach (const QString &inc, pro->variableValue(IncludePathVar)) {
|
||||||
const auto headerPath
|
const auto headerPath = CppToolsHeaderPath(inc, CppToolsHeaderPath::IncludePath);
|
||||||
= CppTools::ProjectPartHeaderPath(inc, CppTools::ProjectPartHeaderPath::IncludePath);
|
if (!headerPaths.contains(headerPath))
|
||||||
if (!templatePart->headerPaths.contains(headerPath))
|
headerPaths += headerPath;
|
||||||
templatePart->headerPaths += headerPath;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qtVersion && !qtVersion->frameworkInstallPath().isEmpty()) {
|
if (qtVersion && !qtVersion->frameworkInstallPath().isEmpty()) {
|
||||||
templatePart->headerPaths += CppTools::ProjectPartHeaderPath(
|
headerPaths += CppToolsHeaderPath(qtVersion->frameworkInstallPath(),
|
||||||
qtVersion->frameworkInstallPath(),
|
CppToolsHeaderPath::FrameworkPath);
|
||||||
CppTools::ProjectPartHeaderPath::FrameworkPath);
|
|
||||||
}
|
}
|
||||||
|
ppBuilder.setHeaderPaths(headerPaths);
|
||||||
|
|
||||||
// TODO: there is no LANG_OBJCXX, so:
|
// Files and generators
|
||||||
const QStringList cxxflags = pro->variableValue(CppFlagsVar);
|
QStringList fileList = pro->variableValue(SourceVar);
|
||||||
if (ToolChain *t = ToolChainKitInformation::toolChain(k, ToolChain::Language::Cxx))
|
|
||||||
CppTools::ProjectPartBuilder::evaluateToolChain(*templatePart.data(), *t, k, cxxflags);
|
|
||||||
setProjectLanguage(ProjectExplorer::Constants::LANG_CXX, true);
|
|
||||||
|
|
||||||
ProjectPart::Ptr cppPart = templatePart->copy();
|
|
||||||
ProjectPart::Ptr objcppPart = templatePart->copy();
|
|
||||||
foreach (const QString &file, pro->variableValue(SourceVar)) {
|
|
||||||
const ProjectFile::Kind kind = ProjectFile::classify(file);
|
|
||||||
switch (kind) {
|
|
||||||
case ProjectFile::ObjCHeader:
|
|
||||||
case ProjectFile::ObjCSource:
|
|
||||||
case ProjectFile::ObjCXXHeader:
|
|
||||||
case ProjectFile::ObjCXXSource:
|
|
||||||
objcppPart->files << ProjectFile(file, kind);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
cppPart->files << ProjectFile(file, kind);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// generated files:
|
|
||||||
QList<ProjectExplorer::ExtraCompiler *> proGenerators = pro->extraCompilers();
|
QList<ProjectExplorer::ExtraCompiler *> proGenerators = pro->extraCompilers();
|
||||||
foreach (ProjectExplorer::ExtraCompiler *ec, proGenerators) {
|
foreach (ProjectExplorer::ExtraCompiler *ec, proGenerators) {
|
||||||
ec->forEachTarget([&](const Utils::FileName &generatedFile) {
|
ec->forEachTarget([&](const Utils::FileName &generatedFile) {
|
||||||
const QString name = generatedFile.toString();
|
fileList += generatedFile.toString();
|
||||||
const ProjectFile::Kind kind = ProjectFile::classify(name);
|
|
||||||
switch (kind) {
|
|
||||||
case ProjectFile::AmbiguousHeader:
|
|
||||||
case ProjectFile::CHeader:
|
|
||||||
case ProjectFile::CSource:
|
|
||||||
case ProjectFile::CXXHeader:
|
|
||||||
case ProjectFile::CXXSource:
|
|
||||||
cppPart->files << ProjectFile(name, kind);
|
|
||||||
break;
|
|
||||||
case ProjectFile::ObjCHeader:
|
|
||||||
case ProjectFile::ObjCSource:
|
|
||||||
case ProjectFile::ObjCXXHeader:
|
|
||||||
case ProjectFile::ObjCXXSource:
|
|
||||||
objcppPart->files << ProjectFile(name, kind);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
generators.append(proGenerators);
|
generators.append(proGenerators);
|
||||||
|
|
||||||
projectInfo.appendProjectPart(cppPart);
|
const QList<Core::Id> languages = ppBuilder.createProjectPartsForFiles(fileList);
|
||||||
|
foreach (const Core::Id &language, languages)
|
||||||
if (!objcppPart->files.isEmpty()) {
|
setProjectLanguage(language, true);
|
||||||
objcppPart->displayName += QLatin1String(" (ObjC++)");
|
|
||||||
objcppPart->languageExtensions |= ProjectPart::ObjectiveCExtensions;
|
|
||||||
projectInfo.appendProjectPart(objcppPart);
|
|
||||||
cppPart->displayName += QLatin1String(" (C++)");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CppTools::GeneratedCodeModelSupport::update(generators);
|
CppTools::GeneratedCodeModelSupport::update(generators);
|
||||||
|
|||||||
Reference in New Issue
Block a user