diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 36046f91004..7f73a321f79 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -409,14 +409,14 @@ ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(Proj auto cleanStep = new CMakeBuildStep(cleanSteps); cleanSteps->insertStep(0, cleanStep); - cleanStep->setBuildTarget(CMakeBuildStep::cleanTarget(), true); + cleanStep->setBuildTarget(CMakeBuildStep::cleanTarget()); bc->setBuildDirectory(copy.buildDirectory); bc->setCMakeConfiguration(copy.configuration); // Default to all - if (project->hasBuildTarget(QLatin1String("all"))) - buildStep->setBuildTarget(QLatin1String("all"), true); + if (project->hasBuildTarget(CMakeBuildStep::allTarget())) + buildStep->setBuildTarget(CMakeBuildStep::allTarget()); return bc; } diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp index 6d32868a9f1..b4376d86eaf 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp @@ -82,9 +82,8 @@ CMakeBuildStep::CMakeBuildStep(BuildStepList *bsl, Core::Id id) : AbstractProces CMakeBuildStep::CMakeBuildStep(BuildStepList *bsl, CMakeBuildStep *bs) : AbstractProcessStep(bsl, bs), - m_buildTargets(bs->m_buildTargets), - m_toolArguments(bs->m_toolArguments), - m_addRunConfigurationArgument(bs->m_addRunConfigurationArgument) + m_buildTarget(bs->m_buildTarget), + m_toolArguments(bs->m_toolArguments) { ctor(bsl); } @@ -125,31 +124,34 @@ CMakeRunConfiguration *CMakeBuildStep::targetsActiveRunConfiguration() const void CMakeBuildStep::handleBuildTargetChanges() { - const QStringList filteredTargets - = Utils::filtered(static_cast(project())->buildTargetTitles(), - [this](const QString &s) { return m_buildTargets.contains(s); }); - setBuildTargets(filteredTargets); + if (static_cast(project())->buildTargetTitles().contains(m_buildTarget)) + setBuildTarget(m_buildTarget); + else + setBuildTarget(CMakeBuildStep::allTarget()); emit buildTargetsChanged(); } QVariantMap CMakeBuildStep::toMap() const { QVariantMap map(AbstractProcessStep::toMap()); - map.insert(QLatin1String(BUILD_TARGETS_KEY), m_buildTargets); + // Use QStringList for compatibility with old files + map.insert(QLatin1String(BUILD_TARGETS_KEY), QStringList(m_buildTarget)); map.insert(QLatin1String(TOOL_ARGUMENTS_KEY), m_toolArguments); - map.insert(QLatin1String(ADD_RUNCONFIGURATION_ARGUMENT_KEY), m_addRunConfigurationArgument); return map; } bool CMakeBuildStep::fromMap(const QVariantMap &map) { if (map.value(QLatin1String(CLEAN_KEY), false).toBool()) { - m_buildTargets = QStringList(CMakeBuildStep::cleanTarget()); + m_buildTarget = CMakeBuildStep::cleanTarget(); } else { - m_buildTargets = map.value(QLatin1String(BUILD_TARGETS_KEY)).toStringList(); + const QStringList targetList = map.value(QLatin1String(BUILD_TARGETS_KEY)).toStringList(); + if (!targetList.isEmpty()) + m_buildTarget = targetList.last(); m_toolArguments = map.value(QLatin1String(TOOL_ARGUMENTS_KEY)).toString(); } - m_addRunConfigurationArgument = map.value(QLatin1String(ADD_RUNCONFIGURATION_ARGUMENT_KEY), false).toBool(); + if (map.value(QLatin1String(ADD_RUNCONFIGURATION_ARGUMENT_KEY), false).toBool()) + m_buildTarget = QLatin1String(ADD_RUNCONFIGURATION_TEXT); return BuildStep::fromMap(map); } @@ -178,7 +180,7 @@ bool CMakeBuildStep::init(QList &earlierSteps) } CMakeRunConfiguration *rc = targetsActiveRunConfiguration(); - if (m_addRunConfigurationArgument && (!rc || rc->title().isEmpty())) { + if ((m_buildTarget == QLatin1String(ADD_RUNCONFIGURATION_TEXT)) && (!rc || rc->title().isEmpty())) { emit addTask(Task(Task::Error, QCoreApplication::translate("ProjectExplorer::Task", "You asked to build the current Run Configuration's build target only, " @@ -196,7 +198,7 @@ bool CMakeBuildStep::init(QList &earlierSteps) QString arguments = allArguments(rc); - setIgnoreReturnValue(m_buildTargets.contains(CMakeBuildStep::cleanTarget())); + setIgnoreReturnValue(m_buildTarget == CMakeBuildStep::cleanTarget()); ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); @@ -292,44 +294,27 @@ void CMakeBuildStep::stdOutput(const QString &line) AbstractProcessStep::stdOutput(line); } -QStringList CMakeBuildStep::buildTargets() const +QString CMakeBuildStep::buildTarget() const { - return m_buildTargets; + return m_buildTarget; } bool CMakeBuildStep::buildsBuildTarget(const QString &target) const { - if (target == tr(ADD_RUNCONFIGURATION_TEXT)) - return addRunConfigurationArgument(); - else - return m_buildTargets.contains(target); + return target == m_buildTarget; } -void CMakeBuildStep::setBuildTarget(const QString &buildTarget, bool on) +void CMakeBuildStep::setBuildTarget(const QString &buildTarget) { - 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 CMakeBuildStep::setBuildTargets(const QStringList &targets) -{ - if (targets != m_buildTargets) { - m_buildTargets = targets; - emit targetsToBuildChanged(); - } + if (m_buildTarget == buildTarget) + return; + m_buildTarget = buildTarget; + emit targetToBuildChanged(); } void CMakeBuildStep::clearBuildTargets() { - m_buildTargets.clear(); + m_buildTarget.clear(); } QString CMakeBuildStep::toolArguments() const @@ -349,18 +334,20 @@ QString CMakeBuildStep::allArguments(const CMakeRunConfiguration *rc) const Utils::QtcProcess::addArg(&arguments, QLatin1String("--build")); Utils::QtcProcess::addArg(&arguments, QLatin1String(".")); - if (m_addRunConfigurationArgument) { - Utils::QtcProcess::addArg(&arguments, QLatin1String("--target")); + QString target; + + if (m_buildTarget == QLatin1String(ADD_RUNCONFIGURATION_TEXT)) { if (rc) - Utils::QtcProcess::addArg(&arguments, rc->title()); + target = rc->title(); else - Utils::QtcProcess::addArg(&arguments, QLatin1String("<") + tr(ADD_RUNCONFIGURATION_TEXT) + QLatin1String(">")); - } - foreach (const QString &t, m_buildTargets) { - Utils::QtcProcess::addArg(&arguments, QLatin1String("--target")); - Utils::QtcProcess::addArg(&arguments, t); + target = QLatin1String("<") + tr(ADD_RUNCONFIGURATION_TEXT) + QLatin1String(">"); + } else { + target = m_buildTarget; } + Utils::QtcProcess::addArg(&arguments, QLatin1String("--target")); + Utils::QtcProcess::addArg(&arguments, target); + if (!m_toolArguments.isEmpty()) { Utils::QtcProcess::addArg(&arguments, QLatin1String("--")); arguments += QLatin1Char(' ') + m_toolArguments; @@ -369,16 +356,6 @@ QString CMakeBuildStep::allArguments(const CMakeRunConfiguration *rc) const return arguments; } -bool CMakeBuildStep::addRunConfigurationArgument() const -{ - return m_addRunConfigurationArgument; -} - -void CMakeBuildStep::setAddRunConfigurationArgument(bool add) -{ - m_addRunConfigurationArgument = add; -} - QString CMakeBuildStep::cmakeCommand() const { CMakeTool *tool = CMakeKitInformation::cmakeTool(target()->kit()); @@ -390,6 +367,11 @@ QString CMakeBuildStep::cleanTarget() return QLatin1String("clean"); } +QString CMakeBuildStep::allTarget() +{ + return QLatin1String("all"); +} + // // CMakeBuildStepConfigWidget // @@ -407,7 +389,6 @@ CMakeBuildStepConfigWidget::CMakeBuildStepConfigWidget(CMakeBuildStep *buildStep fl->addRow(tr("Tool arguments:"), m_toolArguments); m_toolArguments->setText(m_buildStep->toolArguments()); - m_buildTargetsList->setFrameStyle(QFrame::NoFrame); m_buildTargetsList->setMinimumHeight(200); @@ -420,22 +401,7 @@ CMakeBuildStepConfigWidget::CMakeBuildStepConfigWidget(CMakeBuildStep *buildStep fl->addRow(tr("Targets:"), frame); - auto itemAddRunConfigurationArgument = new QListWidgetItem(tr(ADD_RUNCONFIGURATION_TEXT), m_buildTargetsList); - itemAddRunConfigurationArgument->setFlags(itemAddRunConfigurationArgument->flags() | Qt::ItemIsUserCheckable); - itemAddRunConfigurationArgument->setCheckState(m_buildStep->addRunConfigurationArgument() ? Qt::Checked : Qt::Unchecked); - QFont f; - f.setItalic(true); - itemAddRunConfigurationArgument->setFont(f); - - CMakeProject *pro = static_cast(m_buildStep->project()); - QStringList targetList = pro->buildTargetTitles(); - targetList.sort(); - foreach (const QString &buildTarget, targetList) { - auto item = new QListWidgetItem(buildTarget, m_buildTargetsList); - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(m_buildStep->buildsBuildTarget(item->text()) ? Qt::Checked : Qt::Unchecked); - } - + buildTargetsChanged(); updateDetails(); connect(m_toolArguments, &QLineEdit::textEdited, this, &CMakeBuildStepConfigWidget::toolArgumentsEdited); @@ -444,8 +410,9 @@ CMakeBuildStepConfigWidget::CMakeBuildStepConfigWidget(CMakeBuildStep *buildStep this, &CMakeBuildStepConfigWidget::updateDetails); connect(m_buildStep, &CMakeBuildStep::buildTargetsChanged, this, &CMakeBuildStepConfigWidget::buildTargetsChanged); - connect(m_buildStep, &CMakeBuildStep::targetsToBuildChanged, this, &CMakeBuildStepConfigWidget::selectedBuildTargetsChanged); - connect(pro, &CMakeProject::environmentChanged, this, &CMakeBuildStepConfigWidget::updateDetails); + connect(m_buildStep, &CMakeBuildStep::targetToBuildChanged, this, &CMakeBuildStepConfigWidget::selectedBuildTargetsChanged); + connect(static_cast(m_buildStep->project()), &CMakeProject::environmentChanged, + this, &CMakeBuildStepConfigWidget::updateDetails); } void CMakeBuildStepConfigWidget::toolArgumentsEdited() @@ -456,7 +423,9 @@ void CMakeBuildStepConfigWidget::toolArgumentsEdited() void CMakeBuildStepConfigWidget::itemChanged(QListWidgetItem *item) { - m_buildStep->setBuildTarget(item->text(), item->checkState() & Qt::Checked); + const QString target = + (item->checkState() == Qt::Checked) ? item->data(Qt::UserRole).toString() : CMakeBuildStep::allTarget(); + m_buildStep->setBuildTarget(target); updateDetails(); } @@ -467,30 +436,44 @@ QString CMakeBuildStepConfigWidget::displayName() const void CMakeBuildStepConfigWidget::buildTargetsChanged() { - disconnect(m_buildTargetsList, &QListWidget::itemChanged, this, &CMakeBuildStepConfigWidget::itemChanged); - - auto *addRunConfigurationArgumentItem = m_buildTargetsList->takeItem(0); + const bool wasBlocked = m_buildTargetsList->blockSignals(true); m_buildTargetsList->clear(); - m_buildTargetsList->insertItem(0, addRunConfigurationArgumentItem); - CMakeProject *pro = static_cast(m_buildStep->target()->project()); - foreach (const QString& buildTarget, pro->buildTargetTitles()) { + auto item = new QListWidgetItem(tr(ADD_RUNCONFIGURATION_TEXT), m_buildTargetsList); + + item->setData(Qt::UserRole, QString::fromLatin1(ADD_RUNCONFIGURATION_TEXT)); + QFont f; + f.setItalic(true); + item->setFont(f); + + CMakeProject *pro = static_cast(m_buildStep->project()); + QStringList targetList = pro->buildTargetTitles(); + targetList.sort(); + + foreach (const QString &buildTarget, targetList) { auto item = new QListWidgetItem(buildTarget, m_buildTargetsList); - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(m_buildStep->buildsBuildTarget(item->text()) ? Qt::Checked : Qt::Unchecked); + item->setData(Qt::UserRole, buildTarget); } - connect(m_buildTargetsList, &QListWidget::itemChanged, this, &CMakeBuildStepConfigWidget::itemChanged); + + for (int i = 0; i < m_buildTargetsList->count(); ++i) { + QListWidgetItem *item = m_buildTargetsList->item(i); + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); + item->setCheckState(m_buildStep->buildsBuildTarget(item->data(Qt::UserRole).toString()) + ? Qt::Checked : Qt::Unchecked); + } + m_buildTargetsList->blockSignals(wasBlocked); updateSummary(); } void CMakeBuildStepConfigWidget::selectedBuildTargetsChanged() { - disconnect(m_buildTargetsList, &QListWidget::itemChanged, this, &CMakeBuildStepConfigWidget::itemChanged); + const bool wasBlocked = m_buildTargetsList->blockSignals(true); for (int y = 0; y < m_buildTargetsList->count(); ++y) { QListWidgetItem *item = m_buildTargetsList->item(y); - item->setCheckState(m_buildStep->buildsBuildTarget(item->text()) ? Qt::Checked : Qt::Unchecked); + item->setCheckState(m_buildStep->buildsBuildTarget(item->data(Qt::UserRole).toString()) + ? Qt::Checked : Qt::Unchecked); } - connect(m_buildTargetsList, &QListWidget::itemChanged, this, &CMakeBuildStepConfigWidget::itemChanged); + m_buildTargetsList->blockSignals(wasBlocked); updateSummary(); } @@ -541,7 +524,7 @@ BuildStep *CMakeBuildStepFactory::create(BuildStepList *parent, Core::Id id) return 0; auto step = new CMakeBuildStep(parent); if (parent->id() == ProjectExplorer::Constants::BUILDSTEPS_CLEAN) - step->setBuildTarget(CMakeBuildStep::cleanTarget(), true); + step->setBuildTarget(CMakeBuildStep::cleanTarget()); return step; } diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.h b/src/plugins/cmakeprojectmanager/cmakebuildstep.h index 7f4260551b8..8249e1f1f25 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.h @@ -61,10 +61,9 @@ public: ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; bool immutable() const override; - QStringList buildTargets() const; + QString buildTarget() const; bool buildsBuildTarget(const QString &target) const; - void setBuildTarget(const QString &target, bool on); - void setBuildTargets(const QStringList &targets); + void setBuildTarget(const QString &target); void clearBuildTargets(); QString toolArguments() const; @@ -72,18 +71,16 @@ public: QString allArguments(const CMakeRunConfiguration *rc) const; - bool addRunConfigurationArgument() const; - void setAddRunConfigurationArgument(bool add); - QString cmakeCommand() const; QVariantMap toMap() const override; static QString cleanTarget(); + static QString allTarget(); signals: void cmakeCommandChanged(); - void targetsToBuildChanged(); + void targetToBuildChanged(); void buildTargetsChanged(); protected: @@ -112,9 +109,8 @@ private: QRegExp m_percentProgress; QRegExp m_ninjaProgress; QString m_ninjaProgressString; - QStringList m_buildTargets; + QString m_buildTarget; QString m_toolArguments; - bool m_addRunConfigurationArgument = false; bool m_useNinja = false; }; diff --git a/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp b/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp index 36b4ca661e7..341330c88ba 100644 --- a/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp @@ -111,13 +111,13 @@ void CMakeLocatorFilter::accept(Core::LocatorFilterEntry selection) const return; // Change the make step to build only the given target - QStringList oldTargets = buildStep->buildTargets(); + QString oldTarget = buildStep->buildTarget(); buildStep->clearBuildTargets(); - buildStep->setBuildTarget(selection.displayName, true); + buildStep->setBuildTarget(selection.displayName); // Build ProjectExplorerPlugin::buildProject(cmakeProject); - buildStep->setBuildTargets(oldTargets); + buildStep->setBuildTarget(oldTarget); } void CMakeLocatorFilter::refresh(QFutureInterface &future)