Clang: Properly generate macros with clang-cl

Clang-cl can work with different command line styles but
it seems that it's a bad idea to mix them. So let's use gcc
toolchain methods only when --driver-mode=g++ is specified
and ones from msvc toolchain in other cases.

Change-Id: I071a124a07b31bce2a0a5594ff8ca79d9ed84716
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
Ivan Donchevskii
2018-11-30 12:19:55 +01:00
parent bb00d3fb0e
commit 850ac7d805
4 changed files with 18 additions and 7 deletions

View File

@@ -129,7 +129,8 @@ ToolChain::MacroInspectionRunner AbstractMsvcToolChain::createMacroInspectionRun
const Macros macros = msvcPredefinedMacros(filteredFlags, env); const Macros macros = msvcPredefinedMacros(filteredFlags, env);
const auto report = MacroInspectionReport{macros, msvcLanguageVersion(lang, macros)}; const auto report = MacroInspectionReport{macros,
msvcLanguageVersion(filteredFlags, lang, macros)};
macroCache->insert(filteredFlags, report); macroCache->insert(filteredFlags, report);
return report; return report;

View File

@@ -98,7 +98,8 @@ protected:
// Function must be thread-safe! // Function must be thread-safe!
virtual Macros msvcPredefinedMacros(const QStringList cxxflags, virtual Macros msvcPredefinedMacros(const QStringList cxxflags,
const Utils::Environment& env) const = 0; const Utils::Environment& env) const = 0;
virtual LanguageVersion msvcLanguageVersion(const Core::Id &language, virtual LanguageVersion msvcLanguageVersion(const QStringList cxxflags,
const Core::Id &language,
const Macros &macros) const = 0; const Macros &macros) const = 0;
Utils::FileName m_debuggerCommand; Utils::FileName m_debuggerCommand;

View File

@@ -525,7 +525,8 @@ Macros MsvcToolChain::msvcPredefinedMacros(const QStringList cxxflags,
// //
// For _MSV_VER values, see https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2017. // For _MSV_VER values, see https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2017.
// //
LanguageVersion MsvcToolChain::msvcLanguageVersion(const Core::Id &language, LanguageVersion MsvcToolChain::msvcLanguageVersion(const QStringList /*cxxflags*/,
const Core::Id &language,
const Macros &macros) const const Macros &macros) const
{ {
int mscVer = -1; int mscVer = -1;
@@ -1120,6 +1121,9 @@ bool ClangClToolChain::operator ==(const ToolChain &other) const
Macros ClangClToolChain::msvcPredefinedMacros(const QStringList cxxflags, Macros ClangClToolChain::msvcPredefinedMacros(const QStringList cxxflags,
const Utils::Environment &env) const const Utils::Environment &env) const
{ {
if (!cxxflags.contains("--driver-mode=g++"))
return MsvcToolChain::msvcPredefinedMacros(cxxflags, env);
Utils::SynchronousProcess cpp; Utils::SynchronousProcess cpp;
cpp.setEnvironment(env.toStringList()); cpp.setEnvironment(env.toStringList());
cpp.setWorkingDirectory(Utils::TemporaryDirectory::masterDirectoryPath()); cpp.setWorkingDirectory(Utils::TemporaryDirectory::masterDirectoryPath());
@@ -1138,10 +1142,13 @@ Macros ClangClToolChain::msvcPredefinedMacros(const QStringList cxxflags,
return Macro::toMacros(response.allRawOutput()); return Macro::toMacros(response.allRawOutput());
} }
LanguageVersion ClangClToolChain::msvcLanguageVersion(const Core::Id &language, LanguageVersion ClangClToolChain::msvcLanguageVersion(const QStringList cxxflags,
const Core::Id &language,
const Macros &macros) const const Macros &macros) const
{ {
return ToolChain::languageVersion(language, macros); if (cxxflags.contains("--driver-mode=g++"))
return ToolChain::languageVersion(language, macros);
return MsvcToolChain::msvcLanguageVersion(cxxflags, language, macros);
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------

View File

@@ -94,7 +94,8 @@ protected:
// Function must be thread-safe! // Function must be thread-safe!
Macros msvcPredefinedMacros(const QStringList cxxflags, Macros msvcPredefinedMacros(const QStringList cxxflags,
const Utils::Environment &env) const override; const Utils::Environment &env) const override;
LanguageVersion msvcLanguageVersion(const Core::Id &language, LanguageVersion msvcLanguageVersion(const QStringList cxxflags,
const Core::Id &language,
const Macros &macros) const override; const Macros &macros) const override;
struct GenerateEnvResult struct GenerateEnvResult
@@ -141,7 +142,8 @@ public:
void resetMsvcToolChain(const MsvcToolChain *base = nullptr); void resetMsvcToolChain(const MsvcToolChain *base = nullptr);
Macros msvcPredefinedMacros(const QStringList cxxflags, Macros msvcPredefinedMacros(const QStringList cxxflags,
const Utils::Environment &env) const override; const Utils::Environment &env) const override;
LanguageVersion msvcLanguageVersion(const Core::Id &language, LanguageVersion msvcLanguageVersion(const QStringList cxxflags,
const Core::Id &language,
const Macros &macros) const override; const Macros &macros) const override;
bool operator ==(const ToolChain &) const override; bool operator ==(const ToolChain &) const override;