summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2014-02-05 16:44:35 +0100
committerErik Verbruggen <erik.verbruggen@digia.com>2014-02-27 15:58:17 +0100
commit346e84d219448bb583dbc4ad71a2850db30e1cc8 (patch)
treed0090198a6aa61c33e6c05226916658a04cfc2bc /src
parent36dccb42faf256756d94b4ad797bfb40bb449f07 (diff)
downloadqt-creator-346e84d219448bb583dbc4ad71a2850db30e1cc8.tar.gz
C++: introduce a project config file field in the projectPart.
This field is used by the generic project manager which passes the ".config" file in it. The advantage is that both the SnapshotUpdater and the clang code model do not need to do anything smart, but can pass it directly to the preprocessor. Task-number: QTCREATORBUG-11390 Change-Id: I44fc7b20afd28fb59608412f2cce86af6f7e7d6b Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/clangcodemodel/clangutils.cpp3
-rw-r--r--src/plugins/cppeditor/cppcodemodelinspectordialog.cpp19
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp7
-rw-r--r--src/plugins/cpptools/cppmodelmanagerinterface.cpp20
-rw-r--r--src/plugins/cpptools/cppmodelmanagerinterface.h4
-rw-r--r--src/plugins/cpptools/cppsnapshotupdater.cpp9
-rw-r--r--src/plugins/cpptools/cppsnapshotupdater.h1
-rw-r--r--src/plugins/genericprojectmanager/genericproject.cpp16
-rw-r--r--src/plugins/genericprojectmanager/genericproject.h2
-rw-r--r--src/plugins/genericprojectmanager/genericprojectwizard.cpp7
10 files changed, 62 insertions, 26 deletions
diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp
index f594486de3..dae5f1a835 100644
--- a/src/plugins/clangcodemodel/clangutils.cpp
+++ b/src/plugins/clangcodemodel/clangutils.cpp
@@ -198,6 +198,9 @@ QStringList createClangOptions(const ProjectPart::Ptr &pPart, ProjectFile::Kind
result << QLatin1String("-fmacro-backtrace-limit=0");
result << QLatin1String("-fretain-comments-from-system-headers");
+ if (!pPart->projectConfigFile.isEmpty())
+ result << QLatin1String("-include") << pPart->projectConfigFile;
+
result << buildDefines(pPart->toolchainDefines, false);
result << buildDefines(pPart->projectDefines, false);
diff --git a/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp b/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp
index 461ce25a8e..c602bd25d0 100644
--- a/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp
+++ b/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp
@@ -560,14 +560,16 @@ void CppCodeModelInspectorDumper::dumpProjectInfos(
projectName = project->displayName();
projectFilePath = project->projectFilePath();
}
+ if (!part->projectConfigFile.isEmpty())
+ m_out << i3 << "Project Config File: " << part->projectConfigFile << "\n";
m_out << i2 << "Project Part \"" << part->projectFile << "\"{{{3\n";
- m_out << i3 << "Project Part Name: " << part->displayName << "\n";
- m_out << i3 << "Project Name : " << projectName << "\n";
- m_out << i3 << "Project File : " << projectFilePath << "\n";
- m_out << i3 << "C Version : " << toString(part->cVersion) << "\n";
- m_out << i3 << "CXX Version : " << toString(part->cxxVersion) << "\n";
- m_out << i3 << "CXX Extensions : " << toString(part->cxxExtensions) << "\n";
- m_out << i3 << "Qt Version : " << toString(part->qtVersion) << "\n";
+ m_out << i3 << "Project Part Name : " << part->displayName << "\n";
+ m_out << i3 << "Project Name : " << projectName << "\n";
+ m_out << i3 << "Project File : " << projectFilePath << "\n";
+ m_out << i3 << "C Version : " << toString(part->cVersion) << "\n";
+ m_out << i3 << "CXX Version : " << toString(part->cxxVersion) << "\n";
+ m_out << i3 << "CXX Extensions : " << toString(part->cxxExtensions) << "\n";
+ m_out << i3 << "Qt Version : " << toString(part->qtVersion) << "\n";
if (!part->files.isEmpty()) {
m_out << i3 << "Files:{{{4\n";
@@ -2246,6 +2248,9 @@ void CppCodeModelInspectorDialog::updateProjectPartData(const ProjectPart::Ptr &
<< qMakePair(QString::fromLatin1("CXX Extensions"), toString(part->cxxExtensions))
<< qMakePair(QString::fromLatin1("Qt Version"), toString(part->qtVersion))
;
+ if (!part->projectConfigFile.isEmpty())
+ table.prepend(qMakePair(QString::fromLatin1("Project Config File"),
+ part->projectConfigFile));
m_partGenericInfoModel->configure(table);
resizeColumns<KeyValueModel>(m_ui->partGeneralView);
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 5a0e96a369..1363bef7b6 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -65,7 +65,7 @@ namespace CppTools {
uint qHash(const ProjectPart &p)
{
uint h = qHash(p.toolchainDefines) ^ qHash(p.projectDefines) ^ p.cVersion ^ p.cxxVersion
- ^ p.cxxExtensions ^ p.qtVersion;
+ ^ p.cxxExtensions ^ p.qtVersion ^ qHash(p.projectConfigFile);
foreach (const QString &i, p.includePaths)
h ^= qHash(i);
@@ -83,6 +83,8 @@ bool operator==(const ProjectPart &p1,
return false;
if (p1.projectDefines != p2.projectDefines)
return false;
+ if (p1.projectConfigFile != p2.projectConfigFile)
+ return false;
if (p1.cVersion != p2.cVersion)
return false;
if (p1.cxxVersion != p2.cxxVersion)
@@ -393,6 +395,8 @@ QByteArray CppModelManager::internalDefinedMacros() const
foreach (const ProjectPart::Ptr &part, pinfo.projectParts()) {
addUnique(part->toolchainDefines.split('\n'), &macros, &alreadyIn);
addUnique(part->projectDefines.split('\n'), &macros, &alreadyIn);
+ if (!part->projectConfigFile.isEmpty())
+ macros += readProjectConfigFile(part);
}
}
return macros;
@@ -434,6 +438,7 @@ void CppModelManager::dumpModelManagerConfiguration()
qDebug() << "cxxVersion:" << cxxVersion;
qDebug() << "cxxExtensions:" << cxxExtensions;
qDebug() << "Qt version:" << part->qtVersion;
+ qDebug() << "project config file:" << part->projectConfigFile;
qDebug() << "precompiled header:" << part->precompiledHeaders;
qDebug() << "toolchain defines:" << part->toolchainDefines;
qDebug() << "project defines:" << part->projectDefines;
diff --git a/src/plugins/cpptools/cppmodelmanagerinterface.cpp b/src/plugins/cpptools/cppmodelmanagerinterface.cpp
index 0f65f16225..5b31d4a2a2 100644
--- a/src/plugins/cpptools/cppmodelmanagerinterface.cpp
+++ b/src/plugins/cpptools/cppmodelmanagerinterface.cpp
@@ -223,4 +223,24 @@ void CppModelManagerInterface::ProjectInfo::appendProjectPart(const ProjectPart:
m_defines.append('\n');
m_defines.append(part->toolchainDefines);
m_defines.append(part->projectDefines);
+ if (!part->projectConfigFile.isEmpty()) {
+ m_defines.append('\n');
+ m_defines += readProjectConfigFile(part);
+ m_defines.append('\n');
+ }
+}
+
+QByteArray CppModelManagerInterface::readProjectConfigFile(const ProjectPart::Ptr &part)
+{
+ QByteArray result;
+
+ QFile f(part->projectConfigFile);
+ if (f.open(QIODevice::ReadOnly)) {
+ QTextStream is(&f);
+ result = is.readAll().toUtf8();
+ f.close();
+ }
+
+ return result;
}
+
diff --git a/src/plugins/cpptools/cppmodelmanagerinterface.h b/src/plugins/cpptools/cppmodelmanagerinterface.h
index 188367c68a..5bd7be3cc2 100644
--- a/src/plugins/cpptools/cppmodelmanagerinterface.h
+++ b/src/plugins/cpptools/cppmodelmanagerinterface.h
@@ -106,6 +106,7 @@ public:
QString projectFile;
ProjectExplorer::Project *project;
QList<ProjectFile> files;
+ QString projectConfigFile; // currently only used by the Generic Project Manager
QByteArray projectDefines;
QByteArray toolchainDefines;
QStringList includePaths;
@@ -290,6 +291,9 @@ public slots:
virtual void updateModifiedSourceFiles() = 0;
virtual void GC() = 0;
+
+protected:
+ static QByteArray readProjectConfigFile(const ProjectPart::Ptr &part);
};
} // namespace CppTools
diff --git a/src/plugins/cpptools/cppsnapshotupdater.cpp b/src/plugins/cpptools/cppsnapshotupdater.cpp
index 85a282ae34..4d4de1021c 100644
--- a/src/plugins/cpptools/cppsnapshotupdater.cpp
+++ b/src/plugins/cpptools/cppsnapshotupdater.cpp
@@ -60,6 +60,7 @@ void SnapshotUpdater::update(CppModelManager::WorkingCopy workingCopy)
QStringList includePaths;
QStringList frameworkPaths;
QStringList precompiledHeaders;
+ QString projectConfigFile;
updateProjectPart();
@@ -73,6 +74,7 @@ void SnapshotUpdater::update(CppModelManager::WorkingCopy workingCopy)
configFile += m_projectPart->projectDefines;
includePaths = m_projectPart->includePaths;
frameworkPaths = m_projectPart->frameworkPaths;
+ projectConfigFile = m_projectPart->projectConfigFile;
if (m_usePrecompiledHeaders)
precompiledHeaders = m_projectPart->precompiledHeaders;
}
@@ -99,6 +101,11 @@ void SnapshotUpdater::update(CppModelManager::WorkingCopy workingCopy)
invalidateSnapshot = true;
}
+ if (projectConfigFile != m_projectConfigFile) {
+ m_projectConfigFile = projectConfigFile;
+ invalidateSnapshot = true;
+ }
+
if (precompiledHeaders != m_precompiledHeaders) {
m_precompiledHeaders = precompiledHeaders;
invalidateSnapshot = true;
@@ -160,6 +167,8 @@ void SnapshotUpdater::update(CppModelManager::WorkingCopy workingCopy)
preproc.setIncludePaths(m_includePaths);
preproc.setFrameworkPaths(m_frameworkPaths);
preproc.run(configurationFileName);
+ if (!m_projectConfigFile.isEmpty())
+ preproc.run(m_projectConfigFile);
if (m_usePrecompiledHeaders) {
foreach (const QString &precompiledHeader, m_precompiledHeaders)
preproc.run(precompiledHeader);
diff --git a/src/plugins/cpptools/cppsnapshotupdater.h b/src/plugins/cpptools/cppsnapshotupdater.h
index c5d1418946..92741cf006 100644
--- a/src/plugins/cpptools/cppsnapshotupdater.h
+++ b/src/plugins/cpptools/cppsnapshotupdater.h
@@ -78,6 +78,7 @@ private:
QByteArray m_editorDefines;
QStringList m_includePaths;
QStringList m_frameworkPaths;
+ QString m_projectConfigFile;
QStringList m_precompiledHeaders;
CPlusPlus::Snapshot m_snapshot;
CPlusPlus::DependencyTable m_deps;
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index 68d7714351..a8d4bdadab 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -218,15 +218,6 @@ void GenericProject::parseProject(RefreshOptions options)
// TODO: Possibly load some configuration from the project file
//QSettings projectInfo(m_fileName, QSettings::IniFormat);
-
- m_defines.clear();
-
- QFile configFile(configFileName());
- if (configFile.open(QFile::ReadOnly)) {
- // convert from local/file encoding to UTF-8
- QTextStream configStream(&configFile);
- m_defines = configStream.readAll().toUtf8();
- }
}
if (options & Files)
@@ -265,7 +256,7 @@ void GenericProject::refresh(RefreshOptions options)
}
part->cxxVersion = CppTools::ProjectPart::CXX11; // assume C++11
- part->projectDefines += m_defines;
+ part->projectConfigFile = configFileName();
// ### add _defines.
@@ -348,11 +339,6 @@ QStringList GenericProject::files() const
return m_files;
}
-QByteArray GenericProject::defines() const
-{
- return m_defines;
-}
-
QString GenericProject::displayName() const
{
return m_projectName;
diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h
index 18ca8798c6..30a657ff25 100644
--- a/src/plugins/genericprojectmanager/genericproject.h
+++ b/src/plugins/genericprojectmanager/genericproject.h
@@ -81,7 +81,6 @@ public:
void refresh(RefreshOptions options);
- QByteArray defines() const;
QStringList projectIncludePaths() const;
QStringList files() const;
@@ -108,7 +107,6 @@ private:
QStringList m_files;
QHash<QString, QString> m_rawListEntries;
QStringList m_projectIncludePaths;
- QByteArray m_defines;
GenericProjectNode *m_rootNode;
QFuture<void> m_codeModelFuture;
diff --git a/src/plugins/genericprojectmanager/genericprojectwizard.cpp b/src/plugins/genericprojectmanager/genericprojectwizard.cpp
index a7d700efc8..f8059adb2c 100644
--- a/src/plugins/genericprojectmanager/genericprojectwizard.cpp
+++ b/src/plugins/genericprojectmanager/genericprojectwizard.cpp
@@ -48,6 +48,11 @@
namespace GenericProjectManager {
namespace Internal {
+static const char *const ConfigFileTemplate =
+ "// Add predefined macros for your project here. For example:\n"
+ "// #define THE_ANSWER 42\n"
+ ;
+
//////////////////////////////////////////////////////////////////////////////
//
// GenericProjectWizardDialog
@@ -189,7 +194,7 @@ Core::GeneratedFiles GenericProjectWizard::generateFiles(const QWizard *w,
generatedIncludesFile.setContents(includePaths.join(QLatin1String("\n")));
Core::GeneratedFile generatedConfigFile(configFileName);
- generatedConfigFile.setContents(QLatin1String("// ADD PREDEFINED MACROS HERE!\n"));
+ generatedConfigFile.setContents(QLatin1String(ConfigFileTemplate));
Core::GeneratedFiles files;
files.append(generatedFilesFile);