diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 282d361626b..f99be440af0 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -1658,16 +1658,18 @@ void CMakeBuildConfiguration::buildTarget(const QString &buildTarget) return bs->id() == Constants::CMAKE_BUILD_STEP_ID; })); - QStringList originalBuildTargets; if (cmBs) { - originalBuildTargets = cmBs->buildTargets(); + if (m_unrestrictedBuildTargets.isEmpty()) + m_unrestrictedBuildTargets = cmBs->buildTargets(); cmBs->setBuildTargets({buildTarget}); } BuildManager::buildList(buildSteps()); - if (cmBs) - cmBs->setBuildTargets(originalBuildTargets); + if (cmBs) { + cmBs->setBuildTargets(m_unrestrictedBuildTargets); + m_unrestrictedBuildTargets.clear(); + } } void CMakeBuildConfiguration::reBuildTarget(const QString &cleanTarget, const QString &buildTarget) @@ -1681,9 +1683,9 @@ void CMakeBuildConfiguration::reBuildTarget(const QString &cleanTarget, const QS return bs->id() == Constants::CMAKE_BUILD_STEP_ID; })); - QStringList originalBuildTargets; if (cmBs) { - originalBuildTargets = cmBs->buildTargets(); + if (m_unrestrictedBuildTargets.isEmpty()) + m_unrestrictedBuildTargets = cmBs->buildTargets(); cmBs->setBuildTargets({buildTarget}); } QString originalCleanTarget; @@ -1694,8 +1696,10 @@ void CMakeBuildConfiguration::reBuildTarget(const QString &cleanTarget, const QS BuildManager::buildLists({cleanSteps(), buildSteps()}); - if (cmBs) - cmBs->setBuildTargets(originalBuildTargets); + if (cmBs) { + cmBs->setBuildTargets(m_unrestrictedBuildTargets); + m_unrestrictedBuildTargets.clear(); + } if (cmCs) cmCs->setBuildTargets({originalCleanTarget}); } @@ -2113,6 +2117,11 @@ void CMakeBuildConfiguration::addToEnvironment(Utils::Environment &env) const } void CMakeBuildConfiguration::restrictNextBuild(const ProjectExplorer::RunConfiguration *rc) +{ + setRestrictedBuildTarget(rc ? rc->buildKey() : QString()); +} + +void CMakeBuildConfiguration::setRestrictedBuildTarget(const QString &buildTarget) { auto buildStep = qobject_cast( findOrDefault(buildSteps()->steps(), [](const BuildStep *bs) { @@ -2121,14 +2130,17 @@ void CMakeBuildConfiguration::restrictNextBuild(const ProjectExplorer::RunConfig if (!buildStep) return; - if (rc) { - m_unrestrictedBuildTargets = buildStep->buildTargets(); - buildStep->setBuildTargets({rc->buildKey()}); + if (!buildTarget.isEmpty()) { + if (m_unrestrictedBuildTargets.isEmpty()) + m_unrestrictedBuildTargets = buildStep->buildTargets(); + buildStep->setBuildTargets({buildTarget}); return; } - if (!m_unrestrictedBuildTargets.isEmpty()) + if (!m_unrestrictedBuildTargets.isEmpty()) { buildStep->setBuildTargets(m_unrestrictedBuildTargets); + m_unrestrictedBuildTargets.clear(); + } } Environment CMakeBuildConfiguration::configureEnvironment() const diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index d97a60c1e3f..8a7d2bace4d 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -72,6 +72,7 @@ public: void addToEnvironment(Utils::Environment &env) const override; void restrictNextBuild(const ProjectExplorer::RunConfiguration *rc) override; + void setRestrictedBuildTarget(const QString &buildTarget); Utils::Environment configureEnvironment() const; Internal::CMakeBuildSystem *cmakeBuildSystem() const; diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp index 5a08a236eb0..dcb595cb7a3 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp @@ -4,6 +4,7 @@ #include "cmakeprojectmanager.h" #include "cmakebuildsystem.h" +#include "cmakebuildconfiguration.h" #include "cmakekitaspect.h" #include "cmakeprocess.h" #include "cmakeproject.h" @@ -62,7 +63,8 @@ public: static void openCMakeUrl(const QUrl &url); private: - void updateCmakeActions(Node *node); + void updateCMakeActions(Node *node); + void updateCMakeBuildTarget(Node *node); void clearCMakeCache(BuildSystem *buildSystem); void runCMake(BuildSystem *buildSystem); void runCMakeWithProfiling(BuildSystem *buildSystem); @@ -290,22 +292,24 @@ CMakeManager::CMakeManager() CMakeTool::Version version = tool ? tool->version() : CMakeTool::Version(); m_canDebugCMake = (version.major == 3 && version.minor >= 27) || version.major > 3; } - updateCmakeActions(ProjectTree::currentNode()); + updateCMakeActions(ProjectTree::currentNode()); }); connect(BuildManager::instance(), &BuildManager::buildStateChanged, this, [this] { - updateCmakeActions(ProjectTree::currentNode()); + updateCMakeActions(ProjectTree::currentNode()); }); connect(EditorManager::instance(), &EditorManager::currentEditorChanged, this, [this]() { updateBuildFileAction(); enableBuildSubprojectMenu(); }); - connect(ProjectTree::instance(), &ProjectTree::currentNodeChanged, - this, &CMakeManager::updateCmakeActions); + connect(ProjectTree::instance(), &ProjectTree::currentNodeChanged, this, [this](Node *node) { + updateCMakeActions(node); + updateCMakeBuildTarget(node); + }); - updateCmakeActions(ProjectTree::currentNode()); + updateCMakeActions(ProjectTree::currentNode()); } -void CMakeManager::updateCmakeActions(Node *node) +void CMakeManager::updateCMakeActions(Node *node) { auto project = qobject_cast(ProjectManager::startupProject()); const bool visible = project && !BuildManager::isBuilding(project); @@ -332,6 +336,21 @@ void CMakeManager::updateCmakeActions(Node *node) enableBuildSubprojectContextMenu(node); } +void CMakeManager::updateCMakeBuildTarget(Node *node) +{ + if (!node) + return; + + auto bs = qobject_cast(ProjectTree::currentBuildSystem()); + if (!bs) + return; + + auto targetNode = dynamic_cast(node); + + bs->cmakeBuildConfiguration()->setRestrictedBuildTarget( + targetNode ? targetNode->buildKey() : QString()); +} + void CMakeManager::clearCMakeCache(BuildSystem *buildSystem) { auto cmakeBuildSystem = dynamic_cast(buildSystem);