From 3f8314024cdd6bfd76629826805b680f6756d117 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 23 Oct 2014 15:31:35 +0200 Subject: RunControl: Pass on toolchain defines and language options Change-Id: I3a44707f7f27e1b4bb781886b63b23a3c20e0414 Reviewed-by: Nikolai Kosjar --- .../clangstaticanalyzerruncontrol.cpp | 57 +++++++++++++--------- .../clangstaticanalyzerruncontrol.h | 13 +++-- .../clangstaticanalyzerrunner.cpp | 10 ++-- .../clangstaticanalyzerrunner.h | 3 +- 4 files changed, 50 insertions(+), 33 deletions(-) diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp index e30a58077a..7710571eff 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp +++ b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp @@ -57,15 +57,15 @@ ClangStaticAnalyzerRunControl::ClangStaticAnalyzerRunControl( { } -static QList calculateFilesToProcess( +static QList calculateFilesToProcess( Project *project) { - typedef ClangStaticAnalyzerRunControl::FileConfiguration ProjectFileConfiguration; - QTC_ASSERT(project, return QList()); + typedef ClangStaticAnalyzerRunControl::SourceFileConfiguration SourceFileConfiguration; + QTC_ASSERT(project, return QList()); ProjectInfo projectInfo = CppModelManager::instance()->projectInfo(project); - QTC_ASSERT(projectInfo, return QList()); + QTC_ASSERT(projectInfo, return QList()); - QList files; + QList files; const QList projectParts = projectInfo.projectParts(); foreach (const ProjectPart::Ptr &projectPart, projectParts) { foreach (const ProjectFile &file, projectPart->files) { @@ -73,7 +73,7 @@ static QList calculateFilesToP continue; QTC_CHECK(file.kind != ProjectFile::Unclassified); if (ProjectFile::isSource(file.kind)) - files << ProjectFileConfiguration(file.path, projectPart); + files << SourceFileConfiguration(file, projectPart); } } @@ -111,10 +111,10 @@ bool ClangStaticAnalyzerRunControl::startEngine() m_clangLogFileDir = temporaryDir.path(); // Collect files - const QList filesToProcess = calculateFilesToProcess(currentProject); + const QList filesToProcess = calculateFilesToProcess(currentProject); qCDebug(LOG()) << "Files to process:"; - foreach (const FileConfiguration &fileConfig, filesToProcess) { - qCDebug(LOG()) << fileConfig.filePath + QLatin1String(" [") + foreach (const SourceFileConfiguration &fileConfig, filesToProcess) { + qCDebug(LOG()) << fileConfig.file.path + QLatin1String(" [") + fileConfig.projectPart->projectFile + QLatin1Char(']'); } m_filesToProcess = filesToProcess; @@ -144,15 +144,6 @@ void ClangStaticAnalyzerRunControl::stopEngine() m_filesToProcess.clear(); } -QStringList createDefinesAndIncludesOptions(const ProjectPart::Ptr projectPart) -{ - QStringList result; - result += CppTools::CompilerOptionsBuilder::createDefineOptions(projectPart->projectDefines); - result += CppTools::CompilerOptionsBuilder::createHeaderPathOptions(projectPart->headerPaths); - result += QLatin1String("-fPIC"); // TODO: Remove? - return result; -} - void ClangStaticAnalyzerRunControl::analyzeNextFile() { if (m_progress.isFinished()) @@ -167,14 +158,13 @@ void ClangStaticAnalyzerRunControl::analyzeNextFile() return; } - const FileConfiguration config = m_filesToProcess.takeFirst(); - const QString filePath = config.filePath; - const QStringList definesAndIncludesOptions - = createDefinesAndIncludesOptions(config.projectPart); + const SourceFileConfiguration config = m_filesToProcess.takeFirst(); + const QString filePath = config.file.path; + const QStringList options = config.createClangOptions(); ClangStaticAnalyzerRunner *runner = createRunner(); qCDebug(LOG) << "analyzeNextFile:" << filePath; - QTC_ASSERT(runner->run(filePath, definesAndIncludesOptions), return); + QTC_ASSERT(runner->run(filePath, options), return); ++m_runningProcesses; } @@ -232,5 +222,26 @@ void ClangStaticAnalyzerRunControl::updateProgressValue() m_progress.setProgressValue(m_initialFilesToProcessSize - m_filesToProcess.size()); } +QStringList ClangStaticAnalyzerRunControl::SourceFileConfiguration::createClangOptions() const +{ + QStringList result; + + if (file.path.endsWith(QLatin1String("cppmodelmanager.cpp"))) { + qDebug() << "here"; + } + + const bool objcExt = projectPart->languageExtensions & ProjectPart::ObjectiveCExtensions; + result += CppTools::CompilerOptionsBuilder::createLanguageOption(file.kind, objcExt); + result += CppTools::CompilerOptionsBuilder::createOptionsForLanguage( + projectPart->languageVersion, + projectPart->languageExtensions); + result += CppTools::CompilerOptionsBuilder::createDefineOptions(projectPart->toolchainDefines); + result += CppTools::CompilerOptionsBuilder::createDefineOptions(projectPart->projectDefines); + result += CppTools::CompilerOptionsBuilder::createHeaderPathOptions(projectPart->headerPaths); + result += QLatin1String("-fPIC"); // TODO: Remove? + + return result; +} + } // namespace Internal } // namespace ClangStaticAnalyzer diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h index 37148b399d..036793571e 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h +++ b/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h @@ -36,12 +36,15 @@ class ClangStaticAnalyzerRunControl : public Analyzer::AnalyzerRunControl Q_OBJECT public: - struct FileConfiguration { - FileConfiguration(const QString &filePath, const CppTools::ProjectPart::Ptr &projectPart) - : filePath(filePath) + struct SourceFileConfiguration { + SourceFileConfiguration(const CppTools::ProjectFile &projectFile, + const CppTools::ProjectPart::Ptr &projectPart) + : file(projectFile) , projectPart(projectPart) {} - QString filePath; + QStringList createClangOptions() const; + + CppTools::ProjectFile file; CppTools::ProjectPart::Ptr projectPart; }; @@ -70,7 +73,7 @@ private: QString m_clangExecutable; QString m_clangLogFileDir; QFutureInterface m_progress; - QList m_filesToProcess; + QList m_filesToProcess; int m_initialFilesToProcessSize; int m_runningProcesses; }; diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.cpp index 34732cfafa..2f5dad462e 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.cpp +++ b/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.cpp @@ -40,14 +40,14 @@ static QString finishedDueToCrash() static QStringList constructCommandLineArguments(const QString &filePath, const QString &logFile, - const QStringList &definesAndIncludes) + const QStringList &options) { QStringList arguments = QStringList() << QLatin1String("--analyze") << QLatin1String("-o") << logFile ; - arguments += definesAndIncludes; + arguments += options; arguments << filePath; return arguments; } @@ -88,16 +88,18 @@ ClangStaticAnalyzerRunner::~ClangStaticAnalyzerRunner() m_process.kill(); } -bool ClangStaticAnalyzerRunner::run(const QString &filePath, const QStringList &definesAndIncludes) +bool ClangStaticAnalyzerRunner::run(const QString &filePath, const QStringList &compilerOptions) { QTC_ASSERT(!m_clangExecutable.isEmpty(), return false); + QTC_CHECK(!compilerOptions.contains(QLatin1String("-o"))); + QTC_CHECK(!compilerOptions.contains(filePath)); m_processOutput.clear(); m_logFile = createLogFile(filePath); QTC_ASSERT(!m_logFile.isEmpty(), return false); const QStringList arguments = constructCommandLineArguments(filePath, m_logFile, - definesAndIncludes); + compilerOptions); m_commandLine = m_clangExecutable + QLatin1Char(' ') + arguments.join(QLatin1Char(' ')); qCDebug(LOG) << "Starting" << m_commandLine; diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.h b/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.h index ada1b67d87..cfd19727fe 100644 --- a/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.h +++ b/plugins/clangstaticanalyzer/clangstaticanalyzerrunner.h @@ -40,7 +40,8 @@ public: QObject *parent = 0); ~ClangStaticAnalyzerRunner(); - bool run(const QString &filePath, const QStringList &definesAndIncludes = QStringList()); + // compilerOptions is expected to contain everything except: -o filePath + bool run(const QString &filePath, const QStringList &compilerOptions = QStringList()); signals: void started(); -- cgit v1.2.3