Clang: Provide include directory only for libclang

Only libclang has issues with the include directory
search therefore undefining include folders makes sense
only for libclang options builder.

Change-Id: Ie3f62f5f3a89503e6e0ab59e18889e92425c3abc
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Ivan Donchevskii
2018-08-07 15:21:20 +02:00
parent 44b931f7f5
commit 62e776aa8e
9 changed files with 38 additions and 52 deletions

View File

@@ -86,17 +86,32 @@ static QString creatorResourcePath()
#endif #endif
} }
static QString clangIncludeDirectory(const QString &clangVersion,
const QString &clangResourceDirectory)
{
#ifndef UNIT_TESTS
return Core::ICore::clangIncludeDirectory(clangVersion, clangResourceDirectory);
#else
return QString();
#endif
}
class LibClangOptionsBuilder final : public CompilerOptionsBuilder class LibClangOptionsBuilder final : public CompilerOptionsBuilder
{ {
public: public:
LibClangOptionsBuilder(const ProjectPart &projectPart) LibClangOptionsBuilder(const ProjectPart &projectPart)
: CompilerOptionsBuilder(projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR) : CompilerOptionsBuilder(projectPart)
, m_clangVersion(CLANG_VERSION)
, m_clangResourceDirectory(CLANG_RESOURCE_DIR)
{ {
} }
void addPredefinedHeaderPathsOptions() final void addPredefinedHeaderPathsOptions() final
{ {
CompilerOptionsBuilder::addPredefinedHeaderPathsOptions(); CompilerOptionsBuilder::addPredefinedHeaderPathsOptions();
add("-nostdinc");
add("-nostdlibinc");
addClangIncludeFolder();
addWrappedQtHeadersIncludePath(); addWrappedQtHeadersIncludePath();
} }
@@ -117,6 +132,13 @@ public:
} }
private: private:
void addClangIncludeFolder()
{
QTC_CHECK(!m_clangVersion.isEmpty());
add("-I");
add(clangIncludeDirectory(m_clangVersion, m_clangResourceDirectory));
}
void addWrappedQtHeadersIncludePath() void addWrappedQtHeadersIncludePath()
{ {
static const QString resourcePath = creatorResourcePath(); static const QString resourcePath = creatorResourcePath();
@@ -140,6 +162,9 @@ private:
add(QDir::toNativeSeparators(path)); add(QDir::toNativeSeparators(path));
} }
} }
QString m_clangVersion;
QString m_clangResourceDirectory;
}; };
/** /**

View File

@@ -119,7 +119,7 @@ HeaderAndSources ProjectUpdater::headerAndSourcesFromProjectPart(
QStringList ProjectUpdater::compilerArguments(CppTools::ProjectPart *projectPart) QStringList ProjectUpdater::compilerArguments(CppTools::ProjectPart *projectPart)
{ {
using CppTools::CompilerOptionsBuilder; using CppTools::CompilerOptionsBuilder;
CompilerOptionsBuilder builder(*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR); CompilerOptionsBuilder builder(*projectPart);
return builder.build(CppTools::ProjectFile::CXXHeader, CompilerOptionsBuilder::PchUsage::None); return builder.build(CppTools::ProjectFile::CXXHeader, CompilerOptionsBuilder::PchUsage::None);
} }

View File

@@ -153,7 +153,7 @@ Utils::SmallStringVector ClangQueryProjectsFindFilter::compilerArguments(CppTool
{ {
using CppTools::CompilerOptionsBuilder; using CppTools::CompilerOptionsBuilder;
CompilerOptionsBuilder builder(*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR); CompilerOptionsBuilder builder(*projectPart);
return Utils::SmallStringVector(builder.build(fileKind, return Utils::SmallStringVector(builder.build(fileKind,
CompilerOptionsBuilder::PchUsage::None)); CompilerOptionsBuilder::PchUsage::None));

View File

@@ -74,7 +74,7 @@ void RefactoringEngine::startLocalRenaming(const CppTools::CursorInEditor &data,
QString filePath = data.filePath().toString(); QString filePath = data.filePath().toString();
QTextCursor textCursor = data.cursor(); QTextCursor textCursor = data.cursor();
CompilerOptionsBuilder optionsBuilder{*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR}; CompilerOptionsBuilder optionsBuilder{*projectPart};
Utils::SmallStringVector commandLine{optionsBuilder.build( Utils::SmallStringVector commandLine{optionsBuilder.build(
fileKindInProjectPart(projectPart, filePath), fileKindInProjectPart(projectPart, filePath),
CppTools::getPchUsage())}; CppTools::getPchUsage())};

View File

@@ -186,16 +186,12 @@ private:
bool m_success = false; bool m_success = false;
}; };
static AnalyzeUnits toAnalyzeUnits(const FileInfos &fileInfos, static AnalyzeUnits toAnalyzeUnits(const FileInfos &fileInfos)
const QString &clangVersion,
const QString &clangResourceDirectory)
{ {
AnalyzeUnits unitsToAnalyze; AnalyzeUnits unitsToAnalyze;
const CompilerOptionsBuilder::PchUsage pchUsage = CppTools::getPchUsage(); const CompilerOptionsBuilder::PchUsage pchUsage = CppTools::getPchUsage();
for (const FileInfo &fileInfo : fileInfos) { for (const FileInfo &fileInfo : fileInfos) {
CompilerOptionsBuilder optionsBuilder(*fileInfo.projectPart, CompilerOptionsBuilder optionsBuilder(*fileInfo.projectPart);
clangVersion,
clangResourceDirectory);
QStringList arguments = extraClangToolsPrependOptions(); QStringList arguments = extraClangToolsPrependOptions();
arguments.append(optionsBuilder.build(fileInfo.kind, pchUsage)); arguments.append(optionsBuilder.build(fileInfo.kind, pchUsage));
arguments.append(extraClangToolsAppendOptions()); arguments.append(extraClangToolsAppendOptions());
@@ -205,13 +201,11 @@ static AnalyzeUnits toAnalyzeUnits(const FileInfos &fileInfos,
return unitsToAnalyze; return unitsToAnalyze;
} }
AnalyzeUnits ClangToolRunControl::unitsToAnalyze(const QString &clangVersion) AnalyzeUnits ClangToolRunControl::unitsToAnalyze()
{ {
QTC_ASSERT(m_projectInfo.isValid(), return AnalyzeUnits()); QTC_ASSERT(m_projectInfo.isValid(), return AnalyzeUnits());
const QString clangResourceDirectory = Core::ICore::clangIncludeDirectory(m_clangExecutable, return toAnalyzeUnits(m_fileInfos);
clangVersion);
return toAnalyzeUnits(m_fileInfos, clangVersion, clangResourceDirectory);
} }
static QDebug operator<<(QDebug debug, const Utils::Environment &environment) static QDebug operator<<(QDebug debug, const Utils::Environment &environment)
@@ -313,7 +307,7 @@ void ClangToolRunControl::start()
} }
// Collect files // Collect files
const AnalyzeUnits unitsToProcess = unitsToAnalyze(CLANG_VERSION); const AnalyzeUnits unitsToProcess = unitsToAnalyze();
qCDebug(LOG) << "Files to process:" << unitsToProcess; qCDebug(LOG) << "Files to process:" << unitsToProcess;
m_unitsToProcess = unitsToProcess; m_unitsToProcess = unitsToProcess;
m_initialFilesToProcessSize = m_unitsToProcess.count(); m_initialFilesToProcessSize = m_unitsToProcess.count();

View File

@@ -77,7 +77,7 @@ private:
void start() final; void start() final;
void stop() final; void stop() final;
AnalyzeUnits unitsToAnalyze(const QString &clangVersion); AnalyzeUnits unitsToAnalyze();
void analyzeNextFile(); void analyzeNextFile();
void handleFinished(); void handleFinished();

View File

@@ -39,14 +39,8 @@
namespace CppTools { namespace CppTools {
static constexpr char SYSTEM_INCLUDE_PREFIX[] = "-isystem"; CompilerOptionsBuilder::CompilerOptionsBuilder(const ProjectPart &projectPart)
CompilerOptionsBuilder::CompilerOptionsBuilder(const ProjectPart &projectPart,
const QString &clangVersion,
const QString &clangResourceDirectory)
: m_projectPart(projectPart) : m_projectPart(projectPart)
, m_clangVersion(clangVersion)
, m_clangResourceDirectory(clangResourceDirectory)
{ {
} }
@@ -500,31 +494,9 @@ bool CompilerOptionsBuilder::excludeHeaderPath(const QString &headerPath) const
void CompilerOptionsBuilder::addPredefinedHeaderPathsOptions() void CompilerOptionsBuilder::addPredefinedHeaderPathsOptions()
{ {
add("-nostdinc");
add("-nostdlibinc");
// In case of MSVC we need builtin clang defines to correctly handle clang includes // In case of MSVC we need builtin clang defines to correctly handle clang includes
if (m_projectPart.toolchainType != ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) if (m_projectPart.toolchainType != ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID)
add("-undef"); add("-undef");
addClangIncludeFolder();
}
static QString clangIncludeDirectory(const QString &clangVersion,
const QString &clangResourceDirectory)
{
#ifndef UNIT_TESTS
return Core::ICore::clangIncludeDirectory(clangVersion, clangResourceDirectory);
#else
return QString();
#endif
}
void CompilerOptionsBuilder::addClangIncludeFolder()
{
QTC_CHECK(!m_clangVersion.isEmpty());
add(SYSTEM_INCLUDE_PREFIX);
add(clangIncludeDirectory(m_clangVersion, m_clangResourceDirectory));
} }
void CompilerOptionsBuilder::addProjectConfigFileInclude() void CompilerOptionsBuilder::addProjectConfigFileInclude()

View File

@@ -39,9 +39,7 @@ public:
Use Use
}; };
CompilerOptionsBuilder(const ProjectPart &projectPart, CompilerOptionsBuilder(const ProjectPart &projectPart);
const QString &clangVersion = QString(),
const QString &clangResourceDirectory = QString());
virtual ~CompilerOptionsBuilder() {} virtual ~CompilerOptionsBuilder() {}
virtual void addTargetTriple(); virtual void addTargetTriple();
@@ -90,11 +88,8 @@ private:
QByteArray macroOption(const ProjectExplorer::Macro &macro) const; QByteArray macroOption(const ProjectExplorer::Macro &macro) const;
QByteArray toDefineOption(const ProjectExplorer::Macro &macro) const; QByteArray toDefineOption(const ProjectExplorer::Macro &macro) const;
QString defineDirectiveToDefineOption(const ProjectExplorer::Macro &marco) const; QString defineDirectiveToDefineOption(const ProjectExplorer::Macro &marco) const;
void addClangIncludeFolder();
QStringList m_options; QStringList m_options;
QString m_clangVersion;
QString m_clangResourceDirectory;
}; };
} // namespace CppTools } // namespace CppTools

View File

@@ -149,7 +149,7 @@ void RefactoringEngine::SetUp()
projectPart = CppTools::ProjectPart::Ptr(new CppTools::ProjectPart); projectPart = CppTools::ProjectPart::Ptr(new CppTools::ProjectPart);
projectPart->files.push_back(projectFile); projectPart->files.push_back(projectFile);
CompilerOptionsBuilder optionsBuilder(*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR); CompilerOptionsBuilder optionsBuilder(*projectPart);
commandLine = Utils::SmallStringVector(optionsBuilder.build( commandLine = Utils::SmallStringVector(optionsBuilder.build(
projectFile.kind, projectFile.kind,
CompilerOptionsBuilder::PchUsage::None)); CompilerOptionsBuilder::PchUsage::None));