summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/compileroptionsbuilder.cpp
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/cpptools/compileroptionsbuilder.cpp
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/cpptools/compileroptionsbuilder.cpp')
-rw-r--r--src/plugins/cpptools/compileroptionsbuilder.cpp23
1 files changed, 19 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)});