Clang: Fix how tweaked header paths work

We need to provide built-in includes only when we use tweaked headers.
Also let's require Clang resource directory because it has to be
placed on the specific position inside the built-in header paths.

Change-Id: Id581238660c680725201de759216cf33f69f6cc7
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
Ivan Donchevskii
2019-01-17 15:27:36 +01:00
parent 87746b5906
commit 093673e9cf
3 changed files with 205 additions and 134 deletions

View File

@@ -296,27 +296,22 @@ void CompilerOptionsBuilder::addHeaderPathOptions()
using ProjectExplorer::HeaderPath;
using ProjectExplorer::HeaderPathType;
for (const HeaderPath &headerPath : filter.userHeaderPaths)
addIncludeDirOptionForPath(headerPath);
for (const HeaderPath &headerPath : filter.systemHeaderPaths)
addIncludeDirOptionForPath(headerPath);
if (m_useTweakedHeaderPaths == UseTweakedHeaderPaths::Yes) {
// Exclude all built-in includes except Clang resource directory.
QTC_CHECK(!m_clangVersion.isEmpty()
&& "Clang resource directory is required with UseTweakedHeaderPaths::Yes.");
if (!isClStyle()) // MSVC does not have such include directories - ignore it for cl driver.
m_options.prepend("-nostdlibinc");
if (!m_clangVersion.isEmpty()) {
// Exclude all built-in includes and Clang resource directory.
m_options.prepend("-nostdinc++");
m_options.prepend("-nostdinc");
for (const HeaderPath &headerPath : filter.builtInHeaderPaths)
addIncludeDirOptionForPath(headerPath);
}
}
for (const HeaderPath &headerPath : qAsConst(filter.userHeaderPaths))
addIncludeDirOptionForPath(headerPath);
for (const HeaderPath &headerPath : qAsConst(filter.systemHeaderPaths))
addIncludeDirOptionForPath(headerPath);
for (const HeaderPath &headerPath : qAsConst(filter.builtInHeaderPaths))
addIncludeDirOptionForPath(headerPath);
}
void CompilerOptionsBuilder::addPrecompiledHeaderOptions(UsePrecompiledHeaders usePrecompiledHeaders)

View File

@@ -45,7 +45,7 @@ class CPPTOOLS_EXPORT CompilerOptionsBuilder
public:
CompilerOptionsBuilder(const ProjectPart &projectPart,
UseSystemHeader useSystemHeader = UseSystemHeader::No,
UseTweakedHeaderPaths useTweakedHeaderPaths = UseTweakedHeaderPaths::Yes,
UseTweakedHeaderPaths useTweakedHeaderPaths = UseTweakedHeaderPaths::No,
UseLanguageDefines useLanguageDefines = UseLanguageDefines::No,
const QString &clangVersion = QString(),
const QString &clangResourceDirectory = QString());

View File

@@ -90,7 +90,7 @@ TEST_F(CompilerOptionsBuilder, CompilerFlagsFiltering_UnknownOptionsAreForwarded
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{part,
CppTools::UseSystemHeader::No,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseTweakedHeaderPaths::No,
CppTools::UseLanguageDefines::Yes};
compilerOptionsBuilder.build(ProjectFile::CXXSource, CppTools::UsePrecompiledHeaders::No);
@@ -105,7 +105,7 @@ TEST_F(CompilerOptionsBuilder, CompilerFlagsFiltering_DiagnosticOptionsAreRemove
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{part,
CppTools::UseSystemHeader::No,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseTweakedHeaderPaths::No,
CppTools::UseLanguageDefines::Yes};
compilerOptionsBuilder.build(ProjectFile::CXXSource, CppTools::UsePrecompiledHeaders::No);
@@ -124,7 +124,7 @@ TEST_F(CompilerOptionsBuilder, CompilerFlagsFiltering_CLanguageVersionIsRewritte
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{part,
CppTools::UseSystemHeader::No,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseTweakedHeaderPaths::No,
CppTools::UseLanguageDefines::Yes};
compilerOptionsBuilder.build(ProjectFile::CSource, CppTools::UsePrecompiledHeaders::No);
@@ -137,7 +137,7 @@ TEST_F(CompilerOptionsBuilder, CompilerFlagsFiltering_LanguageVersionIsExplicitl
{
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart,
CppTools::UseSystemHeader::No,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseTweakedHeaderPaths::No,
CppTools::UseLanguageDefines::Yes};
compilerOptionsBuilder.build(ProjectFile::CXXSource, CppTools::UsePrecompiledHeaders::No);
@@ -150,7 +150,7 @@ TEST_F(CompilerOptionsBuilder, CompilerFlagsFiltering_ClLanguageVersionIsExplici
projectPart.toolchainType = ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID;
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart,
CppTools::UseSystemHeader::No,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseTweakedHeaderPaths::No,
CppTools::UseLanguageDefines::Yes};
compilerOptionsBuilder.build(ProjectFile::CXXSource, CppTools::UsePrecompiledHeaders::No);
@@ -167,60 +167,87 @@ TEST_F(CompilerOptionsBuilder, AddWordWidth)
TEST_F(CompilerOptionsBuilder, HeaderPathOptionsOrder)
{
compilerOptionsBuilder.addHeaderPathOptions();
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre("-nostdlibinc",
"-I", QDir::toNativeSeparators("/tmp/path"),
"-I", QDir::toNativeSeparators("/tmp/system_path"),
"-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);
compilerOptionsBuilder.addHeaderPathOptions();
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre("-nostdlibinc",
"-I", QDir::toNativeSeparators("/tmp/path"),
"-isystem", QDir::toNativeSeparators("/tmp/system_path"),
"-isystem", QDir::toNativeSeparators("/tmp/builtin_path")));
}
TEST_F(CompilerOptionsBuilder, ClangHeadersPath)
{
CppTools::CompilerOptionsBuilder compilerOptionsBuilder(projectPart,
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart,
CppTools::UseSystemHeader::No,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseLanguageDefines::No,
"7.0.0",
"");
"dummy_version",
""};
compilerOptionsBuilder.addHeaderPathOptions();
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre("-nostdinc",
"-nostdlibinc",
"-I", QDir::toNativeSeparators("/tmp/path"),
"-I", QDir::toNativeSeparators("/tmp/system_path"),
"-isystem", QDir::toNativeSeparators(CLANG_RESOURCE_DIR ""),
"-isystem", QDir::toNativeSeparators("/tmp/builtin_path")));
"-nostdinc++",
"-I",
QDir::toNativeSeparators("/tmp/path"),
"-I",
QDir::toNativeSeparators("/tmp/system_path"),
"-isystem",
QDir::toNativeSeparators(CLANG_RESOURCE_DIR ""),
"-isystem",
QDir::toNativeSeparators("/tmp/builtin_path")));
}
TEST_F(CompilerOptionsBuilder, HeaderPathOptionsOrderCl)
{
projectPart.toolchainType = ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID;
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart,
CppTools::UseSystemHeader::No,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseLanguageDefines::No,
"dummy_version",
""};
compilerOptionsBuilder.evaluateCompilerFlags();
compilerOptionsBuilder.addHeaderPathOptions();
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre("-nostdinc",
"-nostdinc++",
"-I",
QDir::toNativeSeparators("/tmp/path"),
"-I",
QDir::toNativeSeparators("/tmp/system_path"),
"/clang:-isystem",
"/clang:" + QDir::toNativeSeparators(CLANG_RESOURCE_DIR ""),
"/clang:-isystem",
"/clang:" + QDir::toNativeSeparators("/tmp/builtin_path")));
}
TEST_F(CompilerOptionsBuilder, UseSystemHeader)
{
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart,
CppTools::UseSystemHeader::Yes,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseLanguageDefines::No,
"dummy_version",
""};
compilerOptionsBuilder.addHeaderPathOptions();
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre("-nostdinc",
"-nostdinc++",
"-I",
QDir::toNativeSeparators("/tmp/path"),
"-isystem",
QDir::toNativeSeparators("/tmp/system_path"),
"-isystem",
QDir::toNativeSeparators(CLANG_RESOURCE_DIR ""),
"-isystem",
QDir::toNativeSeparators("/tmp/builtin_path")));
}
TEST_F(CompilerOptionsBuilder, NoClangHeadersPath)
{
compilerOptionsBuilder.addHeaderPathOptions();
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre("-I",
QDir::toNativeSeparators("/tmp/path"),
"-I",
QDir::toNativeSeparators("/tmp/system_path")));
}
TEST_F(CompilerOptionsBuilder, ClangHeadersAndCppIncludesPathsOrderMacOs)
@@ -238,23 +265,34 @@ TEST_F(CompilerOptionsBuilder, ClangHeadersAndCppIncludesPathsOrderMacOs)
CppTools::UseSystemHeader::No,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseLanguageDefines::No,
"7.0.0",
"dummy_version",
"");
compilerOptionsBuilder.addHeaderPathOptions();
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre("-nostdinc",
"-nostdlibinc",
"-I", QDir::toNativeSeparators("/tmp/path"),
"-I", QDir::toNativeSeparators("/tmp/system_path"),
"-isystem", QDir::toNativeSeparators("/usr/include/c++/4.2.1"),
"-isystem", QDir::toNativeSeparators("/usr/include/c++/4.2.1/backward"),
"-isystem", QDir::toNativeSeparators("/usr/local/include"),
"-isystem", QDir::toNativeSeparators(CLANG_RESOURCE_DIR ""),
"-isystem", QDir::toNativeSeparators("/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include"),
"-isystem", QDir::toNativeSeparators("/usr/include"),
"-isystem", QDir::toNativeSeparators("/tmp/builtin_path")));
"-nostdinc++",
"-I",
QDir::toNativeSeparators("/tmp/path"),
"-I",
QDir::toNativeSeparators("/tmp/system_path"),
"-isystem",
QDir::toNativeSeparators("/usr/include/c++/4.2.1"),
"-isystem",
QDir::toNativeSeparators("/usr/include/c++/4.2.1/backward"),
"-isystem",
QDir::toNativeSeparators("/usr/local/include"),
"-isystem",
QDir::toNativeSeparators(CLANG_RESOURCE_DIR ""),
"-isystem",
QDir::toNativeSeparators(
"/Applications/Xcode.app/Contents/Developer/Toolchains/"
"XcodeDefault.xctoolchain/usr/include"),
"-isystem",
QDir::toNativeSeparators("/usr/include"),
"-isystem",
QDir::toNativeSeparators("/tmp/builtin_path")));
}
TEST_F(CompilerOptionsBuilder, ClangHeadersAndCppIncludesPathsOrderLinux)
@@ -272,22 +310,35 @@ TEST_F(CompilerOptionsBuilder, ClangHeadersAndCppIncludesPathsOrderLinux)
CppTools::UseSystemHeader::No,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseLanguageDefines::No,
"7.0.0",
"dummy_version",
"");
compilerOptionsBuilder.addHeaderPathOptions();
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre("-nostdinc",
"-nostdlibinc",
"-isystem", QDir::toNativeSeparators("/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8"),
"-isystem", QDir::toNativeSeparators("/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/backward"),
"-isystem", QDir::toNativeSeparators("/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/x86_64-linux-gnu/c++/4.8"),
"-isystem", QDir::toNativeSeparators(CLANG_RESOURCE_DIR ""),
"-isystem", QDir::toNativeSeparators("/usr/local/include"),
"-isystem", QDir::toNativeSeparators("/usr/lib/gcc/x86_64-linux-gnu/4.8/include"),
"-isystem", QDir::toNativeSeparators("/usr/include/x86_64-linux-gnu"),
"-isystem", QDir::toNativeSeparators("/usr/include")));
ASSERT_THAT(
compilerOptionsBuilder.options(),
ElementsAre(
"-nostdinc",
"-nostdinc++",
"-isystem",
QDir::toNativeSeparators(
"/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8"),
"-isystem",
QDir::toNativeSeparators(
"/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/backward"),
"-isystem",
QDir::toNativeSeparators(
"/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/x86_64-linux-gnu/c++/4.8"),
"-isystem",
QDir::toNativeSeparators(CLANG_RESOURCE_DIR ""),
"-isystem",
QDir::toNativeSeparators("/usr/local/include"),
"-isystem",
QDir::toNativeSeparators("/usr/lib/gcc/x86_64-linux-gnu/4.8/include"),
"-isystem",
QDir::toNativeSeparators("/usr/include/x86_64-linux-gnu"),
"-isystem",
QDir::toNativeSeparators("/usr/include")));
}
TEST_F(CompilerOptionsBuilder, ClangHeadersAndCppIncludesPathsOrderNoVersion)
@@ -305,18 +356,18 @@ TEST_F(CompilerOptionsBuilder, ClangHeadersAndCppIncludesPathsOrderNoVersion)
CppTools::UseSystemHeader::No,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseLanguageDefines::No,
"7.0.0",
"dummy_version",
"");
compilerOptionsBuilder.addHeaderPathOptions();
ASSERT_THAT(
compilerOptionsBuilder.options(),
ElementsAre(
"-nostdinc",
"-nostdlibinc",
ElementsAre("-nostdinc",
"-nostdinc++",
"-isystem",
QDir::toNativeSeparators("C:/Qt/Tools/mingw530_32/i686-w64-mingw32/include/c++"),
QDir::toNativeSeparators(
"C:/Qt/Tools/mingw530_32/i686-w64-mingw32/include/c++"),
"-isystem",
QDir::toNativeSeparators(
"C:/Qt/Tools/mingw530_32/i686-w64-mingw32/include/c++/i686-w64-mingw32"),
@@ -352,25 +403,26 @@ TEST_F(CompilerOptionsBuilder, ClangHeadersAndCppIncludesPathsOrderAndroidClang)
CppTools::UseSystemHeader::No,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseLanguageDefines::No,
"7.0.0",
"dummy_version",
"");
compilerOptionsBuilder.addHeaderPathOptions();
ASSERT_THAT(
compilerOptionsBuilder.options(),
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre("-nostdinc",
"-nostdlibinc",
"-nostdinc++",
"-isystem",
QDir::toNativeSeparators("C:/Users/test/AppData/Local/Android/sdk/ndk-"
"bundle/sources/cxx-stl/llvm-libc++/include"),
"-isystem",
QDir::toNativeSeparators("C:/Users/test/AppData/Local/Android/sdk/ndk-"
QDir::toNativeSeparators(
"C:/Users/test/AppData/Local/Android/sdk/ndk-"
"bundle/sources/cxx-stl/llvm-libc++abi/include"),
"-isystem",
QDir::toNativeSeparators(CLANG_RESOURCE_DIR ""),
"-isystem",
QDir::toNativeSeparators("C:/Users/test/AppData/Local/Android/sdk/ndk-"
QDir::toNativeSeparators(
"C:/Users/test/AppData/Local/Android/sdk/ndk-"
"bundle/sysroot/usr/include/i686-linux-android"),
"-isystem",
QDir::toNativeSeparators("C:/Users/test/AppData/Local/Android/sdk/ndk-"
@@ -424,6 +476,13 @@ TEST_F(CompilerOptionsBuilder, AddTargetTriple)
TEST_F(CompilerOptionsBuilder, InsertWrappedQtHeaders)
{
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart,
CppTools::UseSystemHeader::Yes,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseLanguageDefines::No,
"dummy_version",
""};
compilerOptionsBuilder.insertWrappedQtHeaders();
ASSERT_THAT(compilerOptionsBuilder.options(), Contains(IsPartOfHeader("wrappedQtHeaders")));
@@ -550,12 +609,18 @@ TEST_F(CompilerOptionsBuilder, UndefineClangVersionMacrosForOldMsvc)
TEST_F(CompilerOptionsBuilder, BuildAllOptions)
{
projectPart.extraCodeModelFlags = QStringList{"-arch", "x86_64"};
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart};
CppTools::CompilerOptionsBuilder compilerOptionsBuilder(projectPart,
CppTools::UseSystemHeader::No,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseLanguageDefines::No,
"dummy_version",
"");
compilerOptionsBuilder.build(ProjectFile::CXXSource, CppTools::UsePrecompiledHeaders::No);
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre("-nostdlibinc",
ElementsAre("-nostdinc",
"-nostdinc++",
"-fsyntax-only",
"-m64",
"--target=x86_64-apple-darwin10",
@@ -575,18 +640,27 @@ TEST_F(CompilerOptionsBuilder, BuildAllOptions)
"-I",
QDir::toNativeSeparators("/tmp/system_path"),
"-isystem",
QDir::toNativeSeparators(CLANG_RESOURCE_DIR ""),
"-isystem",
QDir::toNativeSeparators("/tmp/builtin_path")));
}
TEST_F(CompilerOptionsBuilder, BuildAllOptionsCl)
{
projectPart.toolchainType = ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID;
CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart};
CppTools::CompilerOptionsBuilder compilerOptionsBuilder(projectPart,
CppTools::UseSystemHeader::No,
CppTools::UseTweakedHeaderPaths::Yes,
CppTools::UseLanguageDefines::No,
"dummy_version",
"");
compilerOptionsBuilder.build(ProjectFile::CXXSource, CppTools::UsePrecompiledHeaders::No);
ASSERT_THAT(compilerOptionsBuilder.options(),
ElementsAre("--driver-mode=cl",
ElementsAre("-nostdinc",
"-nostdinc++",
"--driver-mode=cl",
"/Zs",
"-m64",
"--target=x86_64-apple-darwin10",
@@ -607,6 +681,8 @@ TEST_F(CompilerOptionsBuilder, BuildAllOptionsCl)
"-I",
QDir::toNativeSeparators("/tmp/system_path"),
"/clang:-isystem",
"/clang:" + QDir::toNativeSeparators(CLANG_RESOURCE_DIR ""),
"/clang:-isystem",
"/clang:" + QDir::toNativeSeparators("/tmp/builtin_path")));
}
}