diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index 9e3f2a42743..dbfc4825eb1 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -26,6 +26,7 @@ #include "builddirmanager.h" #include "cmakebuildconfiguration.h" +#include "cmakebuildstep.h" #include "cmakekitinformation.h" #include "cmakeprojectnodes.h" #include "cmaketool.h" @@ -311,14 +312,30 @@ void BuildDirManager::clearCache() forceReparse(); } +static CMakeBuildTarget utilityTarget(const QString &title, const BuildDirManager *bdm) +{ + CMakeBuildTarget target; + + target.title = title; + target.targetType = UtilityType; + target.workingDirectory = bdm->buildConfiguration()->buildDirectory(); + target.sourceDirectory = bdm->buildConfiguration()->target()->project()->projectDirectory(); + + return target; +} + QList BuildDirManager::buildTargets() const { QTC_ASSERT(!m_isHandlingError, return {}); if (!m_reader) return QList(); - if (m_buildTargets.isEmpty()) - m_buildTargets = m_reader->buildTargets(); + if (m_buildTargets.isEmpty()) { + m_buildTargets.append(utilityTarget(CMakeBuildStep::allTarget(), this)); + m_buildTargets.append(utilityTarget(CMakeBuildStep::cleanTarget(), this)); + m_buildTargets.append(utilityTarget(CMakeBuildStep::installTarget(), this)); + m_buildTargets.append(m_reader->buildTargets()); + } return m_buildTargets; } diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.h b/src/plugins/cmakeprojectmanager/builddirmanager.h index 10632f360e6..f0381970ab8 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.h +++ b/src/plugins/cmakeprojectmanager/builddirmanager.h @@ -79,6 +79,8 @@ public: static CMakeConfig parseConfiguration(const Utils::FileName &cacheFile, QString *errorMessage); + CMakeBuildConfiguration *buildConfiguration() const { return m_buildConfiguration; } + signals: void configurationStarted() const; void dataAvailable() const; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp index a8ca10bf867..119ade4d67c 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp @@ -461,29 +461,21 @@ QString CMakeBuildStepConfigWidget::displayName() const return tr("Build", "CMakeProjectManager::CMakeBuildStepConfigWidget display name."); } -static void createSpecialItem(const QString &text, const QString &data, QListWidget *parent) -{ - auto item = new QListWidgetItem(text, parent); - - item->setData(Qt::UserRole, data); - QFont f; - f.setItalic(true); - item->setFont(f); -} - void CMakeBuildStepConfigWidget::buildTargetsChanged() { const bool wasBlocked = m_buildTargetsList->blockSignals(true); m_buildTargetsList->clear(); - createSpecialItem(tr(ADD_RUNCONFIGURATION_TEXT), ADD_RUNCONFIGURATION_TEXT, m_buildTargetsList); - createSpecialItem(tr("all"), "all", m_buildTargetsList); - createSpecialItem(tr("clean"), "clean", m_buildTargetsList); - auto pro = static_cast(m_buildStep->project()); QStringList targetList = pro->buildTargetTitles(); targetList.sort(); + QFont italics; + italics.setItalic(true); + + auto exeItem = new QListWidgetItem(tr(ADD_RUNCONFIGURATION_TEXT), m_buildTargetsList); + exeItem->setData(Qt::UserRole, ADD_RUNCONFIGURATION_TEXT); + foreach (const QString &buildTarget, targetList) { auto item = new QListWidgetItem(buildTarget, m_buildTargetsList); item->setData(Qt::UserRole, buildTarget); @@ -491,9 +483,14 @@ void CMakeBuildStepConfigWidget::buildTargetsChanged() for (int i = 0; i < m_buildTargetsList->count(); ++i) { QListWidgetItem *item = m_buildTargetsList->item(i); + const QString title = item->data(Qt::UserRole).toString(); + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(m_buildStep->buildsBuildTarget(item->data(Qt::UserRole).toString()) - ? Qt::Checked : Qt::Unchecked); + item->setCheckState(m_buildStep->buildsBuildTarget(title) ? Qt::Checked : Qt::Unchecked); + + // Print utility targets in italics: + if (CMakeBuildStep::specialTargets().contains(title) || title == ADD_RUNCONFIGURATION_TEXT) + item->setFont(italics); } m_buildTargetsList->blockSignals(wasBlocked); updateSummary();