CMakePM: Build the correct executable before running

When issuing on a CMake target the context menu action "Run" the build
system would build the wrong target:
  * either "all"
  * or "Current executable" which might have been a different target

This change set makes sure that when a project target is selected in the
Project view, the build target will be restricted to this target.

This way the correct executable will be built before running.

Fixes: QTCREATORBUG-31386
Change-Id: Ibe6e50c4588ffca53ec2ac9555265023188f6e4e
Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
Cristian Adam
2024-10-10 13:04:03 +02:00
parent d10eb9d816
commit 752fdef488
3 changed files with 51 additions and 19 deletions

View File

@@ -1658,16 +1658,18 @@ void CMakeBuildConfiguration::buildTarget(const QString &buildTarget)
return bs->id() == Constants::CMAKE_BUILD_STEP_ID; return bs->id() == Constants::CMAKE_BUILD_STEP_ID;
})); }));
QStringList originalBuildTargets;
if (cmBs) { if (cmBs) {
originalBuildTargets = cmBs->buildTargets(); if (m_unrestrictedBuildTargets.isEmpty())
m_unrestrictedBuildTargets = cmBs->buildTargets();
cmBs->setBuildTargets({buildTarget}); cmBs->setBuildTargets({buildTarget});
} }
BuildManager::buildList(buildSteps()); BuildManager::buildList(buildSteps());
if (cmBs) if (cmBs) {
cmBs->setBuildTargets(originalBuildTargets); cmBs->setBuildTargets(m_unrestrictedBuildTargets);
m_unrestrictedBuildTargets.clear();
}
} }
void CMakeBuildConfiguration::reBuildTarget(const QString &cleanTarget, const QString &buildTarget) 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; return bs->id() == Constants::CMAKE_BUILD_STEP_ID;
})); }));
QStringList originalBuildTargets;
if (cmBs) { if (cmBs) {
originalBuildTargets = cmBs->buildTargets(); if (m_unrestrictedBuildTargets.isEmpty())
m_unrestrictedBuildTargets = cmBs->buildTargets();
cmBs->setBuildTargets({buildTarget}); cmBs->setBuildTargets({buildTarget});
} }
QString originalCleanTarget; QString originalCleanTarget;
@@ -1694,8 +1696,10 @@ void CMakeBuildConfiguration::reBuildTarget(const QString &cleanTarget, const QS
BuildManager::buildLists({cleanSteps(), buildSteps()}); BuildManager::buildLists({cleanSteps(), buildSteps()});
if (cmBs) if (cmBs) {
cmBs->setBuildTargets(originalBuildTargets); cmBs->setBuildTargets(m_unrestrictedBuildTargets);
m_unrestrictedBuildTargets.clear();
}
if (cmCs) if (cmCs)
cmCs->setBuildTargets({originalCleanTarget}); cmCs->setBuildTargets({originalCleanTarget});
} }
@@ -2113,6 +2117,11 @@ void CMakeBuildConfiguration::addToEnvironment(Utils::Environment &env) const
} }
void CMakeBuildConfiguration::restrictNextBuild(const ProjectExplorer::RunConfiguration *rc) void CMakeBuildConfiguration::restrictNextBuild(const ProjectExplorer::RunConfiguration *rc)
{
setRestrictedBuildTarget(rc ? rc->buildKey() : QString());
}
void CMakeBuildConfiguration::setRestrictedBuildTarget(const QString &buildTarget)
{ {
auto buildStep = qobject_cast<CMakeBuildStep *>( auto buildStep = qobject_cast<CMakeBuildStep *>(
findOrDefault(buildSteps()->steps(), [](const BuildStep *bs) { findOrDefault(buildSteps()->steps(), [](const BuildStep *bs) {
@@ -2121,14 +2130,17 @@ void CMakeBuildConfiguration::restrictNextBuild(const ProjectExplorer::RunConfig
if (!buildStep) if (!buildStep)
return; return;
if (rc) { if (!buildTarget.isEmpty()) {
if (m_unrestrictedBuildTargets.isEmpty())
m_unrestrictedBuildTargets = buildStep->buildTargets(); m_unrestrictedBuildTargets = buildStep->buildTargets();
buildStep->setBuildTargets({rc->buildKey()}); buildStep->setBuildTargets({buildTarget});
return; return;
} }
if (!m_unrestrictedBuildTargets.isEmpty()) if (!m_unrestrictedBuildTargets.isEmpty()) {
buildStep->setBuildTargets(m_unrestrictedBuildTargets); buildStep->setBuildTargets(m_unrestrictedBuildTargets);
m_unrestrictedBuildTargets.clear();
}
} }
Environment CMakeBuildConfiguration::configureEnvironment() const Environment CMakeBuildConfiguration::configureEnvironment() const

View File

@@ -72,6 +72,7 @@ public:
void addToEnvironment(Utils::Environment &env) const override; void addToEnvironment(Utils::Environment &env) const override;
void restrictNextBuild(const ProjectExplorer::RunConfiguration *rc) override; void restrictNextBuild(const ProjectExplorer::RunConfiguration *rc) override;
void setRestrictedBuildTarget(const QString &buildTarget);
Utils::Environment configureEnvironment() const; Utils::Environment configureEnvironment() const;
Internal::CMakeBuildSystem *cmakeBuildSystem() const; Internal::CMakeBuildSystem *cmakeBuildSystem() const;

View File

@@ -4,6 +4,7 @@
#include "cmakeprojectmanager.h" #include "cmakeprojectmanager.h"
#include "cmakebuildsystem.h" #include "cmakebuildsystem.h"
#include "cmakebuildconfiguration.h"
#include "cmakekitaspect.h" #include "cmakekitaspect.h"
#include "cmakeprocess.h" #include "cmakeprocess.h"
#include "cmakeproject.h" #include "cmakeproject.h"
@@ -62,7 +63,8 @@ public:
static void openCMakeUrl(const QUrl &url); static void openCMakeUrl(const QUrl &url);
private: private:
void updateCmakeActions(Node *node); void updateCMakeActions(Node *node);
void updateCMakeBuildTarget(Node *node);
void clearCMakeCache(BuildSystem *buildSystem); void clearCMakeCache(BuildSystem *buildSystem);
void runCMake(BuildSystem *buildSystem); void runCMake(BuildSystem *buildSystem);
void runCMakeWithProfiling(BuildSystem *buildSystem); void runCMakeWithProfiling(BuildSystem *buildSystem);
@@ -290,22 +292,24 @@ CMakeManager::CMakeManager()
CMakeTool::Version version = tool ? tool->version() : CMakeTool::Version(); CMakeTool::Version version = tool ? tool->version() : CMakeTool::Version();
m_canDebugCMake = (version.major == 3 && version.minor >= 27) || version.major > 3; m_canDebugCMake = (version.major == 3 && version.minor >= 27) || version.major > 3;
} }
updateCmakeActions(ProjectTree::currentNode()); updateCMakeActions(ProjectTree::currentNode());
}); });
connect(BuildManager::instance(), &BuildManager::buildStateChanged, this, [this] { connect(BuildManager::instance(), &BuildManager::buildStateChanged, this, [this] {
updateCmakeActions(ProjectTree::currentNode()); updateCMakeActions(ProjectTree::currentNode());
}); });
connect(EditorManager::instance(), &EditorManager::currentEditorChanged, this, [this]() { connect(EditorManager::instance(), &EditorManager::currentEditorChanged, this, [this]() {
updateBuildFileAction(); updateBuildFileAction();
enableBuildSubprojectMenu(); enableBuildSubprojectMenu();
}); });
connect(ProjectTree::instance(), &ProjectTree::currentNodeChanged, connect(ProjectTree::instance(), &ProjectTree::currentNodeChanged, this, [this](Node *node) {
this, &CMakeManager::updateCmakeActions); updateCMakeActions(node);
updateCMakeBuildTarget(node);
});
updateCmakeActions(ProjectTree::currentNode()); updateCMakeActions(ProjectTree::currentNode());
} }
void CMakeManager::updateCmakeActions(Node *node) void CMakeManager::updateCMakeActions(Node *node)
{ {
auto project = qobject_cast<CMakeProject *>(ProjectManager::startupProject()); auto project = qobject_cast<CMakeProject *>(ProjectManager::startupProject());
const bool visible = project && !BuildManager::isBuilding(project); const bool visible = project && !BuildManager::isBuilding(project);
@@ -332,6 +336,21 @@ void CMakeManager::updateCmakeActions(Node *node)
enableBuildSubprojectContextMenu(node); enableBuildSubprojectContextMenu(node);
} }
void CMakeManager::updateCMakeBuildTarget(Node *node)
{
if (!node)
return;
auto bs = qobject_cast<CMakeBuildSystem *>(ProjectTree::currentBuildSystem());
if (!bs)
return;
auto targetNode = dynamic_cast<const CMakeTargetNode *>(node);
bs->cmakeBuildConfiguration()->setRestrictedBuildTarget(
targetNode ? targetNode->buildKey() : QString());
}
void CMakeManager::clearCMakeCache(BuildSystem *buildSystem) void CMakeManager::clearCMakeCache(BuildSystem *buildSystem)
{ {
auto cmakeBuildSystem = dynamic_cast<CMakeBuildSystem *>(buildSystem); auto cmakeBuildSystem = dynamic_cast<CMakeBuildSystem *>(buildSystem);