diff options
author | Cristian Adam <cristian.adam@qt.io> | 2019-09-27 16:13:18 +0200 |
---|---|---|
committer | Cristian Adam <cristian.adam@qt.io> | 2019-09-30 12:13:25 +0000 |
commit | 17270366f364e35d1fb98c7e6ce207387874b0cf (patch) | |
tree | de67affe3d0f70d8744994a1d36e1e9b26e89bf3 /src/plugins/cpptools | |
parent | 0c45372896178b5916c68ceef846f76d9689cab9 (diff) | |
download | qt-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')
-rw-r--r-- | src/plugins/cpptools/compileroptionsbuilder.cpp | 23 | ||||
-rw-r--r-- | src/plugins/cpptools/compileroptionsbuilder.h | 2 |
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(); |