summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorCristian Adam <cristian.adam@qt.io>2019-09-27 16:13:18 +0200
committerCristian Adam <cristian.adam@qt.io>2019-09-30 12:13:25 +0000
commit17270366f364e35d1fb98c7e6ce207387874b0cf (patch)
treede67affe3d0f70d8744994a1d36e1e9b26e89bf3 /src/plugins
parent0c45372896178b5916c68ceef846f76d9689cab9 (diff)
downloadqt-creator-17270366f364e35d1fb98c7e6ce207387874b0cf.tar.gz
CppTools: Do not use PCH when build PCH artifacts exist closeby
Clang cannot handle gcc pch files which are close to the forced include header. Fixes: QTCREATORBUG-22888 Change-Id: I0d678a889d1fb62bf3c6850277e13271efb91eea Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/cpptools/compileroptionsbuilder.cpp23
-rw-r--r--src/plugins/cpptools/compileroptionsbuilder.h2
2 files changed, 21 insertions, 4 deletions
diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp
index e2858fb368..109613d2c0 100644
--- a/src/plugins/cpptools/compileroptionsbuilder.cpp
+++ b/src/plugins/cpptools/compileroptionsbuilder.cpp
@@ -172,6 +172,14 @@ void CompilerOptionsBuilder::addSyntaxOnly()
isClStyle() ? add("/Zs") : add("-fsyntax-only");
}
+void CompilerOptionsBuilder::remove(const QStringList &args)
+{
+ auto foundPos = std::search(m_options.begin(), m_options.end(),
+ args.begin(), args.end());
+ if (foundPos != m_options.end())
+ m_options.erase(foundPos, std::next(foundPos, args.size()));
+}
+
QStringList createLanguageOptionGcc(ProjectFile::Kind fileKind, bool objcExt)
{
QStringList options;
@@ -320,11 +328,18 @@ void CompilerOptionsBuilder::addHeaderPathOptions()
void CompilerOptionsBuilder::addPrecompiledHeaderOptions(UsePrecompiledHeaders usePrecompiledHeaders)
{
- if (usePrecompiledHeaders == UsePrecompiledHeaders::No)
- return;
-
for (const QString &pchFile : m_projectPart.precompiledHeaders) {
- if (QFile::exists(pchFile)) {
+ // Bail if build system precomiple header artifacts exists
+ // Clang cannot handle foreign PCH files.
+ if (QFile::exists(pchFile + ".gch") || QFile::exists(pchFile + ".pch"))
+ usePrecompiledHeaders = UsePrecompiledHeaders::No;
+
+ if (usePrecompiledHeaders == UsePrecompiledHeaders::No) {
+ // CMake PCH will already have force included the header file in
+ // command line options, remove it if exists.
+ remove({isClStyle() ? QLatin1String(includeFileOptionCl)
+ : QLatin1String(includeFileOptionGcc), pchFile});
+ } else if (QFile::exists(pchFile)) {
add({isClStyle() ? QLatin1String(includeFileOptionCl)
: QLatin1String(includeFileOptionGcc),
QDir::toNativeSeparators(pchFile)});
diff --git a/src/plugins/cpptools/compileroptionsbuilder.h b/src/plugins/cpptools/compileroptionsbuilder.h
index 349279710a..5b7c682407 100644
--- a/src/plugins/cpptools/compileroptionsbuilder.h
+++ b/src/plugins/cpptools/compileroptionsbuilder.h
@@ -85,6 +85,8 @@ public:
void add(const QStringList &args, bool gccOnlyOptions = false);
virtual void addExtraOptions() {}
+ void remove(const QStringList &args);
+
static UseToolchainMacros useToolChainMacros();
void reset();