diff options
author | Cristian Adam <cristian.adam@qt.io> | 2021-01-11 15:57:16 +0100 |
---|---|---|
committer | Cristian Adam <cristian.adam@qt.io> | 2021-01-14 08:08:40 +0000 |
commit | 98b92ed03ec49e1c0f614266fadf04b2bca408cd (patch) | |
tree | 1e4a8be094e5baf8a3971f0d9eb11076869bfd09 /src/plugins/cpptools/compileroptionsbuilder.cpp | |
parent | a64defa10bb9b1542aa87895e6a0ecd4fb3c6a77 (diff) | |
download | qt-creator-98b92ed03ec49e1c0f614266fadf04b2bca408cd.tar.gz |
CMakeProjectManager: Fix issues with precompiled headers
Clang code model can break if CMake project uses precompiled headers.
QtCreator will make a copy of the precompiled header, this way it
will not conflict with the build system one.
Ammends 888ea6bbbb0f4c6bb6b5616046e600b9520e4faf
Fixes: QTCREATORBUG-24945
Fixes: QTCREATORBUG-25213
Change-Id: I149fc416cd047683d095758a024de47c7baf681c
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Diffstat (limited to 'src/plugins/cpptools/compileroptionsbuilder.cpp')
-rw-r--r-- | src/plugins/cpptools/compileroptionsbuilder.cpp | 52 |
1 files changed, 17 insertions, 35 deletions
diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp index 02ce9a3616..37d64208b1 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.cpp +++ b/src/plugins/cpptools/compileroptionsbuilder.cpp @@ -175,14 +175,6 @@ 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; @@ -369,42 +361,32 @@ void CompilerOptionsBuilder::addHeaderPathOptions() } } -void CompilerOptionsBuilder::addIncludedFiles(const QStringList &files) +void CompilerOptionsBuilder::addIncludeFile(const QString &file) { - QStringList result; + if (QFile::exists(file)) { + add({isClStyle() ? QLatin1String(includeFileOptionCl) + : QLatin1String(includeFileOptionGcc), + QDir::toNativeSeparators(file)}); + } +} - const QString includeOptionString - = QLatin1String(isClStyle() ? includeFileOptionCl : includeFileOptionGcc); +void CompilerOptionsBuilder::addIncludedFiles(const QStringList &files) +{ for (const QString &file : files) { - if (QFile::exists(file)) { - result += includeOptionString; - result += QDir::toNativeSeparators(file); - } + if (m_projectPart.precompiledHeaders.contains(file)) + continue; + + addIncludeFile(file); } - m_options.append(result); } void CompilerOptionsBuilder::addPrecompiledHeaderOptions(UsePrecompiledHeaders usePrecompiledHeaders) { + if (usePrecompiledHeaders == UsePrecompiledHeaders::No) + return; + for (const QString &pchFile : m_projectPart.precompiledHeaders) { - // Bail if build system precompiled 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. - // In case of Clang compilers, also remove the pch-inclusion arguments. - remove({"-Xclang", "-include-pch", "-Xclang", pchFile + ".gch"}); - remove({"-Xclang", "-include-pch", "-Xclang", pchFile + ".pch"}); - remove({isClStyle() ? QLatin1String(includeFileOptionCl) - : QLatin1String(includeFileOptionGcc), pchFile}); - } else if (QFile::exists(pchFile)) { - add({isClStyle() ? QLatin1String(includeFileOptionCl) - : QLatin1String(includeFileOptionGcc), - QDir::toNativeSeparators(pchFile)}); - } + addIncludeFile(pchFile); } } |