summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeproject.cpp13
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeproject.h4
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectconstants.h1
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp25
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectimporter.h7
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp89
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectmanager.h2
-rw-r--r--src/plugins/cmakeprojectmanager/cmakespecificsettings.cpp6
-rw-r--r--src/plugins/cmakeprojectmanager/cmakespecificsettings.h1
9 files changed, 141 insertions, 7 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index 8bd96f239e..610fd86ec2 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -67,7 +67,7 @@ Tasks CMakeProject::projectIssues(const Kit *k) const
ProjectImporter *CMakeProject::projectImporter() const
{
if (!m_projectImporter)
- m_projectImporter = new CMakeProjectImporter(projectFilePath(), m_presetsData);
+ m_projectImporter = new CMakeProjectImporter(projectFilePath(), this);
return m_projectImporter;
}
@@ -306,4 +306,15 @@ void CMakeProject::configureAsExampleProject(ProjectExplorer::Kit *kit)
setup(infoList);
}
+void CMakeProjectManager::CMakeProject::setOldPresetKits(
+ const QList<ProjectExplorer::Kit *> &presetKits) const
+{
+ m_oldPresetKits = presetKits;
+}
+
+QList<Kit *> CMakeProject::oldPresetKits() const
+{
+ return m_oldPresetKits;
+}
+
} // namespace CMakeProjectManager
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index 0915461501..6540dd4964 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -31,6 +31,9 @@ public:
Internal::PresetsData presetsData() const;
void readPresets();
+ void setOldPresetKits(const QList<ProjectExplorer::Kit *> &presetKits) const;
+ QList<ProjectExplorer::Kit *> oldPresetKits() const;
+
protected:
bool setupTarget(ProjectExplorer::Target *t) final;
@@ -43,6 +46,7 @@ private:
void setupBuildPresets(Internal::PresetsData &presetsData);
mutable Internal::CMakeProjectImporter *m_projectImporter = nullptr;
+ mutable QList<ProjectExplorer::Kit*> m_oldPresetKits;
ProjectExplorer::Tasks m_issues;
Internal::PresetsData m_presetsData;
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h b/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
index cbaa648726..183e950136 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
@@ -17,6 +17,7 @@ const char BUILD_FILE_CONTEXT_MENU[] = "CMakeProject.BuildFileContextMenu";
const char BUILD_FILE[] = "CMakeProject.BuildFile";
const char CMAKE_HOME_DIR[] = "CMakeProject.HomeDirectory";
const char QML_DEBUG_SETTING[] = "CMakeProject.EnableQmlDebugging";
+const char RELOAD_CMAKE_PRESETS[] = "CMakeProject.ReloadCMakePresets";
const char CMAKEFORMATTER_SETTINGS_GROUP[] = "CMakeFormatter";
const char CMAKEFORMATTER_GENERAL_GROUP[] = "General";
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp
index 14c4a5b817..029182a053 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp
@@ -5,6 +5,7 @@
#include "cmakebuildconfiguration.h"
#include "cmakekitinformation.h"
+#include "cmakeproject.h"
#include "cmakeprojectconstants.h"
#include "cmakeprojectmanagertr.h"
#include "cmaketoolmanager.h"
@@ -15,6 +16,7 @@
#include <projectexplorer/buildinfo.h>
#include <projectexplorer/kitinformation.h>
#include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/target.h>
#include <projectexplorer/toolchainmanager.h>
#include <qtsupport/qtkitinformation.h>
@@ -92,9 +94,9 @@ static QString uniqueCMakeToolDisplayName(CMakeTool &tool)
// CMakeProjectImporter
-CMakeProjectImporter::CMakeProjectImporter(const FilePath &path, const PresetsData &presetsData)
+CMakeProjectImporter::CMakeProjectImporter(const FilePath &path, const CMakeProject *project)
: QtProjectImporter(path)
- , m_presetsData(presetsData)
+ , m_project(project)
, m_presetsTempDir("qtc-cmake-presets-XXXXXXXX")
{
useTemporaryKitAspect(CMakeKitAspect::id(),
@@ -119,7 +121,7 @@ FilePaths CMakeProjectImporter::importCandidates()
candidates << scanDirectory(shadowBuildDirectory.absolutePath(), QString());
}
- for (const auto &configPreset : m_presetsData.configurePresets) {
+ for (const auto &configPreset : m_project->presetsData().configurePresets) {
if (configPreset.hidden.value())
continue;
@@ -152,6 +154,21 @@ FilePaths CMakeProjectImporter::importCandidates()
return finalists;
}
+Target *CMakeProjectImporter::preferredTarget(const QList<Target *> &possibleTargets)
+{
+ for (Kit *kit : m_project->oldPresetKits()) {
+ const bool haveKit = Utils::contains(possibleTargets, [kit](const auto &target) {
+ return target->kit() == kit;
+ });
+
+ if (!haveKit)
+ KitManager::deregisterKit(kit);
+ }
+ m_project->setOldPresetKits({});
+
+ return ProjectImporter::preferredTarget(possibleTargets);
+}
+
static CMakeConfig configurationFromPresetProbe(
const FilePath &importPath,
const FilePath &sourceDirectory,
@@ -618,7 +635,7 @@ QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
const QString presetName = importPath.fileName();
PresetsDetails::ConfigurePreset configurePreset
- = Utils::findOrDefault(m_presetsData.configurePresets,
+ = Utils::findOrDefault(m_project->presetsData().configurePresets,
[presetName](const PresetsDetails::ConfigurePreset &preset) {
return preset.name == presetName;
});
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h
index 229ccfa36d..350b0b77d6 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h
@@ -11,6 +11,7 @@
namespace CMakeProjectManager {
+class CMakeProject;
class CMakeTool;
namespace Internal {
@@ -20,9 +21,11 @@ struct DirectoryData;
class CMakeProjectImporter : public QtSupport::QtProjectImporter
{
public:
- CMakeProjectImporter(const Utils::FilePath &path, const Internal::PresetsData &presetsData);
+ CMakeProjectImporter(const Utils::FilePath &path,
+ const CMakeProjectManager::CMakeProject *project);
Utils::FilePaths importCandidates() final;
+ ProjectExplorer::Target *preferredTarget(const QList<ProjectExplorer::Target *> &possibleTargets) final;
private:
QList<void *> examineDirectory(const Utils::FilePath &importPath,
@@ -44,7 +47,7 @@ private:
void ensureBuildDirectory(DirectoryData &data, const ProjectExplorer::Kit *k) const;
- Internal::PresetsData m_presetsData;
+ const CMakeProject *m_project;
Utils::TemporaryDirectory m_presetsTempDir;
};
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
index 95baccee1e..ab7bfb4990 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
@@ -9,6 +9,7 @@
#include "cmakeprojectconstants.h"
#include "cmakeprojectmanagertr.h"
#include "cmakeprojectnodes.h"
+#include "cmakespecificsettings.h"
#include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/actionmanager/actionmanager.h>
@@ -16,6 +17,7 @@
#include <coreplugin/editormanager/ieditor.h>
#include <coreplugin/icore.h>
#include <coreplugin/messagemanager.h>
+#include <coreplugin/modemanager.h>
#include <cppeditor/cpptoolsreuse.h>
@@ -26,6 +28,8 @@
#include <projectexplorer/projecttree.h>
#include <projectexplorer/target.h>
+#include <utils/checkablemessagebox.h>
+#include <utils/utilsicons.h>
#include <utils/parameteraction.h>
#include <QAction>
@@ -42,6 +46,8 @@ CMakeManager::CMakeManager()
, m_clearCMakeCacheAction(new QAction(QIcon(), Tr::tr("Clear CMake Configuration"), this))
, m_runCMakeActionContextMenu(new QAction(QIcon(), Tr::tr("Run CMake"), this))
, m_rescanProjectAction(new QAction(QIcon(), Tr::tr("Rescan Project"), this))
+ , m_reloadCMakePresetsAction(
+ new QAction(Utils::Icons::RELOAD_TOOLBAR.icon(), Tr::tr("Reload CMake Presets"), this))
{
Core::ActionContainer *mbuild =
Core::ActionManager::actionContainer(ProjectExplorer::Constants::M_BUILDPROJECT);
@@ -101,6 +107,15 @@ CMakeManager::CMakeManager()
rescanProject(ProjectTree::currentBuildSystem());
});
+ command = Core::ActionManager::registerAction(m_reloadCMakePresetsAction,
+ Constants::RELOAD_CMAKE_PRESETS,
+ globalContext);
+ command->setAttribute(Core::Command::CA_Hide);
+ mbuild->addAction(command, ProjectExplorer::Constants::G_BUILD_BUILD);
+ connect(m_reloadCMakePresetsAction, &QAction::triggered, this, [this] {
+ reloadCMakePresets();
+ });
+
m_buildFileAction = new Utils::ParameterAction(Tr::tr("Build File"),
Tr::tr("Build File \"%1\""),
Utils::ParameterAction::AlwaysEnabled,
@@ -135,6 +150,16 @@ void CMakeManager::updateCmakeActions(Node *node)
m_runCMakeActionContextMenu->setEnabled(visible);
m_clearCMakeCacheAction->setVisible(visible);
m_rescanProjectAction->setVisible(visible);
+
+ const bool reloadPresetsVisible = [project] {
+ if (!project)
+ return false;
+ const FilePath presetsPath = project->projectFilePath().parentDir().pathAppended(
+ "CMakePresets.json");
+ return presetsPath.exists();
+ }();
+ m_reloadCMakePresetsAction->setVisible(reloadPresetsVisible);
+
enableBuildFileMenus(node);
}
@@ -204,6 +229,70 @@ void CMakeManager::enableBuildFileMenus(Node *node)
}
}
+void CMakeManager::reloadCMakePresets()
+{
+ auto settings = CMakeSpecificSettings::instance();
+ bool doNotAsk = !settings->askBeforePresetsReload.value();
+ if (!doNotAsk) {
+ CheckableMessageBox question(Core::ICore::dialogParent());
+
+ question.setIcon(QMessageBox::Question);
+ question.setWindowTitle(Tr::tr("Reload CMake Presets"));
+ question.setText(Tr::tr("Re-generates the CMake presets kits. The manual CMake project modifications will be lost."));
+ question.setCheckBoxText(Tr::tr("Do not ask again"));
+ question.setCheckBoxVisible(true);
+ question.setChecked(doNotAsk);
+ question.setStandardButtons(QDialogButtonBox::Cancel);
+
+ question.addButton(Tr::tr("Reload"), QDialogButtonBox::YesRole);
+ question.setDefaultButton(QDialogButtonBox::Yes);
+ question.exec();
+
+ doNotAsk = question.isChecked();
+
+ settings->askBeforePresetsReload.setValue(!doNotAsk);
+ settings->writeSettings(Core::ICore::settings());
+
+ if (question.clickedStandardButton() == QDialogButtonBox::Cancel)
+ return;
+ }
+
+ CMakeProject *project = static_cast<CMakeProject *>(ProjectTree::currentProject());
+ if (!project)
+ return;
+
+ const QSet<QString> oldPresets = Utils::transform<QSet>(project->presetsData().configurePresets,
+ [](const auto &preset) {
+ return preset.name;
+ });
+ project->readPresets();
+
+ QList<Kit*> oldKits;
+ for (const auto &target : project->targets()) {
+ const CMakeConfigItem presetItem = CMakeConfigurationKitAspect::cmakePresetConfigItem(
+ target->kit());
+
+ if (BuildManager::isBuilding(target))
+ BuildManager::cancel();
+
+ // Only clear the CMake configuration for preset kits. Any manual kit configuration
+ // will get the chance to get imported afterwards in the Kit selection wizard
+ CMakeBuildSystem *bs = static_cast<CMakeBuildSystem *>(target->buildSystem());
+ if (!presetItem.isNull() && bs)
+ bs->clearCMakeCache();
+
+ if (!presetItem.isNull() && oldPresets.contains(QString::fromUtf8(presetItem.value)))
+ oldKits << target->kit();
+
+ project->removeTarget(target);
+ }
+
+ project->setOldPresetKits(oldKits);
+
+ Core::ModeManager::activateMode(ProjectExplorer::Constants::MODE_SESSION);
+ Core::ModeManager::setFocusToCurrentMode();
+}
+
void CMakeManager::buildFile(Node *node)
{
if (!node) {
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h
index 3a52709291..c47d724c9b 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h
@@ -30,12 +30,14 @@ private:
void buildFile(ProjectExplorer::Node *node = nullptr);
void updateBuildFileAction();
void enableBuildFileMenus(ProjectExplorer::Node *node);
+ void reloadCMakePresets();
QAction *m_runCMakeAction;
QAction *m_clearCMakeCacheAction;
QAction *m_runCMakeActionContextMenu;
QAction *m_rescanProjectAction;
QAction *m_buildFileContextMenu;
+ QAction *m_reloadCMakePresetsAction;
Utils::ParameterAction *m_buildFileAction;
};
diff --git a/src/plugins/cmakeprojectmanager/cmakespecificsettings.cpp b/src/plugins/cmakeprojectmanager/cmakespecificsettings.cpp
index a4f08c60b1..5c22423a40 100644
--- a/src/plugins/cmakeprojectmanager/cmakespecificsettings.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakespecificsettings.cpp
@@ -38,6 +38,7 @@ CMakeSpecificSettings::CMakeSpecificSettings()
autorunCMake,
packageManagerAutoSetup,
askBeforeReConfigureInitialParams,
+ askBeforePresetsReload,
showSourceSubFolders,
showAdvancedOptionsByDefault,
st
@@ -77,6 +78,11 @@ CMakeSpecificSettings::CMakeSpecificSettings()
askBeforeReConfigureInitialParams.setLabelText(::CMakeProjectManager::Tr::tr("Ask before re-configuring with "
"initial parameters"));
+ registerAspect(&askBeforePresetsReload);
+ askBeforePresetsReload.setSettingsKey("AskBeforePresetsReload");
+ askBeforePresetsReload.setDefaultValue(true);
+ askBeforePresetsReload.setLabelText(::CMakeProjectManager::Tr::tr("Ask before reloading CMake Presets"));
+
registerAspect(&showSourceSubFolders);
showSourceSubFolders.setSettingsKey("ShowSourceSubFolders");
showSourceSubFolders.setDefaultValue(true);
diff --git a/src/plugins/cmakeprojectmanager/cmakespecificsettings.h b/src/plugins/cmakeprojectmanager/cmakespecificsettings.h
index 7050452c79..472945e1a5 100644
--- a/src/plugins/cmakeprojectmanager/cmakespecificsettings.h
+++ b/src/plugins/cmakeprojectmanager/cmakespecificsettings.h
@@ -18,6 +18,7 @@ public:
Utils::StringAspect ninjaPath;
Utils::BoolAspect packageManagerAutoSetup;
Utils::BoolAspect askBeforeReConfigureInitialParams;
+ Utils::BoolAspect askBeforePresetsReload;
Utils::BoolAspect showSourceSubFolders;
Utils::BoolAspect showAdvancedOptionsByDefault;
};