From e8503fa0a3d7f21a0c31439c85b8becd7ca0035e Mon Sep 17 00:00:00 2001 From: Tom Deblauwe Date: Thu, 26 Nov 2015 19:50:39 +0100 Subject: [PATCH] CMake: Add current run configurations' name to make step This allows to conveniently only build the code you are going to run. This is nice to use when you are developing only a part of a bigger CMake project. Change-Id: Ia430349fa655409f98620e86adaccb6e60044b4b Reviewed-by: Tobias Hunger --- src/plugins/cmakeprojectmanager/makestep.cpp | 84 +++++++++++++++++--- src/plugins/cmakeprojectmanager/makestep.h | 6 ++ 2 files changed, 78 insertions(+), 12 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp index 4d67da3353d..bc5f2c83321 100644 --- a/src/plugins/cmakeprojectmanager/makestep.cpp +++ b/src/plugins/cmakeprojectmanager/makestep.cpp @@ -34,6 +34,7 @@ #include "cmakeparser.h" #include "cmakeprojectconstants.h" #include "cmakeproject.h" +#include "cmakerunconfiguration.h" #include #include @@ -66,17 +67,19 @@ const char MS_ID[] = "CMakeProjectManager.MakeStep"; const char CLEAN_KEY[] = "CMakeProjectManager.MakeStep.Clean"; const char BUILD_TARGETS_KEY[] = "CMakeProjectManager.MakeStep.BuildTargets"; const char ADDITIONAL_ARGUMENTS_KEY[] = "CMakeProjectManager.MakeStep.AdditionalArguments"; +const char ADD_RUNCONFIGURATION_ARGUMENT_KEY[] = "CMakeProjectManager.MakeStep.AddRunConfigurationArgument"; const char MAKE_COMMAND_KEY[] = "CMakeProjectManager.MakeStep.MakeCommand"; +const char ADD_RUNCONFIGURATION_TEXT[] = "Current executable"; } MakeStep::MakeStep(BuildStepList *bsl) : - AbstractProcessStep(bsl, Core::Id(MS_ID)), m_clean(false) + AbstractProcessStep(bsl, Core::Id(MS_ID)), m_clean(false), m_addRunConfigurationArgument(false) { ctor(); } MakeStep::MakeStep(BuildStepList *bsl, Core::Id id) : - AbstractProcessStep(bsl, id), m_clean(false) + AbstractProcessStep(bsl, id), m_clean(false), m_addRunConfigurationArgument(false) { ctor(); } @@ -86,6 +89,7 @@ MakeStep::MakeStep(BuildStepList *bsl, MakeStep *bs) : m_clean(bs->m_clean), m_buildTargets(bs->m_buildTargets), m_additionalArguments(bs->m_additionalArguments), + m_addRunConfigurationArgument(bs->m_addRunConfigurationArgument), m_makeCmd(bs->m_makeCmd) { ctor(); @@ -125,6 +129,11 @@ CMakeBuildConfiguration *MakeStep::targetsActiveBuildConfiguration() const return static_cast(target()->activeBuildConfiguration()); } +CMakeRunConfiguration *MakeStep::targetsActiveRunConfiguration() const +{ + return qobject_cast(target()->activeRunConfiguration()); +} + void MakeStep::activeBuildConfigurationChanged() { if (m_activeConfiguration) @@ -159,15 +168,17 @@ QVariantMap MakeStep::toMap() const map.insert(QLatin1String(CLEAN_KEY), m_clean); map.insert(QLatin1String(BUILD_TARGETS_KEY), m_buildTargets); map.insert(QLatin1String(ADDITIONAL_ARGUMENTS_KEY), m_additionalArguments); + map.insert(QLatin1String(ADD_RUNCONFIGURATION_ARGUMENT_KEY), m_addRunConfigurationArgument); map.insert(QLatin1String(MAKE_COMMAND_KEY), m_makeCmd); return map; } bool MakeStep::fromMap(const QVariantMap &map) { - m_clean = map.value(QLatin1String(CLEAN_KEY)).toBool(); + m_clean = map.value(QLatin1String(CLEAN_KEY), false).toBool(); m_buildTargets = map.value(QLatin1String(BUILD_TARGETS_KEY)).toStringList(); m_additionalArguments = map.value(QLatin1String(ADDITIONAL_ARGUMENTS_KEY)).toString(); + m_addRunConfigurationArgument = map.value(QLatin1String(ADD_RUNCONFIGURATION_ARGUMENT_KEY), false).toBool(); m_makeCmd = map.value(QLatin1String(MAKE_COMMAND_KEY)).toString(); return BuildStep::fromMap(map); @@ -194,7 +205,24 @@ bool MakeStep::init(QList &earlierSteps) m_useNinja = bc->useNinja(); - QString arguments = Utils::QtcProcess::joinArgs(m_buildTargets); + QString arguments; + if (m_addRunConfigurationArgument) { + CMakeRunConfiguration* rc = targetsActiveRunConfiguration(); + if (!rc) { + emit addTask(Task(Task::Error, + QCoreApplication::translate("ProjectExplorer::Task", + "You asked to build the current Run Configurations build target only, " + "but the current Run Configuration is not associated with a build target. " + "Please update the Make Step in your build settings."), + Utils::FileName(), -1, + ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); + emitFaultyConfigurationMessage(); + return false; + } + if (!rc->title().isEmpty()) + Utils::QtcProcess::addArg(&arguments, rc->title()); + } + Utils::QtcProcess::addArgs(&arguments, m_buildTargets); Utils::QtcProcess::addArgs(&arguments, additionalArguments()); setIgnoreReturnValue(m_clean); @@ -268,17 +296,24 @@ QStringList MakeStep::buildTargets() const bool MakeStep::buildsBuildTarget(const QString &target) const { - return m_buildTargets.contains(target); + if (target == tr(ADD_RUNCONFIGURATION_TEXT)) + return addRunConfigurationArgument(); + else + return m_buildTargets.contains(target); } void MakeStep::setBuildTarget(const QString &buildTarget, bool on) { - QStringList old = m_buildTargets; - if (on && !old.contains(buildTarget)) - old << buildTarget; - else if (!on && old.contains(buildTarget)) - old.removeOne(buildTarget); - setBuildTargets(old); + if (buildTarget == tr(ADD_RUNCONFIGURATION_TEXT)) { + setAddRunConfigurationArgument(on); + } else { + QStringList old = m_buildTargets; + if (on && !old.contains(buildTarget)) + old << buildTarget; + else if (!on && old.contains(buildTarget)) + old.removeOne(buildTarget); + setBuildTargets(old); + } } void MakeStep::setBuildTargets(const QStringList &targets) @@ -304,6 +339,16 @@ void MakeStep::setAdditionalArguments(const QString &list) m_additionalArguments = list; } +bool MakeStep::addRunConfigurationArgument() const +{ + return m_addRunConfigurationArgument; +} + +void MakeStep::setAddRunConfigurationArgument(bool add) +{ + m_addRunConfigurationArgument = add; +} + QString MakeStep::makeCommand(ProjectExplorer::ToolChain *tc, const Utils::Environment &env) const { if (!m_makeCmd.isEmpty()) @@ -367,6 +412,13 @@ MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep) fl->addRow(tr("Targets:"), frame); + auto itemAddRunConfigurationArgument = new QListWidgetItem(tr(ADD_RUNCONFIGURATION_TEXT), m_buildTargetsList); + itemAddRunConfigurationArgument->setFlags(itemAddRunConfigurationArgument->flags() | Qt::ItemIsUserCheckable); + itemAddRunConfigurationArgument->setCheckState(m_makeStep->addRunConfigurationArgument() ? Qt::Checked : Qt::Unchecked); + QFont f; + f.setItalic(true); + itemAddRunConfigurationArgument->setFont(f); + CMakeProject *pro = static_cast(m_makeStep->project()); QStringList targetList = pro->buildTargetTitles(); targetList.sort(); @@ -416,7 +468,11 @@ QString MakeStepConfigWidget::displayName() const void MakeStepConfigWidget::buildTargetsChanged() { disconnect(m_buildTargetsList, &QListWidget::itemChanged, this, &MakeStepConfigWidget::itemChanged); + + auto *addRunConfigurationArgumentItem = m_buildTargetsList->takeItem(0); m_buildTargetsList->clear(); + m_buildTargetsList->insertItem(0, addRunConfigurationArgumentItem); + CMakeProject *pro = static_cast(m_makeStep->target()->project()); foreach (const QString& buildTarget, pro->buildTargetTitles()) { QListWidgetItem *item = new QListWidgetItem(buildTarget, m_buildTargetsList); @@ -451,7 +507,11 @@ void MakeStepConfigWidget::updateDetails() ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(m_makeStep->target()->kit()); if (tc) { - QString arguments = Utils::QtcProcess::joinArgs(m_makeStep->buildTargets()); + QString arguments; + if (m_makeStep->addRunConfigurationArgument()) + arguments = QLatin1String("<") + tr(ADD_RUNCONFIGURATION_TEXT) + QLatin1String(">"); + + Utils::QtcProcess::addArgs(&arguments, Utils::QtcProcess::joinArgs(m_makeStep->buildTargets())); Utils::QtcProcess::addArgs(&arguments, m_makeStep->additionalArguments()); ProcessParameters param; diff --git a/src/plugins/cmakeprojectmanager/makestep.h b/src/plugins/cmakeprojectmanager/makestep.h index 0e1e4c0eef9..2c75b0ccb02 100644 --- a/src/plugins/cmakeprojectmanager/makestep.h +++ b/src/plugins/cmakeprojectmanager/makestep.h @@ -47,6 +47,7 @@ namespace CMakeProjectManager { namespace Internal { class CMakeBuildConfiguration; +class CMakeRunConfiguration; class MakeStepFactory; class MakeStep : public ProjectExplorer::AbstractProcessStep @@ -75,6 +76,9 @@ public: QString additionalArguments() const; void setAdditionalArguments(const QString &list); + bool addRunConfigurationArgument() const; + void setAddRunConfigurationArgument(bool add); + QString makeCommand(ProjectExplorer::ToolChain *tc, const Utils::Environment &env) const; void setClean(bool clean); @@ -106,6 +110,7 @@ protected: private: void ctor(); CMakeBuildConfiguration *targetsActiveBuildConfiguration() const; + CMakeRunConfiguration *targetsActiveRunConfiguration() const; bool m_clean; QRegExp m_percentProgress; @@ -113,6 +118,7 @@ private: QString m_ninjaProgressString; QStringList m_buildTargets; QString m_additionalArguments; + bool m_addRunConfigurationArgument; bool m_useNinja; CMakeBuildConfiguration *m_activeConfiguration; QString m_makeCmd;