From 19119b953395257bac345486a3ab10b9c5cf16c5 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 15 Oct 2021 16:24:25 +0200 Subject: [PATCH] ClangCodeModel: Use more suitable location for compile_commands.json ... for clangd. Putting it in the build directory seems sensible in principle, but that can be problematic for in-source builds. So introduce another level of nesting to prevent conflicts. Fixes: QTCREATORBUG-26431 Change-Id: Id66aa0852d206695f2fc2ec42292b1cecefe2b59 Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangcodemodelplugin.cpp | 2 +- .../clangcodemodel/clangmodelmanagersupport.cpp | 4 ++-- src/plugins/clangcodemodel/clangutils.cpp | 13 +++++-------- src/plugins/clangcodemodel/clangutils.h | 4 ++-- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp index a6ead8c3fe2..3a13c4542db 100644 --- a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp +++ b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp @@ -82,7 +82,7 @@ void ClangCodeModelPlugin::generateCompilationDB() QFuture task = QtConcurrent::run(&Internal::generateCompilationDB, projectInfo, - CompilationDbPurpose::Project, + projectInfo->buildRoot(), CompilationDbPurpose::Project, warningsConfigForProject(target->project()), optionsForProject(target->project())); Core::ProgressManager::addTask(task, tr("Generating Compilation DB"), "generate compilation db"); diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index 5be1f2c83cd..d1c6b0d0ce3 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -286,7 +286,7 @@ void ClangModelManagerSupport::updateLanguageClient( if (const ProjectExplorer::Target * const target = project->activeTarget()) { if (const ProjectExplorer::BuildConfiguration * const bc = target->activeBuildConfiguration()) { - return bc->buildDirectory(); + return bc->buildDirectory() / ".qtc_clangd"; } } return Utils::FilePath(); @@ -363,7 +363,7 @@ void ClangModelManagerSupport::updateLanguageClient( }); }); - auto future = Utils::runAsync(&Internal::generateCompilationDB, projectInfo, + auto future = Utils::runAsync(&Internal::generateCompilationDB, projectInfo, jsonDbDir, CompilationDbPurpose::CodeModel, warningsConfigForProject(project), optionsForProject(project)); diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index bbe9817380e..a089248d039 100644 --- a/src/plugins/clangcodemodel/clangutils.cpp +++ b/src/plugins/clangcodemodel/clangutils.cpp @@ -372,18 +372,15 @@ static QJsonObject createFileObject(const FilePath &buildDir, } GenerateCompilationDbResult generateCompilationDB(const CppEditor::ProjectInfo::ConstPtr projectInfo, + const Utils::FilePath &baseDir, CompilationDbPurpose purpose, const ClangDiagnosticConfig &warningsConfig, const QStringList &projectOptions) { - const FilePath buildDir = projectInfo->buildRoot(); - QTC_ASSERT(!buildDir.isEmpty(), return GenerateCompilationDbResult(QString(), + QTC_ASSERT(!baseDir.isEmpty(), return GenerateCompilationDbResult(QString(), QCoreApplication::translate("ClangUtils", "Could not retrieve build directory."))); - - QDir dir(buildDir.toString()); - if (!dir.exists()) - dir.mkpath(dir.path()); - QFile compileCommandsFile(buildDir.toString() + "/compile_commands.json"); + QTC_CHECK(baseDir.ensureWritableDir()); + QFile compileCommandsFile(baseDir.toString() + "/compile_commands.json"); const bool fileOpened = compileCommandsFile.open(QIODevice::WriteOnly | QIODevice::Truncate); if (!fileOpened) { return GenerateCompilationDbResult(QString(), @@ -397,7 +394,7 @@ GenerateCompilationDbResult generateCompilationDB(const CppEditor::ProjectInfo:: if (purpose == CompilationDbPurpose::Project) args = projectPartArguments(*projectPart); for (const ProjectFile &projFile : projectPart->files) { - const QJsonObject json = createFileObject(buildDir, args, *projectPart, projFile, + const QJsonObject json = createFileObject(baseDir, args, *projectPart, projFile, purpose, warningsConfig, projectOptions); if (compileCommandsFile.size() > 1) compileCommandsFile.write(","); diff --git a/src/plugins/clangcodemodel/clangutils.h b/src/plugins/clangcodemodel/clangutils.h index 1d46e6a49b0..c3a496f7797 100644 --- a/src/plugins/clangcodemodel/clangutils.h +++ b/src/plugins/clangcodemodel/clangutils.h @@ -88,8 +88,8 @@ public: enum class CompilationDbPurpose { Project, CodeModel }; GenerateCompilationDbResult generateCompilationDB(const CppEditor::ProjectInfo::ConstPtr projectInfo, - CompilationDbPurpose purpose, const CppEditor::ClangDiagnosticConfig &warningsConfig, - const QStringList &projectOptions); + const Utils::FilePath &baseDir, CompilationDbPurpose purpose, + const CppEditor::ClangDiagnosticConfig &warningsConfig, const QStringList &projectOptions); class DiagnosticTextInfo {