diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index f594486de332e212d705f39eccd763933e20648a..dae5f1a835c49b5bc3549403629ad1505f884f32 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 461ce25a8e4dd5b2cc965af364b8184f005794b5..c602bd25d0b500d76ab55955483a857db58f1896 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 5a0e96a3696e8b42232e74a8db3a09b865fc2ec3..1363bef7b67e7b601562b72936f91474f9d1578c 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'), ¯os, &alreadyIn); addUnique(part->projectDefines.split('\n'), ¯os, &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 0f65f1622553eb0b8668d5a1c69bb9c3bd8c3b3f..5b31d4a2a25b1a86bac5486c50973bb2b6920a2a 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 188367c68ad6f0cfaa709e2fcd9a3e93c0a5ac60..5bd7be3cc27983b6547f8a653f1b1d13f911601e 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 85a282ae34effebe711da3542784da0b1d1b7e5b..4d4de1021c7d2998d2e0028fdf9bfabcf6a5b075 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 c5d14189465c3dc0d5fc4da63bdb772002e717b7..92741cf006db1c1707745eaf1d91ae057642fc39 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 68d7714351368de703e0df48f054e70ede6223de..a8d4bdadab362c9f1f90273e2b00b1bf6f2b79eb 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 18ca8798c67afe15fa409d15d1ee137253a863eb..30a657ff253115d84eab1be213ec73b950e8feae 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 a7d700efc8b3a3d56bb1e30edff07c44a1d48af2..f8059adb2c29283a5c14712205302ec949586d01 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);