From 62c8aecb5fd950a56b17483bccd176f4f77245e4 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 11 Jan 2019 14:10:09 +0100 Subject: [PATCH] GenericProject: Support forwarding flags to clang code model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ...in order to specify e.g. the language version to use. Create the additional files project.cxxflags and project.cflags. These are expected to contain command line flags for the clang code model on one single line. For example, "-std=c++11" can be provided to set the language version for parsing. Fixes: QTCREATORBUG-19668 Change-Id: I7712f546ba1fae536c32adfa5bd449c5b3484521 Reviewed-by: André Hartmann Reviewed-by: Christian Kandeler --- .../GenericProjectManager.json.in | 12 +++++ .../genericprojectmanager/genericproject.cpp | 44 +++++++++++++++++++ .../genericprojectmanager/genericproject.h | 6 +++ .../genericprojectconstants.h | 4 ++ .../genericprojectfileseditor.cpp | 2 + .../genericprojectwizard.cpp | 11 +++++ 6 files changed, 79 insertions(+) diff --git a/src/plugins/genericprojectmanager/GenericProjectManager.json.in b/src/plugins/genericprojectmanager/GenericProjectManager.json.in index d8b50f45ebd..c52201914a8 100644 --- a/src/plugins/genericprojectmanager/GenericProjectManager.json.in +++ b/src/plugins/genericprojectmanager/GenericProjectManager.json.in @@ -45,6 +45,18 @@ \" \", \" \", + \" \", + \" \", + \" Generic Project CXXFLAGS File\", + \" \", + \" \", + + \" \", + \" \", + \" Generic Project CFLAGS File\", + \" \", + \" \", + \"\" ] } diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index 16b544fd910..d496f097f4b 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -58,6 +58,7 @@ #include #include #include +#include #include #include @@ -165,6 +166,12 @@ private: // //////////////////////////////////////////////////////////////////////////////////// +static bool writeFile(const QString &filePath, const QString &contents) +{ + Utils::FileSaver saver(filePath, QIODevice::Text | QIODevice::WriteOnly); + return saver.write(contents.toUtf8()) && saver.finalize(); +} + GenericProject::GenericProject(const Utils::FileName &fileName) : Project(Constants::GENERICMIMETYPE, fileName, [this]() { refresh(Everything); }), m_cppCodeModelUpdater(new CppTools::CppProjectUpdater), @@ -183,6 +190,18 @@ GenericProject::GenericProject(const Utils::FileName &fileName) : m_includesFileName = QFileInfo(dir, projectName + ".includes").absoluteFilePath(); m_configFileName = QFileInfo(dir, projectName + ".config").absoluteFilePath(); + const QFileInfo cxxflagsFileInfo(dir, projectName + ".cxxflags"); + m_cxxflagsFileName = cxxflagsFileInfo.absoluteFilePath(); + if (!cxxflagsFileInfo.exists()) { + QTC_CHECK(writeFile(m_cxxflagsFileName, Constants::GENERICPROJECT_CXXFLAGS_FILE_TEMPLATE)); + } + + const QFileInfo cflagsFileInfo(dir, projectName + ".cflags"); + m_cflagsFileName = cflagsFileInfo.absoluteFilePath(); + if (!cflagsFileInfo.exists()) { + QTC_CHECK(writeFile(m_cflagsFileName, Constants::GENERICPROJECT_CFLAGS_FILE_TEMPLATE)); + } + m_filesIDocument = new ProjectDocument(Constants::GENERICMIMETYPE, FileName::fromString(m_filesFileName), [this]() { refresh(Files); }); @@ -192,6 +211,13 @@ GenericProject::GenericProject(const Utils::FileName &fileName) : m_configIDocument = new ProjectDocument(Constants::GENERICMIMETYPE, FileName::fromString(m_configFileName), [this]() { refresh(Configuration); }); + m_cxxFlagsIDocument + = new ProjectDocument(Constants::GENERICMIMETYPE, FileName::fromString(m_cxxflagsFileName), + [this]() { refresh(Configuration); }); + m_cFlagsIDocument + = new ProjectDocument(Constants::GENERICMIMETYPE, FileName::fromString(m_cflagsFileName), + [this]() { refresh(Configuration); }); + connect(m_deployFileWatcher, &FileSystemWatcher::fileChanged, this, &GenericProject::updateDeploymentData); } @@ -326,6 +352,14 @@ bool GenericProject::renameFile(const QString &filePath, const QString &newFileP return saveRawFileList(newList); } +static QStringList readFlags(const QString &filePath) +{ + const QStringList lines = readLines(filePath); + if (lines.isEmpty()) + return QStringList(); + return QtcProcess::splitArgs(lines.first()); +} + void GenericProject::parseProject(RefreshOptions options) { if (options & Files) { @@ -337,6 +371,8 @@ void GenericProject::parseProject(RefreshOptions options) if (options & Configuration) { m_rawProjectIncludePaths = readLines(m_includesFileName); m_projectIncludePaths = processEntries(m_rawProjectIncludePaths); + m_cxxflags = readFlags(m_cxxflagsFileName); + m_cflags = readFlags(m_cflagsFileName); // TODO: Possibly load some configuration from the project file //QSettings projectInfo(m_fileName, QSettings::IniFormat); @@ -368,6 +404,12 @@ void GenericProject::refresh(RefreshOptions options) newRoot->addNestedNode(std::make_unique(FileName::fromString(m_configFileName), FileType::Project, /* generated = */ false)); + newRoot->addNestedNode(std::make_unique(FileName::fromString(m_cxxflagsFileName), + FileType::Project, + /* generated = */ false)); + newRoot->addNestedNode(std::make_unique(FileName::fromString(m_cflagsFileName), + FileType::Project, + /* generated = */ false)); setRootProjectNode(std::move(newRoot)); } @@ -436,6 +478,8 @@ void GenericProject::refreshCppCodeModel() rpp.setQtVersion(kitInfo.projectPartQtVersion); rpp.setIncludePaths(m_projectIncludePaths); rpp.setConfigFileName(m_configFileName); + rpp.setFlagsForCxx({nullptr, m_cxxflags}); + rpp.setFlagsForC({nullptr, m_cflags}); rpp.setFiles(m_files); m_cppCodeModelUpdater->update({this, kitInfo, {rpp}}); diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h index 791465f2b50..4bb6f35feb7 100644 --- a/src/plugins/genericprojectmanager/genericproject.h +++ b/src/plugins/genericprojectmanager/genericproject.h @@ -72,14 +72,20 @@ private: QString m_filesFileName; QString m_includesFileName; QString m_configFileName; + QString m_cxxflagsFileName; + QString m_cflagsFileName; ProjectExplorer::ProjectDocument *m_filesIDocument; ProjectExplorer::ProjectDocument *m_includesIDocument; ProjectExplorer::ProjectDocument *m_configIDocument; + ProjectExplorer::ProjectDocument *m_cxxFlagsIDocument; + ProjectExplorer::ProjectDocument *m_cFlagsIDocument; QStringList m_rawFileList; QStringList m_files; QHash m_rawListEntries; QStringList m_rawProjectIncludePaths; QStringList m_projectIncludePaths; + QStringList m_cxxflags; + QStringList m_cflags; CppTools::CppProjectUpdater *m_cppCodeModelUpdater = nullptr; diff --git a/src/plugins/genericprojectmanager/genericprojectconstants.h b/src/plugins/genericprojectmanager/genericprojectconstants.h index be4a1a0fa87..373663cf510 100644 --- a/src/plugins/genericprojectmanager/genericprojectconstants.h +++ b/src/plugins/genericprojectmanager/genericprojectconstants.h @@ -36,5 +36,9 @@ const char FILES_EDITOR_ID[] = "QT4.FilesEditor"; // Project const char GENERICPROJECT_ID[] = "GenericProjectManager.GenericProject"; +// File Templates +const char GENERICPROJECT_CXXFLAGS_FILE_TEMPLATE[] = "-std=c++17"; +const char GENERICPROJECT_CFLAGS_FILE_TEMPLATE[] = "-std=c17"; + } // namespace Constants } // namespace GenericProjectManager diff --git a/src/plugins/genericprojectmanager/genericprojectfileseditor.cpp b/src/plugins/genericprojectmanager/genericprojectfileseditor.cpp index 6a61790fd8f..42eb4c688c5 100644 --- a/src/plugins/genericprojectmanager/genericprojectfileseditor.cpp +++ b/src/plugins/genericprojectmanager/genericprojectfileseditor.cpp @@ -48,6 +48,8 @@ ProjectFilesFactory::ProjectFilesFactory() addMimeType("application/vnd.qtcreator.generic.files"); addMimeType("application/vnd.qtcreator.generic.includes"); addMimeType("application/vnd.qtcreator.generic.config"); + addMimeType("application/vnd.qtcreator.generic.cxxflags"); + addMimeType("application/vnd.qtcreator.generic.cflags"); setDocumentCreator([]() { return new TextDocument(Constants::FILES_EDITOR_ID); }); setEditorActionHandlers(TextEditorActionHandler::None); diff --git a/src/plugins/genericprojectmanager/genericprojectwizard.cpp b/src/plugins/genericprojectmanager/genericprojectwizard.cpp index edd55df5b6b..ce8e4034ee2 100644 --- a/src/plugins/genericprojectmanager/genericprojectwizard.cpp +++ b/src/plugins/genericprojectmanager/genericprojectwizard.cpp @@ -149,6 +149,8 @@ Core::GeneratedFiles GenericProjectWizard::generateFiles(const QWizard *w, const QString filesFileName = QFileInfo(dir, projectName + QLatin1String(".files")).absoluteFilePath(); const QString includesFileName = QFileInfo(dir, projectName + QLatin1String(".includes")).absoluteFilePath(); const QString configFileName = QFileInfo(dir, projectName + QLatin1String(".config")).absoluteFilePath(); + const QString cxxflagsFileName = QFileInfo(dir, projectName + QLatin1String(".cxxflags")).absoluteFilePath(); + const QString cflagsFileName = QFileInfo(dir, projectName + QLatin1String(".cflags")).absoluteFilePath(); const QStringList paths = Utils::transform(wizard->selectedPaths(), &Utils::FileName::toString); Utils::MimeType headerTy = Utils::mimeTypeForName(QLatin1String("text/x-chdr")); @@ -188,11 +190,20 @@ Core::GeneratedFiles GenericProjectWizard::generateFiles(const QWizard *w, Core::GeneratedFile generatedConfigFile(configFileName); generatedConfigFile.setContents(QLatin1String(ConfigFileTemplate)); + Core::GeneratedFile generatedCxxFlagsFile(cxxflagsFileName); + generatedCxxFlagsFile.setContents( + QLatin1String(Constants::GENERICPROJECT_CXXFLAGS_FILE_TEMPLATE)); + + Core::GeneratedFile generatedCFlagsFile(cflagsFileName); + generatedCFlagsFile.setContents(QLatin1String(Constants::GENERICPROJECT_CFLAGS_FILE_TEMPLATE)); + Core::GeneratedFiles files; files.append(generatedFilesFile); files.append(generatedIncludesFile); files.append(generatedConfigFile); files.append(generatedCreatorFile); + files.append(generatedCxxFlagsFile); + files.append(generatedCFlagsFile); return files; }