Clang: Support MSVC style of compiler flags

Clang has MSVC compatible mode which works with MSVC style command line
flags.

When possible use the same flags (-I, -D, -U, etc.) and in other cases
either replace by MSVC analog (for example use /FI instead of -include)
or pass the argument with '/clang:' prefix (requires
https://reviews.llvm.org/D53457).

Change-Id: I95f33bed5dc8d9493895ed8d4359cdd70fc774b8
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
Ivan Donchevskii
2019-01-11 15:32:12 +01:00
parent 4c0c3f5a64
commit 0348009e0e
8 changed files with 467 additions and 209 deletions

View File

@@ -27,6 +27,7 @@
#include "clangtoolssettings.h"
#include <cpptools/compileroptionsbuilder.h>
#include <cpptools/cppcodemodelsettings.h>
#include <cpptools/cpptoolsreuse.h>
@@ -56,51 +57,45 @@ ClangTidyClazyRunner::ClangTidyClazyRunner(const CppTools::ClangDiagnosticConfig
{
}
static void addXclangArg(QStringList &arguments,
const QString &argName,
const QString &argValue = QString())
{
arguments << QString("-Xclang")
<< argName;
if (!argValue.isEmpty()) {
arguments << QString("-Xclang")
<< argValue;
}
}
QStringList ClangTidyClazyRunner::constructCommandLineArguments(const QStringList &options)
{
using namespace CppTools;
QStringList arguments;
if (LOG().isDebugEnabled())
arguments << QString("-v");
arguments << QLatin1String("-v");
arguments << QString("-fsyntax-only")
<< QString("-serialize-diagnostics")
<< QString(m_logFile)
<< ClangDiagnosticConfigsModel::globalDiagnosticOptions()
const QStringList serializeArgs{"-serialize-diagnostics", m_logFile};
if (options.contains("--driver-mode=cl"))
arguments << clangArgsForCl(serializeArgs);
else
arguments << serializeArgs;
arguments << ClangDiagnosticConfigsModel::globalDiagnosticOptions()
<< m_diagnosticConfig.clangOptions();
const ClangDiagnosticConfig::TidyMode tidyMode = m_diagnosticConfig.clangTidyMode();
if (tidyMode != ClangDiagnosticConfig::TidyMode::Disabled) {
addXclangArg(arguments, QString("-add-plugin"), QString("clang-tidy"));
arguments << XclangArgs({"-add-plugin", "clang-tidy"});
if (tidyMode != ClangDiagnosticConfig::TidyMode::File) {
const QString tidyChecks = m_diagnosticConfig.clangTidyChecks();
addXclangArg(arguments, QString("-plugin-arg-clang-tidy"), "-checks=" + tidyChecks);
arguments << XclangArgs({"-plugin-arg-clang-tidy", "-checks=" + tidyChecks});
}
}
const QString clazyChecks = m_diagnosticConfig.clazyChecks();
if (!clazyChecks.isEmpty()) {
addXclangArg(arguments, QString("-add-plugin"), QString("clang-lazy"));
addXclangArg(arguments, QString("-plugin-arg-clang-lazy"), QString("enable-all-fixits"));
addXclangArg(arguments, QString("-plugin-arg-clang-lazy"), QString("no-autowrite-fixits"));
addXclangArg(arguments, QString("-plugin-arg-clang-lazy"), m_diagnosticConfig.clazyChecks());
arguments << XclangArgs({"-add-plugin",
"clang-lazy",
"-plugin-arg-clang-lazy",
"enable-all-fixits",
"-plugin-arg-clang-lazy",
"no-autowrite-fixits",
"-plugin-arg-clang-lazy",
m_diagnosticConfig.clazyChecks()});
}
arguments += options;
arguments << QDir::toNativeSeparators(filePath());
arguments << options << QDir::toNativeSeparators(filePath());
return arguments;
}