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

@@ -55,8 +55,6 @@ protected:
projectPart.languageVersion = Utils::LanguageVersion::CXX17;
projectPart.toolChainWordWidth = CppTools::ProjectPart::WordWidth64Bit;
projectPart.toolChainTargetTriple = "x86_64-apple-darwin10";
projectPart.extraCodeModelFlags = QStringList{"-arch", "x86_64"};
projectPart.precompiledHeaders = QStringList{TESTDATA_DIR "/compileroptionsbuilder.pch"};
projectPart.toolChainMacros = {ProjectExplorer::Macro{"foo", "bar"},
ProjectExplorer::Macro{"__cplusplus", "2"},
@@ -151,6 +149,20 @@ TEST_F(CompilerOptionsBuilder, CompilerFlagsFiltering_LanguageVersionIsExplicitl
ASSERT_THAT(compilerOptionsBuilder.options(), Contains("-std=c++17"));
}
TEST_F(CompilerOptionsBuilder, CompilerFlagsFiltering_ClLanguageVersionIsExplicitlySetIfNotProvided)
{
projectPart.toolchainType = ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID;
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart,
CppTools::UseSystemHeader::No,
CppTools::UseToolchainMacros::Yes,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseLanguageDefines::Yes};
compilerOptionsBuilder.build(ProjectFile::CXXSource, CppTools::UsePrecompiledHeaders::No);
ASSERT_THAT(compilerOptionsBuilder.options(), Contains("/std:c++17"));
}
TEST_F(CompilerOptionsBuilder, AddToolchainAndProjectMacrosWithoutSkipingLanguageDefines)
{
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart,
@@ -197,6 +209,20 @@ TEST_F(CompilerOptionsBuilder, HeaderPathOptionsOrder)
"-isystem", QDir::toNativeSeparators("/tmp/builtin_path")));
}
TEST_F(CompilerOptionsBuilder, HeaderPathOptionsOrderCl)
{
projectPart.toolchainType = ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID;
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart};
compilerOptionsBuilder.evaluateCompilerFlags();
compilerOptionsBuilder.addHeaderPathOptions();
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre("-I", QDir::toNativeSeparators("/tmp/path"),
"-I", QDir::toNativeSeparators("/tmp/system_path"),
"/clang:-isystem", "/clang:" + QDir::toNativeSeparators("/tmp/builtin_path")));
}
TEST_F(CompilerOptionsBuilder, UseSystemHeader)
{
CppTools::CompilerOptionsBuilder compilerOptionsBuilder(projectPart, CppTools::UseSystemHeader::Yes);
@@ -407,6 +433,19 @@ TEST_F(CompilerOptionsBuilder, UsePrecompiledHeader)
ElementsAre("-include", QDir::toNativeSeparators(TESTDATA_DIR "/compileroptionsbuilder.pch")));
}
TEST_F(CompilerOptionsBuilder, UsePrecompiledHeaderCl)
{
projectPart.toolchainType = ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID;
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart};
compilerOptionsBuilder.evaluateCompilerFlags();
compilerOptionsBuilder.addPrecompiledHeaderOptions(CppTools::UsePrecompiledHeaders::Yes);
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre("/FI",
QDir::toNativeSeparators(TESTDATA_DIR "/compileroptionsbuilder.pch")));
}
TEST_F(CompilerOptionsBuilder, AddMacros)
{
compilerOptionsBuilder.addMacros(ProjectExplorer::Macros{ProjectExplorer::Macro{"key", "value"}});
@@ -418,7 +457,7 @@ TEST_F(CompilerOptionsBuilder, AddTargetTriple)
{
compilerOptionsBuilder.addTargetTriple();
ASSERT_THAT(compilerOptionsBuilder.options(), ElementsAre("-target", "x86_64-apple-darwin10"));
ASSERT_THAT(compilerOptionsBuilder.options(), ElementsAre("--target=x86_64-apple-darwin10"));
}
TEST_F(CompilerOptionsBuilder, InsertWrappedQtHeaders)
@@ -435,6 +474,17 @@ TEST_F(CompilerOptionsBuilder, SetLanguageVersion)
ASSERT_THAT(compilerOptionsBuilder.options(), ElementsAre("-x", "c++"));
}
TEST_F(CompilerOptionsBuilder, SetLanguageVersionCl)
{
projectPart.toolchainType = ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID;
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart};
compilerOptionsBuilder.evaluateCompilerFlags();
compilerOptionsBuilder.updateFileLanguage(ProjectFile::CXXSource);
ASSERT_THAT(compilerOptionsBuilder.options(), ElementsAre("/TP"));
}
TEST_F(CompilerOptionsBuilder, HandleLanguageExtension)
{
projectPart.languageExtensions = Utils::LanguageExtension::ObjectiveC;
@@ -453,6 +503,18 @@ TEST_F(CompilerOptionsBuilder, UpdateLanguageVersion)
ASSERT_THAT(compilerOptionsBuilder.options(), ElementsAre("-x", "c++-header"));
}
TEST_F(CompilerOptionsBuilder, UpdateLanguageVersionCl)
{
projectPart.toolchainType = ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID;
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart};
compilerOptionsBuilder.evaluateCompilerFlags();
compilerOptionsBuilder.updateFileLanguage(ProjectFile::CXXSource);
compilerOptionsBuilder.updateFileLanguage(ProjectFile::CSource);
ASSERT_THAT(compilerOptionsBuilder.options(), ElementsAre("/TC"));
}
TEST_F(CompilerOptionsBuilder, AddMsvcCompatibilityVersion)
{
projectPart.toolchainType = ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID;
@@ -491,30 +553,101 @@ TEST_F(CompilerOptionsBuilder, AddProjectConfigFileInclude)
ASSERT_THAT(compilerOptionsBuilder.options(), ElementsAre("-include", "dummy_file.h"));
}
TEST_F(CompilerOptionsBuilder, UndefineClangVersionMacrosForMsvc)
TEST_F(CompilerOptionsBuilder, AddProjectConfigFileIncludeCl)
{
projectPart.projectConfigFile = "dummy_file.h";
projectPart.toolchainType = ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID;
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart};
compilerOptionsBuilder.evaluateCompilerFlags();
compilerOptionsBuilder.addProjectConfigFileInclude();
ASSERT_THAT(compilerOptionsBuilder.options(), ElementsAre("/FI", "dummy_file.h"));
}
TEST_F(CompilerOptionsBuilder, NoUndefineClangVersionMacrosForNewMsvc)
{
projectPart.toolchainType = ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID;
compilerOptionsBuilder.undefineClangVersionMacrosForMsvc();
ASSERT_THAT(compilerOptionsBuilder.options(), Not(Contains(QString{"-U__clang__"})));
}
TEST_F(CompilerOptionsBuilder, UndefineClangVersionMacrosForOldMsvc)
{
projectPart.toolchainType = ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID;
projectPart.toolChainMacros = {ProjectExplorer::Macro{"_MSC_FULL_VER", "1300"},
ProjectExplorer::Macro{"_MSC_VER", "13"}};
compilerOptionsBuilder.undefineClangVersionMacrosForMsvc();
ASSERT_THAT(compilerOptionsBuilder.options(), Contains(QString{"-U__clang__"}));
}
TEST_F(CompilerOptionsBuilder, BuildAllOptions)
{
projectPart.extraCodeModelFlags = QStringList{"-arch", "x86_64"};
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart};
compilerOptionsBuilder.build(ProjectFile::CXXSource, CppTools::UsePrecompiledHeaders::No);
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre(
"-nostdlibinc", "-c", "-m64", "-target", "x86_64-apple-darwin10",
"-x", "c++", "-std=c++17", "-arch", "x86_64", "-Dfoo=bar",
"-DprojectFoo=projectBar", "-undef",
"-I", IsPartOfHeader("wrappedQtHeaders"),
"-I", IsPartOfHeader(QDir::toNativeSeparators("wrappedQtHeaders/QtCore").toStdString()),
"-I", QDir::toNativeSeparators("/tmp/path"),
"-I", QDir::toNativeSeparators("/tmp/system_path"),
"-isystem", QDir::toNativeSeparators("/tmp/builtin_path")
));
ElementsAre("-nostdlibinc",
"-fsyntax-only",
"-m64",
"--target=x86_64-apple-darwin10",
"-x",
"c++",
"-std=c++17",
"-arch",
"x86_64",
"-Dfoo=bar",
"-DprojectFoo=projectBar",
"-undef",
"-I",
IsPartOfHeader("wrappedQtHeaders"),
"-I",
IsPartOfHeader(
QDir::toNativeSeparators("wrappedQtHeaders/QtCore").toStdString()),
"-I",
QDir::toNativeSeparators("/tmp/path"),
"-I",
QDir::toNativeSeparators("/tmp/system_path"),
"-isystem",
QDir::toNativeSeparators("/tmp/builtin_path")));
}
TEST_F(CompilerOptionsBuilder, BuildAllOptionsCl)
{
projectPart.toolchainType = ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID;
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart};
compilerOptionsBuilder.build(ProjectFile::CXXSource, CppTools::UsePrecompiledHeaders::No);
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre("--driver-mode=cl",
"/Zs",
"-m64",
"--target=x86_64-apple-darwin10",
"/TP",
"/std:c++17",
"-fms-compatibility-version=19.00",
"-Dfoo=bar",
"-DprojectFoo=projectBar",
"-D__FUNCSIG__=\"\"",
"-D__FUNCTION__=\"\"",
"-D__FUNCDNAME__=\"\"",
"-I",
IsPartOfHeader("wrappedQtHeaders"),
"-I",
IsPartOfHeader(
QDir::toNativeSeparators("wrappedQtHeaders/QtCore").toStdString()),
"-I",
QDir::toNativeSeparators("/tmp/path"),
"-I",
QDir::toNativeSeparators("/tmp/system_path"),
"/clang:-isystem",
"/clang:" + QDir::toNativeSeparators("/tmp/builtin_path")));
}
}