forked from qt-creator/qt-creator
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:
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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));
|
||||||
|
@@ -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())};
|
||||||
|
@@ -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();
|
||||||
|
@@ -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();
|
||||||
|
@@ -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()
|
||||||
|
@@ -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 ¯o) const;
|
QByteArray macroOption(const ProjectExplorer::Macro ¯o) const;
|
||||||
QByteArray toDefineOption(const ProjectExplorer::Macro ¯o) const;
|
QByteArray toDefineOption(const ProjectExplorer::Macro ¯o) 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
|
||||||
|
@@ -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));
|
||||||
|
Reference in New Issue
Block a user