From 7454f849014171134e620893f9afc4b7b3f05bf0 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Mon, 5 Feb 2024 13:49:27 +0100 Subject: [PATCH] CMakePM: When using presets only use presets for candidates Since the CMake presets is built upon Imports, when loading the presets it's better to only use the candidates from preset Kits and not any matching Kit that could handle the build directory. This makes working with CMake Presets a bit easier. Task-number: QTCREATORBUG-29535 Change-Id: I895e2e9162763e4cf3af5cdef5c9d5b228211fab Reviewed-by: Marcus Tillmanns --- .../cmakeprojectimporter.cpp | 35 ++++++++++++------- .../cmakeprojectimporter.h | 1 + 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp index 2d9631eb400..2ff01898cdc 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp @@ -147,20 +147,31 @@ static QString displayPresetName(const QString &presetName) FilePaths CMakeProjectImporter::importCandidates() { - FilePaths candidates; + FilePaths candidates = presetCandidates(); - candidates << scanDirectory(projectFilePath().absolutePath(), "build"); + if (candidates.isEmpty()) { + candidates << scanDirectory(projectFilePath().absolutePath(), "build"); - const QList kits = KitManager::kits(); - for (const Kit *k : kits) { - FilePath shadowBuildDirectory - = CMakeBuildConfiguration::shadowBuildDirectory(projectFilePath(), - k, - QString(), - BuildConfiguration::Unknown); - candidates << scanDirectory(shadowBuildDirectory.absolutePath(), QString()); + const QList kits = KitManager::kits(); + for (const Kit *k : kits) { + FilePath shadowBuildDirectory + = CMakeBuildConfiguration::shadowBuildDirectory(projectFilePath(), + k, + QString(), + BuildConfiguration::Unknown); + candidates << scanDirectory(shadowBuildDirectory.absolutePath(), QString()); + } } + const FilePaths finalists = Utils::filteredUnique(candidates); + qCInfo(cmInputLog) << "import candidates:" << finalists; + return finalists; +} + +FilePaths CMakeProjectImporter::presetCandidates() +{ + FilePaths candidates; + for (const auto &configPreset : m_project->presetsData().configurePresets) { if (configPreset.hidden.value()) continue; @@ -190,9 +201,7 @@ FilePaths CMakeProjectImporter::importCandidates() } } - const FilePaths finalists = Utils::filteredUnique(candidates); - qCInfo(cmInputLog) << "import candidates:" << finalists; - return finalists; + return candidates; } Target *CMakeProjectImporter::preferredTarget(const QList &possibleTargets) diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h index ba8af4d61bc..e3b329e722f 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h @@ -25,6 +25,7 @@ public: Utils::FilePaths importCandidates() final; ProjectExplorer::Target *preferredTarget(const QList &possibleTargets) final; + Utils::FilePaths presetCandidates(); private: QList examineDirectory(const Utils::FilePath &importPath, QString *warningMessage) const final;