QbsProjectManager: Fix precompiled header collection

Precompiled headers are designated via file tags since qbs 1.6, whereas
the code here still assumed the earlier, property-based approach.

Task-number: QTCREATORBUG-17195
Change-Id: If379fab5fbe63c7e3128d2ab1c53d08737cdcff1
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
Christian Kandeler
2016-11-23 12:17:02 +01:00
parent a52ef5a380
commit 0516f776cc

View File

@@ -72,6 +72,8 @@
#include <QMessageBox> #include <QMessageBox>
#include <QVariantMap> #include <QVariantMap>
#include <algorithm>
using namespace Core; using namespace Core;
using namespace ProjectExplorer; using namespace ProjectExplorer;
using namespace Utils; using namespace Utils;
@@ -91,7 +93,6 @@ static const char CONFIG_INCLUDEPATHS[] = "includePaths";
static const char CONFIG_SYSTEM_INCLUDEPATHS[] = "systemIncludePaths"; static const char CONFIG_SYSTEM_INCLUDEPATHS[] = "systemIncludePaths";
static const char CONFIG_FRAMEWORKPATHS[] = "frameworkPaths"; static const char CONFIG_FRAMEWORKPATHS[] = "frameworkPaths";
static const char CONFIG_SYSTEM_FRAMEWORKPATHS[] = "systemFrameworkPaths"; static const char CONFIG_SYSTEM_FRAMEWORKPATHS[] = "systemFrameworkPaths";
static const char CONFIG_PRECOMPILEDHEADER[] = "precompiledHeader";
// -------------------------------------------------------------------- // --------------------------------------------------------------------
// QbsProject: // QbsProject:
@@ -886,6 +887,27 @@ void QbsProject::updateCppCodeModel()
qDeleteAll(m_extraCompilers); qDeleteAll(m_extraCompilers);
m_extraCompilers.clear(); m_extraCompilers.clear();
foreach (const qbs::ProductData &prd, m_projectData.allProducts()) { foreach (const qbs::ProductData &prd, m_projectData.allProducts()) {
QString cPch;
QString cxxPch;
QString objcPch;
QString objcxxPch;
const auto &pchFinder = [&cPch, &cxxPch, &objcPch, &objcxxPch](const qbs::ArtifactData &a) {
if (a.fileTags().contains("c_pch_src"))
cPch = a.filePath();
else if (a.fileTags().contains("cpp_pch_src"))
cxxPch = a.filePath();
else if (a.fileTags().contains("objc_pch_src"))
objcPch = a.filePath();
else if (a.fileTags().contains("objcpp_pch_src"))
objcxxPch = a.filePath();
};
std::for_each(prd.generatedArtifacts().cbegin(), prd.generatedArtifacts().cend(),
pchFinder);
foreach (const qbs::GroupData &grp, prd.groups()) {
std::for_each(grp.allSourceArtifacts().cbegin(), grp.allSourceArtifacts().cend(),
pchFinder);
}
foreach (const qbs::GroupData &grp, prd.groups()) { foreach (const qbs::GroupData &grp, prd.groups()) {
const qbs::PropertyMap &props = grp.properties(); const qbs::PropertyMap &props = grp.properties();
@@ -931,18 +953,26 @@ void QbsProject::updateCppCodeModel()
ppBuilder.setHeaderPaths(grpHeaderPaths); ppBuilder.setHeaderPaths(grpHeaderPaths);
const QString pch = props.getModuleProperty(QLatin1String(CONFIG_CPP_MODULE),
QLatin1String(CONFIG_PRECOMPILEDHEADER)).toString();
ppBuilder.setPreCompiledHeaders(QStringList() << pch);
ppBuilder.setDisplayName(grp.name()); ppBuilder.setDisplayName(grp.name());
ppBuilder.setProjectFile(groupLocationToProjectFile(grp.location())); ppBuilder.setProjectFile(groupLocationToProjectFile(grp.location()));
QHash<QString, qbs::ArtifactData> filePathToSourceArtifact; QHash<QString, qbs::ArtifactData> filePathToSourceArtifact;
bool hasCFiles = false;
bool hasCxxFiles = false;
bool hasObjcFiles = false;
bool hasObjcxxFiles = false;
foreach (const qbs::ArtifactData &source, grp.allSourceArtifacts()) { foreach (const qbs::ArtifactData &source, grp.allSourceArtifacts()) {
filePathToSourceArtifact.insert(source.filePath(), source); filePathToSourceArtifact.insert(source.filePath(), source);
foreach (const QString &tag, source.fileTags()) { foreach (const QString &tag, source.fileTags()) {
if (tag == "c")
hasCFiles = true;
else if (tag == "cpp")
hasCxxFiles = true;
else if (tag == "objc")
hasObjcFiles = true;
else if (tag == "objcpp")
hasObjcxxFiles = true;
for (auto i = factoriesBegin; i != factoriesEnd; ++i) { for (auto i = factoriesBegin; i != factoriesEnd; ++i) {
if ((*i)->sourceTag() != tag) if ((*i)->sourceTag() != tag)
continue; continue;
@@ -964,6 +994,31 @@ void QbsProject::updateCppCodeModel()
} }
} }
QStringList pchFiles;
if (hasCFiles && props.getModuleProperty("cpp", "useCPrecompiledHeader").toBool()
&& !cPch.isEmpty()) {
pchFiles << cPch;
}
if (hasCxxFiles && props.getModuleProperty("cpp", "useCxxPrecompiledHeader").toBool()
&& !cxxPch.isEmpty()) {
pchFiles << cxxPch;
}
if (hasObjcFiles && props.getModuleProperty("cpp", "useObjcPrecompiledHeader").toBool()
&& !objcPch.isEmpty()) {
pchFiles << objcPch;
}
if (hasObjcxxFiles
&& props.getModuleProperty("cpp", "useObjcxxPrecompiledHeader").toBool()
&& !objcxxPch.isEmpty()) {
pchFiles << objcxxPch;
}
if (pchFiles.count() > 1) {
qCWarning(qbsPmLog) << "More than one pch file enabled for source files in group"
<< grp.name() << "in product" << prd.name();
qCWarning(qbsPmLog) << "Expect problems with code model";
}
ppBuilder.setPreCompiledHeaders(pchFiles);
const QList<Id> languages = ppBuilder.createProjectPartsForFiles( const QList<Id> languages = ppBuilder.createProjectPartsForFiles(
grp.allFilePaths(), grp.allFilePaths(),
[filePathToSourceArtifact](const QString &filePath) { [filePathToSourceArtifact](const QString &filePath) {