forked from qt-creator/qt-creator
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:
@@ -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;
|
||||||
|
@@ -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 ¯os) const = 0;
|
const Macros ¯os) const = 0;
|
||||||
|
|
||||||
Utils::FileName m_debuggerCommand;
|
Utils::FileName m_debuggerCommand;
|
||||||
|
@@ -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 ¯os) const
|
const Macros ¯os) 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 ¯os) const
|
const Macros ¯os) const
|
||||||
{
|
{
|
||||||
return ToolChain::languageVersion(language, macros);
|
if (cxxflags.contains("--driver-mode=g++"))
|
||||||
|
return ToolChain::languageVersion(language, macros);
|
||||||
|
return MsvcToolChain::msvcLanguageVersion(cxxflags, language, macros);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
@@ -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 ¯os) const override;
|
const Macros ¯os) 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 ¯os) const override;
|
const Macros ¯os) const override;
|
||||||
|
|
||||||
bool operator ==(const ToolChain &) const override;
|
bool operator ==(const ToolChain &) const override;
|
||||||
|
Reference in New Issue
Block a user