forked from qt-creator/qt-creator
GenericProject: Support forwarding flags to clang code model
...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 <aha_1980@gmx.de> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -45,6 +45,18 @@
|
||||
\" <glob pattern=\'*.config\'/>\",
|
||||
\" </mime-type>\",
|
||||
|
||||
\" <mime-type type=\'application/vnd.qtcreator.generic.cxxflags\'>\",
|
||||
\" <sub-class-of type=\'text/plain\'/>\",
|
||||
\" <comment>Generic Project CXXFLAGS File</comment>\",
|
||||
\" <glob pattern=\'*.cxxflags\'/>\",
|
||||
\" </mime-type>\",
|
||||
|
||||
\" <mime-type type=\'application/vnd.qtcreator.generic.cflags\'>\",
|
||||
\" <sub-class-of type=\'text/plain\'/>\",
|
||||
\" <comment>Generic Project CFLAGS File</comment>\",
|
||||
\" <glob pattern=\'*.cflags\'/>\",
|
||||
\" </mime-type>\",
|
||||
|
||||
\"</mime-info>\"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
#include <utils/filesystemwatcher.h>
|
||||
#include <utils/fileutils.h>
|
||||
#include <utils/qtcassert.h>
|
||||
#include <utils/qtcprocess.h>
|
||||
|
||||
#include <QDir>
|
||||
#include <QFileInfo>
|
||||
@@ -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<FileNode>(FileName::fromString(m_configFileName),
|
||||
FileType::Project,
|
||||
/* generated = */ false));
|
||||
newRoot->addNestedNode(std::make_unique<FileNode>(FileName::fromString(m_cxxflagsFileName),
|
||||
FileType::Project,
|
||||
/* generated = */ false));
|
||||
newRoot->addNestedNode(std::make_unique<FileNode>(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}});
|
||||
|
||||
@@ -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<QString, QString> m_rawListEntries;
|
||||
QStringList m_rawProjectIncludePaths;
|
||||
QStringList m_projectIncludePaths;
|
||||
QStringList m_cxxflags;
|
||||
QStringList m_cflags;
|
||||
|
||||
CppTools::CppProjectUpdater *m_cppCodeModelUpdater = nullptr;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user