aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/clangcodemodel
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2019-03-13 10:22:16 +0100
committerIvan Donchevskii <ivan.donchevskii@qt.io>2019-03-13 13:17:05 +0000
commita0072afd492d9653d035b3217ddda954154b2d24 (patch)
tree1cacfca604466ab46aca56502ef4d3b88f63cd71 /src/plugins/clangcodemodel
parent3115d082d36d58e878965675d9fd8573b5b83cd3 (diff)
Clang: Improve compilation database generation
Do not use CompilerOptionsBuilder anymore because we don't need much tweaking for projectPart data and can do it better specifically for the generator. Fixes: QTCREATORBUG-21936 Change-Id: I00ad872c703598a9a88af29399b428520dd5cb3b Reviewed-by: Marco Bubke <marco.bubke@qt.io>
Diffstat (limited to 'src/plugins/clangcodemodel')
-rw-r--r--src/plugins/clangcodemodel/clangutils.cpp85
1 files changed, 68 insertions, 17 deletions
diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp
index 481b0774f8..c8e74f663f 100644
--- a/src/plugins/clangcodemodel/clangutils.cpp
+++ b/src/plugins/clangcodemodel/clangutils.cpp
@@ -34,12 +34,13 @@
#include <coreplugin/idocument.h>
#include <cpptools/baseeditordocumentparser.h>
#include <cpptools/compileroptionsbuilder.h>
+#include <cpptools/cppcodemodelsettings.h>
#include <cpptools/cppmodelmanager.h>
+#include <cpptools/cpptoolsreuse.h>
#include <cpptools/editordocumenthandle.h>
#include <cpptools/projectpart.h>
-#include <cpptools/cppcodemodelsettings.h>
-#include <cpptools/cpptoolsreuse.h>
#include <projectexplorer/buildconfiguration.h>
+#include <projectexplorer/kitinformation.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/target.h>
@@ -300,6 +301,18 @@ QString diagnosticCategoryPrefixRemoved(const QString &text)
return text;
}
+static ::Utils::FileName compilerPath(const CppTools::ProjectPart &projectPart)
+{
+ ProjectExplorer::Target *target = projectPart.project->activeTarget();
+ if (!target)
+ return ::Utils::FileName();
+
+ ProjectExplorer::ToolChain *toolchain = ProjectExplorer::ToolChainKitInformation::toolChain(
+ target->kit(), ProjectExplorer::Constants::CXX_LANGUAGE_ID);
+
+ return toolchain->compilerCommand();
+}
+
static ::Utils::FileName buildDirectory(const CppTools::ProjectPart &projectPart)
{
ProjectExplorer::Target *target = projectPart.project->activeTarget();
@@ -313,17 +326,60 @@ static ::Utils::FileName buildDirectory(const CppTools::ProjectPart &projectPart
return buildConfig->buildDirectory();
}
-static QJsonObject createFileObject(CompilerOptionsBuilder &optionsBuilder,
- const ProjectFile &projFile,
- const ::Utils::FileName &buildDir)
+static QStringList projectPartArguments(const ProjectPart &projectPart)
{
- const ProjectFile::Kind kind = ProjectFile::classify(projFile.path);
- optionsBuilder.updateFileLanguage(kind);
+ QStringList args;
+ args << compilerPath(projectPart).toString();
+ args << "-c";
+ if (projectPart.toolchainType != ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) {
+ args << "--target=" + projectPart.toolChainTargetTriple;
+ args << (projectPart.toolChainWordWidth == ProjectPart::WordWidth64Bit
+ ? QLatin1String("-m64")
+ : QLatin1String("-m32"));
+ }
+ args << projectPart.compilerFlags;
+ for (const ProjectExplorer::HeaderPath &headerPath : projectPart.headerPaths) {
+ if (headerPath.type == ProjectExplorer::HeaderPathType::User) {
+ args << "-I" + headerPath.path;
+ } else if (headerPath.type == ProjectExplorer::HeaderPathType::System) {
+ args << (projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID
+ ? "-I"
+ : "-isystem")
+ + headerPath.path;
+ }
+ }
+ for (const ProjectExplorer::Macro &macro : projectPart.projectMacros) {
+ args.append(QString::fromUtf8(
+ macro.toKeyValue(macro.type == ProjectExplorer::MacroType::Define ? "-D" : "-U")));
+ }
+ return args;
+}
+
+static QJsonObject createFileObject(const ::Utils::FileName &buildDir,
+ const QStringList &arguments,
+ const ProjectPart &projectPart,
+ const ProjectFile &projFile)
+{
QJsonObject fileObject;
fileObject["file"] = projFile.path;
- QJsonArray args = QJsonArray::fromStringList(optionsBuilder.options());
- args.prepend(kind == ProjectFile::CXXSource ? "clang++" : "clang");
+ QJsonArray args = QJsonArray::fromStringList(arguments);
+
+ const ProjectFile::Kind kind = ProjectFile::classify(projFile.path);
+ if (projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID
+ || projectPart.toolchainType == ProjectExplorer::Constants::CLANG_CL_TOOLCHAIN_TYPEID) {
+ if (ProjectFile::isC(kind))
+ args.append("/TC");
+ else if (ProjectFile::isCxx(kind))
+ args.append("/TP");
+ } else {
+ QStringList langOption
+ = createLanguageOptionGcc(kind,
+ projectPart.languageExtensions
+ & ::Utils::LanguageExtension::ObjectiveC);
+ for (const QString &langOptionPart : langOption)
+ args.append(langOptionPart);
+ }
args.append(QDir::toNativeSeparators(projFile.path));
fileObject["arguments"] = args;
fileObject["directory"] = buildDir.toString();
@@ -338,17 +394,12 @@ void generateCompilationDB(::Utils::FileName projectDir, CppTools::ProjectInfo p
if (!fileOpened)
return;
compileCommandsFile.write("[");
+
for (ProjectPart::Ptr projectPart : projectInfo.projectParts()) {
const ::Utils::FileName buildDir = buildDirectory(*projectPart);
-
- CompilerOptionsBuilder optionsBuilder(*projectPart,
- UseSystemHeader::No,
- UseTweakedHeaderPaths::No);
- optionsBuilder.build(CppTools::ProjectFile::Unclassified,
- CppTools::UsePrecompiledHeaders::No);
-
+ const QStringList args = projectPartArguments(*projectPart);
for (const ProjectFile &projFile : projectPart->files) {
- const QJsonObject json = createFileObject(optionsBuilder, projFile, buildDir);
+ const QJsonObject json = createFileObject(buildDir, args, *projectPart, projFile);
if (compileCommandsFile.size() > 1)
compileCommandsFile.write(",");
compileCommandsFile.write('\n' + QJsonDocument(json).toJson().trimmed());