From ad2461cacab15f7b727c0f964b5f6ec4893104ff Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Wed, 17 Jan 2018 12:36:26 +0100 Subject: [PATCH] Clang: Add environment variables for extra clang flags Different variables for clang code model and clang static analyzer. Task-number: QTCREATORBUG-19329 Change-Id: I64abdefb8c646a6f45f789a61abf75198e7ca3b8 Reviewed-by: Nikolai Kosjar --- .../clangstaticanalyzerruncontrol.cpp | 39 +++++++++++++- .../source/commandlinearguments.cpp | 52 +++++++++++++++++-- .../source/commandlinearguments.h | 2 + 3 files changed, 88 insertions(+), 5 deletions(-) diff --git a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp index 679e06b99fe..6f94ce23d2f 100644 --- a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp +++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp @@ -61,6 +61,7 @@ #include #include #include +#include #include #include @@ -71,6 +72,40 @@ using namespace Utils; static Q_LOGGING_CATEGORY(LOG, "qtc.clangstaticanalyzer.runcontrol") +static QStringList splitArgs(QString &argsString) +{ + QStringList result; + Utils::QtcProcess::ArgIterator it(&argsString); + while (it.next()) + result.append(it.value()); + return result; +} + +template +static QStringList extraOptions(const char(&environment)[Size]) +{ + if (!qEnvironmentVariableIsSet(environment)) + return QStringList(); + QString arguments = QString::fromLocal8Bit(qgetenv(environment)); + return splitArgs(arguments); +} + +static QStringList extraClangStaticAnalyzerPrependOptions() { + constexpr char csaPrependOptions[] = "QTC_CLANG_CSA_CMD_PREPEND"; + static const QStringList options = extraOptions(csaPrependOptions); + if (!options.isEmpty()) + qWarning() << "ClangStaticAnalyzer options are prepended with " << options.toVector(); + return options; +} + +static QStringList extraClangStaticAnalyzerAppendOptions() { + constexpr char csaAppendOptions[] = "QTC_CLANG_CSA_CMD_APPEND"; + static const QStringList options = extraOptions(csaAppendOptions); + if (!options.isEmpty()) + qWarning() << "ClangStaticAnalyzer options are appended with " << options.toVector(); + return options; +} + namespace ClangStaticAnalyzer { namespace Internal { @@ -303,7 +338,9 @@ static AnalyzeUnits unitsToAnalyzeFromProjectParts(const QVector +#include #include #include +#include #include +static QList splitArgs(QString &argsString) +{ + QList result; + Utils::QtcProcess::ArgIterator it(&argsString); + while (it.next()) + result.append(it.value().toUtf8()); + return result; +} + +template +static QList extraOptions(const char(&environment)[Size]) +{ + if (!qEnvironmentVariableIsSet(environment)) + return QList(); + QString arguments = QString::fromLocal8Bit(qgetenv(environment)); + return splitArgs(arguments); +} + +static QList extraClangCodeModelPrependOptions() { + constexpr char ccmPrependOptions[] = "QTC_CLANG_CCM_CMD_PREPEND"; + static const QList options = extraOptions(ccmPrependOptions); + if (!options.isEmpty()) + qWarning() << "ClangCodeModel options are prepended with " << options; + return options; +} + +static QList extraClangCodeModelAppendOptions() { + constexpr char ccmAppendOptions[] = "QTC_CLANG_CCM_CMD_APPEND"; + static const QList options = extraOptions(ccmAppendOptions); + if (!options.isEmpty()) + qWarning() << "ClangCodeModel options are appended with " << options; + return options; +} + namespace ClangBackEnd { CommandLineArguments::CommandLineArguments(const char *filePath, const Utf8StringVector &projectPartArguments, const Utf8StringVector &fileArguments, bool addVerboseOption) + : m_prependArgs(extraClangCodeModelPrependOptions()), + m_appendArgs(extraClangCodeModelAppendOptions()) { - const auto elementsToReserve = projectPartArguments.size() - + uint(fileArguments.size()) - + (addVerboseOption ? 1 : 0); - m_arguments.reserve(elementsToReserve); + const int elementsToReserve = m_prependArgs.size() + + projectPartArguments.size() + + fileArguments.size() + + (addVerboseOption ? 1 : 0) + + m_appendArgs.size(); + m_arguments.reserve(static_cast(elementsToReserve)); + for (const auto &argument : m_prependArgs) + m_arguments.push_back(argument.constData()); for (const auto &argument : projectPartArguments) m_arguments.push_back(argument.constData()); for (const auto &argument : fileArguments) m_arguments.push_back(argument.constData()); if (addVerboseOption) m_arguments.push_back("-v"); + for (const auto &argument : m_appendArgs) + m_arguments.push_back(argument.constData()); m_nativeFilePath = FilePath::toNativeSeparators(Utf8String::fromUtf8(filePath)); m_arguments.push_back(m_nativeFilePath.constData()); } diff --git a/src/tools/clangbackend/source/commandlinearguments.h b/src/tools/clangbackend/source/commandlinearguments.h index aa0b2bafbfe..711e69420fb 100644 --- a/src/tools/clangbackend/source/commandlinearguments.h +++ b/src/tools/clangbackend/source/commandlinearguments.h @@ -47,6 +47,8 @@ public: private: Utf8String m_nativeFilePath; + const QList m_prependArgs; + const QList m_appendArgs; std::vector m_arguments; };