From 4348a2fc56828f7b29493e49b18af0913f0a4c69 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 11 Feb 2025 16:47:24 +0100 Subject: [PATCH] ProjectExplorer: Make deploy configurations per build configuration The first step towards having the run settings "per configuration" instead of "per target". There is no syncing functionality yet. Task-number: QTCREATORBUG-32380 Change-Id: Ia6086bacb8957e0b5dafe52a0d4e74e43a2c2292 Reviewed-by: hjk Reviewed-by: Christian Stenger --- .../projectexplorer/buildconfiguration.cpp | 211 ++++++++++++++++ .../projectexplorer/buildconfiguration.h | 15 ++ src/plugins/projectexplorer/buildstep.cpp | 10 +- .../projectexplorer/deployconfiguration.cpp | 34 ++- .../projectexplorer/deployconfiguration.h | 14 +- .../miniprojecttargetselector.cpp | 50 ++-- .../miniprojecttargetselector.h | 1 + src/plugins/projectexplorer/project.cpp | 40 ++-- .../runsettingspropertiespage.cpp | 81 ++++--- .../runsettingspropertiespage.h | 1 + src/plugins/projectexplorer/target.cpp | 226 ++++-------------- src/plugins/projectexplorer/target.h | 13 +- .../appmanagercmakepackagestep.cpp | 4 +- ...managerdeployconfigurationautoswitcher.cpp | 6 +- .../appmanagerdeploypackagestep.cpp | 4 +- .../appmanagerinstallpackagestep.cpp | 5 +- .../appmanagerrunconfiguration.cpp | 8 +- .../appmanagerruncontrol.cpp | 6 +- .../appmanagertargetinformation.cpp | 34 ++- .../appmanagertargetinformation.h | 7 +- 20 files changed, 436 insertions(+), 334 deletions(-) diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index 79b5e146d66..a9ebcdf723e 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -5,14 +5,18 @@ #include "buildaspects.h" #include "buildinfo.h" +#include "buildmanager.h" #include "buildpropertiessettings.h" #include "buildsteplist.h" #include "buildstepspage.h" #include "buildsystem.h" #include "customparser.h" +#include "deployconfiguration.h" #include "devicesupport/devicekitaspects.h" #include "environmentwidget.h" #include "kit.h" +#include "miniprojecttargetselector.h" +#include "projectconfigurationmodel.h" #include "projectexplorerconstants.h" #include "projectexplorer.h" #include "projectexplorertr.h" @@ -33,6 +37,7 @@ #include #include #include +#include #include #include @@ -48,6 +53,10 @@ const char BUILD_STEP_LIST_PREFIX[] = "ProjectExplorer.BuildConfiguration.BuildS const char CUSTOM_PARSERS_KEY[] = "ProjectExplorer.BuildConfiguration.CustomParsers"; const char PARSE_STD_OUT_KEY[] = "ProjectExplorer.BuildConfiguration.ParseStandardOutput"; +const char ACTIVE_DC_KEY[] = "ProjectExplorer.Target.ActiveDeployConfiguration"; +const char DC_KEY_PREFIX[] = "ProjectExplorer.Target.DeployConfiguration."; +const char DC_COUNT_KEY[] = "ProjectExplorer.Target.DeployConfigurationCount"; + Q_LOGGING_CATEGORY(bcLog, "qtc.buildconfig", QtWarningMsg) namespace ProjectExplorer { @@ -136,6 +145,7 @@ public: , m_buildDirectoryAspect(bc, bc) , m_tooltipAspect(bc) , m_buildSystem(bc->project()->createBuildSystem(bc)) + , m_deployConfigurationModel(bc->target()) {} ~BuildConfigurationPrivate() { delete m_buildSystem; } @@ -155,6 +165,10 @@ public: bool m_parseStdOut = false; QList m_customParsers; BuildSystem * const m_buildSystem; + QList m_deployConfigurations; + DeployConfiguration *m_activeDeployConfiguration = nullptr; + + ProjectConfigurationModel m_deployConfigurationModel; // FIXME: Remove. BuildConfiguration::BuildType m_initialBuildType = BuildConfiguration::Unknown; @@ -227,6 +241,7 @@ BuildConfiguration::BuildConfiguration(Target *target, Utils::Id id) BuildConfiguration::~BuildConfiguration() { + qDeleteAll(d->m_deployConfigurations); delete d; } @@ -321,6 +336,66 @@ void BuildConfiguration::setInitializer(const std::functionm_initializer = initializer; } +bool BuildConfiguration::addConfigurationsFromMap( + const Utils::Store &map, bool setActiveConfigurations) +{ + bool ok = true; + int dcCount = map.value(DC_COUNT_KEY, 0).toInt(&ok); + if (!ok || dcCount < 0) + dcCount = 0; + int activeDc = map.value(ACTIVE_DC_KEY, 0).toInt(&ok); + if (!ok || 0 > activeDc || dcCount < activeDc) + activeDc = 0; + if (!setActiveConfigurations) + activeDc = -1; + + for (int i = 0; i < dcCount; ++i) { + const Key key = numberedKey(DC_KEY_PREFIX, i); + if (!map.contains(key)) + return false; + Store valueMap = storeFromVariant(map.value(key)); + DeployConfiguration *dc = DeployConfigurationFactory::restore(this, valueMap); + if (!dc) { + Utils::Id id = idFromMap(valueMap); + qWarning("No factory found to restore deployment configuration of id '%s'!", + id.isValid() ? qPrintable(id.toString()) : "UNKNOWN"); + continue; + } + QTC_CHECK(dc->id() == ProjectExplorer::idFromMap(valueMap)); + addDeployConfiguration(dc); + if (i == activeDc) + setActiveDeployConfiguration(dc); + } + return true; +} + +void BuildConfiguration::storeConfigurationsToMap(Utils::Store &map) const +{ + const QList dcs = deployConfigurations(); + map.insert(ACTIVE_DC_KEY, dcs.indexOf(d->m_activeDeployConfiguration)); + map.insert(DC_COUNT_KEY, dcs.size()); + for (int i = 0; i < dcs.size(); ++i) { + Store data; + dcs.at(i)->toMap(data); + map.insert(numberedKey(DC_KEY_PREFIX, i), variantFromStore(data)); + } +} + +void BuildConfiguration::setActiveDeployConfiguration(DeployConfiguration *dc) +{ + if (dc) { + QTC_ASSERT(d->m_deployConfigurations.contains(dc), return); + } else { + QTC_ASSERT(d->m_deployConfigurations.isEmpty(), return); + } + if (dc == d->m_activeDeployConfiguration) + return; + + d->m_activeDeployConfiguration = dc; + if (this == target()->activeBuildConfiguration()) + emit target()->activeDeployConfigurationChanged(d->m_activeDeployConfiguration); +} + QWidget *BuildConfiguration::createConfigWidget() { QWidget *named = new QWidget; @@ -384,6 +459,139 @@ void BuildConfiguration::appendInitialCleanStep(Utils::Id id) d->m_initialCleanSteps.append(id); } +void BuildConfiguration::addDeployConfiguration(DeployConfiguration *dc) +{ + QTC_ASSERT(dc && !d->m_deployConfigurations.contains(dc), return); + QTC_ASSERT(dc->buildConfiguration() == this, return); + + // Check that we don't have a configuration with the same displayName + QString configurationDisplayName = dc->displayName(); + QStringList displayNames = Utils::transform(d->m_deployConfigurations, &DeployConfiguration::displayName); + configurationDisplayName = Utils::makeUniquelyNumbered(configurationDisplayName, displayNames); + dc->setDisplayName(configurationDisplayName); + + // add it + d->m_deployConfigurations.push_back(dc); + + ProjectExplorerPlugin::targetSelector()->addedDeployConfiguration(dc); // TODO: Use signal instead? + d->m_deployConfigurationModel.addProjectConfiguration(dc); + if (this == target()->activeBuildConfiguration()) + emit target()->addedDeployConfiguration(dc); + + if (!d->m_activeDeployConfiguration) + setActiveDeployConfiguration(dc); + Q_ASSERT(activeDeployConfiguration()); + +} + +bool BuildConfiguration::removeDeployConfiguration(DeployConfiguration *dc) +{ + if (!d->m_deployConfigurations.contains(dc)) + return false; + + if (BuildManager::isBuilding(dc)) + return false; + + d->m_deployConfigurations.removeOne(dc); + + if (activeDeployConfiguration() == dc) { + if (d->m_deployConfigurations.isEmpty()) + setActiveDeployConfiguration(nullptr, SetActive::Cascade); + else + setActiveDeployConfiguration(d->m_deployConfigurations.at(0), SetActive::Cascade); + } + + ProjectExplorerPlugin::targetSelector()->removedDeployConfiguration(dc); + d->m_deployConfigurationModel.removeProjectConfiguration(dc); + emit target()->removedDeployConfiguration(dc); // TODO: Own signal? + + delete dc; + return true; + +} + +const QList BuildConfiguration::deployConfigurations() const +{ + return d->m_deployConfigurations; +} + +DeployConfiguration *BuildConfiguration::activeDeployConfiguration() const +{ + return d->m_activeDeployConfiguration; +} + +void BuildConfiguration::setActiveDeployConfiguration(DeployConfiguration *dc, SetActive cascade) +{ + QTC_ASSERT(project(), return); + + if (project()->isShuttingDown() || target()->isShuttingDown()) // Do we need our own isShuttungDown()? + return; + + setActiveDeployConfiguration(dc); + + if (!dc) + return; + if (cascade != SetActive::Cascade || !ProjectManager::isProjectConfigurationCascading()) + return; + + Id kitId = kit()->id(); + QString name = dc->displayName(); // We match on displayname + for (Project *otherProject : ProjectManager::projects()) { + if (otherProject == project()) + continue; + Target *otherTarget = otherProject->activeTarget(); + if (!otherTarget || otherTarget->kit()->id() != kitId) + continue; + + for (BuildConfiguration *otherBc : otherTarget->buildConfigurations()) { + for (DeployConfiguration *otherDc : otherBc->deployConfigurations()) { + if (otherDc->displayName() == name) { + otherBc->setActiveDeployConfiguration(otherDc); + break; + } + } + } + } +} + +void BuildConfiguration::updateDefaultDeployConfigurations() +{ + const QList dcFactories = DeployConfigurationFactory::find( + target()); + QTC_ASSERT(!dcFactories.isEmpty(), qDebug() << target()->id(); return); + + QList dcIds; + for (const DeployConfigurationFactory *dcFactory : dcFactories) + dcIds.append(dcFactory->creationId()); + + const QList dcList = deployConfigurations(); + QList toCreate = dcIds; + + for (DeployConfiguration *dc : dcList) { + if (dcIds.contains(dc->id())) + toCreate.removeOne(dc->id()); + else + removeDeployConfiguration(dc); + } + + for (Utils::Id id : std::as_const(toCreate)) { + for (DeployConfigurationFactory *dcFactory : dcFactories) { + if (dcFactory->creationId() == id) { + DeployConfiguration *dc = dcFactory->create(this); + if (dc) { + QTC_CHECK(dc->id() == id); + addDeployConfiguration(dc); + } + } + } + } +} + +ProjectConfigurationModel *BuildConfiguration::deployConfigurationModel() const +{ + return &d->m_deployConfigurationModel; +} + BuildConfiguration *BuildConfiguration::clone(Target *target) const { Store map; @@ -405,6 +613,8 @@ void BuildConfiguration::toMap(Store &map) const map.insert(PARSE_STD_OUT_KEY, d->m_parseStdOut); map.insert(CUSTOM_PARSERS_KEY, transform(d->m_customParsers, &Id::toSetting)); + + storeConfigurationsToMap(map); } void BuildConfiguration::fromMap(const Store &map) @@ -442,6 +652,7 @@ void BuildConfiguration::fromMap(const Store &map) ProjectConfiguration::fromMap(map); setToolTip(d->m_tooltipAspect()); + addConfigurationsFromMap(map, true); } void BuildConfiguration::updateCacheAndEmitEnvironmentChanged() diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h index 3d47c07e294..98e381fc93b 100644 --- a/src/plugins/projectexplorer/buildconfiguration.h +++ b/src/plugins/projectexplorer/buildconfiguration.h @@ -5,6 +5,7 @@ #include "projectexplorer_export.h" #include "projectconfiguration.h" +#include "target.h" #include "task.h" #include @@ -20,6 +21,7 @@ class BuildDirectoryAspect; class BuildInfo; class BuildSystem; class BuildStepList; +class DeployConfiguration; class Kit; class Node; class Project; @@ -32,6 +34,7 @@ class PROJECTEXPLORER_EXPORT BuildConfiguration : public ProjectConfiguration protected: friend class BuildConfigurationFactory; + friend class Target; explicit BuildConfiguration(Target *target, Utils::Id id); public: @@ -71,6 +74,14 @@ public: void appendInitialBuildStep(Utils::Id id); void appendInitialCleanStep(Utils::Id id); + void addDeployConfiguration(DeployConfiguration *dc); + bool removeDeployConfiguration(DeployConfiguration *dc); + const QList deployConfigurations() const; + DeployConfiguration *activeDeployConfiguration() const; + void setActiveDeployConfiguration(DeployConfiguration *dc, SetActive cascade); + void updateDefaultDeployConfigurations(); + ProjectConfigurationModel *deployConfigurationModel() const; + virtual BuildConfiguration *clone(Target *target) const; void fromMap(const Utils::Store &map) override; void toMap(Utils::Store &map) const override; @@ -132,6 +143,10 @@ protected: void setInitializer(const std::function &initializer); private: + bool addConfigurationsFromMap(const Utils::Store &map, bool setActiveConfigurations); + void storeConfigurationsToMap(Utils::Store &map) const; + void setActiveDeployConfiguration(DeployConfiguration *dc); + void emitBuildDirectoryChanged(); Internal::BuildConfigurationPrivate *d = nullptr; }; diff --git a/src/plugins/projectexplorer/buildstep.cpp b/src/plugins/projectexplorer/buildstep.cpp index a45d6189159..e601f99a807 100644 --- a/src/plugins/projectexplorer/buildstep.cpp +++ b/src/plugins/projectexplorer/buildstep.cpp @@ -141,11 +141,12 @@ void BuildStep::toMap(Store &map) const BuildConfiguration *BuildStep::buildConfiguration() const { - auto config = qobject_cast(projectConfiguration()); - if (config) - return config; + if (const auto buildConfig = qobject_cast(projectConfiguration())) + return buildConfig; + if (const auto deployConfig = qobject_cast(projectConfiguration())) + return deployConfig->buildConfiguration(); - // step is not part of a build configuration, use active build configuration of step's target + QTC_CHECK(false); return target()->activeBuildConfiguration(); } @@ -154,7 +155,6 @@ DeployConfiguration *BuildStep::deployConfiguration() const auto config = qobject_cast(projectConfiguration()); if (config) return config; - // See comment in buildConfiguration() QTC_CHECK(false); // step is not part of a deploy configuration, use active deploy configuration of step's target return target()->activeDeployConfiguration(); diff --git a/src/plugins/projectexplorer/deployconfiguration.cpp b/src/plugins/projectexplorer/deployconfiguration.cpp index 259a3f800cc..f96227302a2 100644 --- a/src/plugins/projectexplorer/deployconfiguration.cpp +++ b/src/plugins/projectexplorer/deployconfiguration.cpp @@ -28,8 +28,9 @@ const char BUILD_STEP_LIST_PREFIX[] = "ProjectExplorer.BuildConfiguration.BuildS const char USES_DEPLOYMENT_DATA[] = "ProjectExplorer.DeployConfiguration.CustomDataEnabled"; const char DEPLOYMENT_DATA[] = "ProjectExplorer.DeployConfiguration.CustomData"; -DeployConfiguration::DeployConfiguration(Target *target, Id id) - : ProjectConfiguration(target, id) +DeployConfiguration::DeployConfiguration(BuildConfiguration *bc, Id id) + : ProjectConfiguration(bc->target(), id) + , m_buildConfiguration(bc) , m_stepList(this, Constants::BUILDSTEPS_DEPLOY) { //: Default DeployConfiguration display name @@ -39,10 +40,7 @@ DeployConfiguration::DeployConfiguration(Target *target, Id id) MacroExpander &expander = *macroExpander(); expander.setDisplayName(Tr::tr("Run Settings")); expander.setAccumulating(true); - expander.registerSubProvider([target] { - BuildConfiguration *bc = target->activeBuildConfiguration(); - return bc ? bc->macroExpander() : target->macroExpander(); - }); + expander.registerSubProvider([bc] { return bc->macroExpander(); }); } BuildStepList *DeployConfiguration::stepList() @@ -178,47 +176,47 @@ void DeployConfigurationFactory::setConfigBaseId(Id deployConfigBaseId) m_deployConfigBaseId = deployConfigBaseId; } -DeployConfiguration *DeployConfigurationFactory::createDeployConfiguration(Target *t) +DeployConfiguration *DeployConfigurationFactory::createDeployConfiguration(BuildConfiguration *bc) { - auto dc = new DeployConfiguration(t, m_deployConfigBaseId); + auto dc = new DeployConfiguration(bc, m_deployConfigBaseId); dc->setDefaultDisplayName(m_defaultDisplayName); dc->m_configWidgetCreator = m_configWidgetCreator; return dc; } -DeployConfiguration *DeployConfigurationFactory::create(Target *parent) +DeployConfiguration *DeployConfigurationFactory::create(BuildConfiguration *bc) { - QTC_ASSERT(canHandle(parent), return nullptr); - DeployConfiguration *dc = createDeployConfiguration(parent); + QTC_ASSERT(canHandle(bc->target()), return nullptr); + DeployConfiguration *dc = createDeployConfiguration(bc); QTC_ASSERT(dc, return nullptr); BuildStepList *stepList = dc->stepList(); for (const BuildStepList::StepCreationInfo &info : std::as_const(m_initialSteps)) { - if (!info.condition || info.condition(parent)) + if (!info.condition || info.condition(bc->target())) stepList->appendStep(info.stepId); } return dc; } -DeployConfiguration *DeployConfigurationFactory::clone(Target *parent, +DeployConfiguration *DeployConfigurationFactory::clone(BuildConfiguration *bc, const DeployConfiguration *source) { Store map; source->toMap(map); - return restore(parent, map); + return restore(bc, map); } -DeployConfiguration *DeployConfigurationFactory::restore(Target *parent, const Store &map) +DeployConfiguration *DeployConfigurationFactory::restore(BuildConfiguration *bc, const Store &map) { const Id id = idFromMap(map); DeployConfigurationFactory *factory = Utils::findOrDefault(g_deployConfigurationFactories, - [parent, id](DeployConfigurationFactory *f) { - if (!f->canHandle(parent)) + [bc, id](DeployConfigurationFactory *f) { + if (!f->canHandle(bc->target())) return false; return id.name().startsWith(f->m_deployConfigBaseId.name()); }); if (!factory) return nullptr; - DeployConfiguration *dc = factory->createDeployConfiguration(parent); + DeployConfiguration *dc = factory->createDeployConfiguration(bc); QTC_ASSERT(dc, return nullptr); dc->fromMap(map); if (dc->hasError()) { diff --git a/src/plugins/projectexplorer/deployconfiguration.h b/src/plugins/projectexplorer/deployconfiguration.h index a3ebac85b89..3de9455fce1 100644 --- a/src/plugins/projectexplorer/deployconfiguration.h +++ b/src/plugins/projectexplorer/deployconfiguration.h @@ -11,6 +11,7 @@ namespace ProjectExplorer { +class BuildConfiguration; class BuildStepList; class Target; class DeployConfigurationFactory; @@ -21,7 +22,7 @@ class PROJECTEXPLORER_EXPORT DeployConfiguration final : public ProjectConfigura private: friend class DeployConfigurationFactory; - explicit DeployConfiguration(Target *target, Utils::Id id); + explicit DeployConfiguration(BuildConfiguration *bc, Utils::Id id); public: ~DeployConfiguration() override = default; @@ -42,7 +43,10 @@ public: DeploymentData customDeploymentData() const { return m_customDeploymentData; } void setCustomDeploymentData(const DeploymentData &data) { m_customDeploymentData = data; } + BuildConfiguration *buildConfiguration() const { return m_buildConfiguration; } + private: + BuildConfiguration * const m_buildConfiguration; BuildStepList m_stepList; using WidgetCreator = std::function; WidgetCreator m_configWidgetCreator; @@ -63,11 +67,11 @@ public: // the name to display to the user QString defaultDisplayName() const; - DeployConfiguration *create(Target *parent); + DeployConfiguration *create(BuildConfiguration *bc); static const QList find(Target *parent); - static DeployConfiguration *restore(Target *parent, const Utils::Store &map); - static DeployConfiguration *clone(Target *parent, const DeployConfiguration *dc); + static DeployConfiguration *restore(BuildConfiguration *bc, const Utils::Store &map); + static DeployConfiguration *clone(BuildConfiguration *bc, const DeployConfiguration *dc); void addSupportedTargetDeviceType(Utils::Id id); void setDefaultDisplayName(const QString &defaultDisplayName); @@ -90,7 +94,7 @@ protected: void setConfigBaseId(Utils::Id deployConfigBaseId); private: - DeployConfiguration *createDeployConfiguration(Target *target); + DeployConfiguration *createDeployConfiguration(BuildConfiguration *bc); Utils::Id m_deployConfigBaseId; Utils::Id m_supportedProjectType; QList m_supportedTargetDeviceTypes; diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.cpp b/src/plugins/projectexplorer/miniprojecttargetselector.cpp index 0d9b9e4abe9..f75b2d9ee60 100644 --- a/src/plugins/projectexplorer/miniprojecttargetselector.cpp +++ b/src/plugins/projectexplorer/miniprojecttargetselector.cpp @@ -737,7 +737,7 @@ MiniProjectTargetSelector::MiniProjectTargetSelector(QAction *targetSelectorActi }); connect(m_listWidgets[DEPLOY], &GenericListWidget::changeActiveProjectConfiguration, this, [this](QObject *pc) { - m_project->activeTarget()->setActiveDeployConfiguration( + m_project->activeBuildConfiguration()->setActiveDeployConfiguration( static_cast(pc), SetActive::Cascade); }); connect(m_listWidgets[RUN], &GenericListWidget::changeActiveProjectConfiguration, @@ -1027,8 +1027,6 @@ void MiniProjectTargetSelector::addedTarget(Target *target) for (BuildConfiguration *bc : target->buildConfigurations()) addedBuildConfiguration(bc, false); - for (DeployConfiguration *dc : target->deployConfigurations()) - addedDeployConfiguration(dc, false); for (RunConfiguration *rc : target->runConfigurations()) addedRunConfiguration(rc, false); } @@ -1042,8 +1040,6 @@ void MiniProjectTargetSelector::removedTarget(Target *target) for (BuildConfiguration *bc : target->buildConfigurations()) removedBuildConfiguration(bc, false); - for (DeployConfiguration *dc : target->deployConfigurations()) - removedDeployConfiguration(dc, false); for (RunConfiguration *rc : target->runConfigurations()) removedRunConfiguration(rc, false); } @@ -1053,6 +1049,9 @@ void MiniProjectTargetSelector::addedBuildConfiguration(BuildConfiguration *bc, if (!m_project || bc->target() != m_project->activeTarget()) return; + for (DeployConfiguration *dc : bc->deployConfigurations()) + addedDeployConfiguration(dc, false); + m_listWidgets[BUILD]->addProjectConfiguration(bc); if (update) updateBuildListVisible(); @@ -1063,6 +1062,9 @@ void MiniProjectTargetSelector::removedBuildConfiguration(BuildConfiguration *bc if (!m_project || bc->target() != m_project->activeTarget()) return; + for (DeployConfiguration *dc : bc->deployConfigurations()) + removedDeployConfiguration(dc, false); + m_listWidgets[BUILD]->removeProjectConfiguration(bc); if (update) updateBuildListVisible(); @@ -1070,7 +1072,7 @@ void MiniProjectTargetSelector::removedBuildConfiguration(BuildConfiguration *bc void MiniProjectTargetSelector::addedDeployConfiguration(DeployConfiguration *dc, bool update) { - if (!m_project || dc->target() != m_project->activeTarget()) + if (!m_project || dc->buildConfiguration() != m_project->activeBuildConfiguration()) return; m_listWidgets[DEPLOY]->addProjectConfiguration(dc); @@ -1080,7 +1082,7 @@ void MiniProjectTargetSelector::addedDeployConfiguration(DeployConfiguration *dc void MiniProjectTargetSelector::removedDeployConfiguration(DeployConfiguration *dc, bool update) { - if (!m_project || dc->target() != m_project->activeTarget()) + if (!m_project || dc->buildConfiguration() != m_project->activeBuildConfiguration()) return; m_listWidgets[DEPLOY]->removeProjectConfiguration(dc); @@ -1154,8 +1156,10 @@ void MiniProjectTargetSelector::updateDeployListVisible() int maxCount = 0; for (Project *p : ProjectManager::projects()) { const QList targets = p->targets(); - for (Target *t : targets) - maxCount = qMax(t->deployConfigurations().size(), maxCount); + for (Target *t : targets) { + for (const BuildConfiguration * const bc : t->buildConfigurations()) + maxCount = qMax(bc->deployConfigurations().size(), maxCount); + } } bool visible = maxCount > 1; @@ -1246,25 +1250,13 @@ void MiniProjectTargetSelector::activeTargetChanged(Target *target) for (BuildConfiguration *bc : target->buildConfigurations()) bl.append(bc); m_listWidgets[BUILD]->setProjectConfigurations(bl, target->activeBuildConfiguration()); - - QObjectList dl; - for (DeployConfiguration *dc : target->deployConfigurations()) - dl.append(dc); - m_listWidgets[DEPLOY]->setProjectConfigurations(dl, target->activeDeployConfiguration()); + activeBuildConfigurationChanged(target->activeBuildConfiguration()); QObjectList rl; for (RunConfiguration *rc : target->runConfigurations()) rl.append(rc); m_listWidgets[RUN]->setProjectConfigurations(rl, target->activeRunConfiguration()); - m_buildConfiguration = m_target->activeBuildConfiguration(); - if (m_buildConfiguration) - connect(m_buildConfiguration, &ProjectConfiguration::displayNameChanged, - this, &MiniProjectTargetSelector::updateActionAndSummary); - m_deployConfiguration = m_target->activeDeployConfiguration(); - if (m_deployConfiguration) - connect(m_deployConfiguration, &ProjectConfiguration::displayNameChanged, - this, &MiniProjectTargetSelector::updateActionAndSummary); m_runConfiguration = m_target->activeRunConfiguration(); if (m_runConfiguration) connect(m_runConfiguration, &ProjectConfiguration::displayNameChanged, @@ -1299,13 +1291,25 @@ void MiniProjectTargetSelector::kitChanged(Kit *k) void MiniProjectTargetSelector::activeBuildConfigurationChanged(BuildConfiguration *bc) { - if (m_buildConfiguration) + if (m_buildConfiguration) { disconnect(m_buildConfiguration, &ProjectConfiguration::displayNameChanged, this, &MiniProjectTargetSelector::updateActionAndSummary); + } + m_buildConfiguration = bc; if (m_buildConfiguration) connect(m_buildConfiguration, &ProjectConfiguration::displayNameChanged, this, &MiniProjectTargetSelector::updateActionAndSummary); + if (m_buildConfiguration) { + QObjectList dl; + for (DeployConfiguration *dc : bc->deployConfigurations()) + dl.append(dc); + m_listWidgets[DEPLOY]->setProjectConfigurations(dl, bc->activeDeployConfiguration()); + activeDeployConfigurationChanged(m_buildConfiguration->activeDeployConfiguration()); + } else { + m_listWidgets[DEPLOY]->setProjectConfigurations({}, nullptr); + activeDeployConfigurationChanged(nullptr); + } m_listWidgets[BUILD]->setActiveProjectConfiguration(bc); updateActionAndSummary(); } diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.h b/src/plugins/projectexplorer/miniprojecttargetselector.h index 81f98c4a451..7fccc399d8c 100644 --- a/src/plugins/projectexplorer/miniprojecttargetselector.h +++ b/src/plugins/projectexplorer/miniprojecttargetselector.h @@ -40,6 +40,7 @@ public: void nextOrShow(); private: + friend class ProjectExplorer::BuildConfiguration; friend class ProjectExplorer::Target; void projectAdded(ProjectExplorer::Project *project); void projectRemoved(ProjectExplorer::Project *project); diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 24f02840490..0467326f3d0 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -299,7 +299,6 @@ Target *Project::addTargetForKit(Kit *kit) t->updateDefaultBuildConfigurations(); QTC_ASSERT(!t->buildConfigurations().isEmpty(), return nullptr); - t->updateDefaultDeployConfigurations(); t->updateDefaultRunConfigurations(); addTarget(std::move(t)); @@ -541,6 +540,7 @@ bool Project::copySteps(Target *sourceTarget, Target *newTarget) QStringList runconfigurationError; const Project * const project = newTarget->project(); + int dcCount = 0; for (BuildConfiguration *sourceBc : sourceTarget->buildConfigurations()) { BuildConfiguration *newBc = sourceBc->clone(newTarget); if (!newBc) { @@ -556,6 +556,24 @@ bool Project::copySteps(Target *sourceTarget, Target *newTarget) newTarget->addBuildConfiguration(newBc); if (sourceTarget->activeBuildConfiguration() == sourceBc) newTarget->setActiveBuildConfiguration(newBc, SetActive::NoCascade); + + for (DeployConfiguration *sourceDc : sourceBc->deployConfigurations()) { + ++dcCount; + DeployConfiguration *newDc = DeployConfigurationFactory::clone(newBc, sourceDc); + if (!newDc) { + deployconfigurationError << sourceDc->displayName(); + continue; + } + newDc->setDisplayName(sourceDc->displayName()); + newBc->addDeployConfiguration(newDc); + if (sourceBc->activeDeployConfiguration() == sourceDc) + newBc->setActiveDeployConfiguration(newDc, SetActive::NoCascade); + } + if (!newTarget->activeDeployConfiguration()) { + QList dcs = newBc->deployConfigurations(); + if (!dcs.isEmpty()) + newBc->setActiveDeployConfiguration(dcs.first(), SetActive::NoCascade); + } } if (!newTarget->activeBuildConfiguration()) { QList bcs = newTarget->buildConfigurations(); @@ -563,23 +581,6 @@ bool Project::copySteps(Target *sourceTarget, Target *newTarget) newTarget->setActiveBuildConfiguration(bcs.first(), SetActive::NoCascade); } - for (DeployConfiguration *sourceDc : sourceTarget->deployConfigurations()) { - DeployConfiguration *newDc = DeployConfigurationFactory::clone(newTarget, sourceDc); - if (!newDc) { - deployconfigurationError << sourceDc->displayName(); - continue; - } - newDc->setDisplayName(sourceDc->displayName()); - newTarget->addDeployConfiguration(newDc); - if (sourceTarget->activeDeployConfiguration() == sourceDc) - newTarget->setActiveDeployConfiguration(newDc, SetActive::NoCascade); - } - if (!newTarget->activeBuildConfiguration()) { - QList dcs = newTarget->deployConfigurations(); - if (!dcs.isEmpty()) - newTarget->setActiveDeployConfiguration(dcs.first(), SetActive::NoCascade); - } - for (RunConfiguration *sourceRc : sourceTarget->runConfigurations()) { RunConfiguration *newRc = sourceRc->clone(newTarget); if (!newRc) { @@ -600,7 +601,7 @@ bool Project::copySteps(Target *sourceTarget, Target *newTarget) if (buildconfigurationError.count() == sourceTarget->buildConfigurations().count()) fatalError = true; - if (deployconfigurationError.count() == sourceTarget->deployConfigurations().count()) + if (deployconfigurationError.count() == dcCount) fatalError = true; if (runconfigurationError.count() == sourceTarget->runConfigurations().count()) @@ -1134,7 +1135,6 @@ BuildConfiguration *Project::setup(const BuildInfo &info) t->addBuildConfiguration(bc); } if (newTarget) { - newTarget->updateDefaultDeployConfigurations(); newTarget->updateDefaultRunConfigurations(); addTarget(std::move(newTarget)); } diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp index c10870c2af0..113acd1077a 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp @@ -13,9 +13,6 @@ #include "runconfiguration.h" #include "target.h" -#include - -#include #include #include #include @@ -107,24 +104,12 @@ RunSettingsWidget::RunSettingsWidget(Target *target) : m_deployLayout->setContentsMargins(0, 0, 0, 0); m_deployLayout->setSpacing(5); - m_deployConfigurationCombo->setModel(m_target->deployConfigurationModel()); - m_addDeployMenu = new QMenu(m_addDeployToolButton); m_addDeployToolButton->setMenu(m_addDeployMenu); - updateDeployConfiguration(m_target->activeDeployConfiguration()); - - // Some projects may not support deployment, so we need this: - m_addDeployToolButton->setEnabled(m_target->activeDeployConfiguration()); - m_deployConfigurationCombo->setEnabled(m_target->activeDeployConfiguration()); - - m_removeDeployToolButton->setEnabled(m_target->deployConfigurations().count() > 1); - m_renameDeployButton->setEnabled(m_target->activeDeployConfiguration()); - + initForActiveBuildConfig(); connect(m_addDeployMenu, &QMenu::aboutToShow, this, &RunSettingsWidget::aboutToShowDeployMenu); - connect(m_deployConfigurationCombo, &QComboBox::currentIndexChanged, - this, &RunSettingsWidget::currentDeployConfigurationChanged); connect(m_removeDeployToolButton, &QAbstractButton::clicked, this, &RunSettingsWidget::removeDeployConfiguration); connect(m_renameDeployButton, &QAbstractButton::clicked, @@ -133,6 +118,9 @@ RunSettingsWidget::RunSettingsWidget(Target *target) : connect(m_target, &Target::activeDeployConfigurationChanged, this, &RunSettingsWidget::activeDeployConfigurationChanged); + connect(m_target, &Target::activeBuildConfigurationChanged, + this, &RunSettingsWidget::initForActiveBuildConfig); + // run part runWidget->setContentsMargins(0, 10, 0, 0); m_runLayout = new QVBoxLayout(runWidget); @@ -315,11 +303,13 @@ void RunSettingsWidget::currentDeployConfigurationChanged(int index) { if (m_ignoreChanges.isLocked()) return; - if (index == -1) - m_target->setActiveDeployConfiguration(nullptr, SetActive::Cascade); - else - m_target->setActiveDeployConfiguration(qobject_cast(m_target->deployConfigurationModel()->projectConfigurationAt(index)), - SetActive::Cascade); + BuildConfiguration * const bc = m_target->activeBuildConfiguration(); + QTC_ASSERT(bc, return); + QTC_ASSERT(index != -1, bc->setActiveDeployConfiguration(nullptr, SetActive::Cascade); return); + bc->setActiveDeployConfiguration( + qobject_cast( + bc->deployConfigurationModel()->projectConfigurationAt(index)), + SetActive::Cascade); } void RunSettingsWidget::aboutToShowDeployMenu() @@ -329,12 +319,13 @@ void RunSettingsWidget::aboutToShowDeployMenu() for (DeployConfigurationFactory *factory : DeployConfigurationFactory::find(m_target)) { QAction *action = m_addDeployMenu->addAction(factory->defaultDisplayName()); connect(action, &QAction::triggered, this, [factory, this] { - DeployConfiguration *newDc = factory->create(m_target); + BuildConfiguration * const bc = m_target->activeBuildConfiguration(); + DeployConfiguration *newDc = factory->create(bc); if (!newDc) return; - m_target->addDeployConfiguration(newDc); - m_target->setActiveDeployConfiguration(newDc, SetActive::Cascade); - m_removeDeployToolButton->setEnabled(m_target->deployConfigurations().size() > 1); + bc->addDeployConfiguration(newDc); + bc->setActiveDeployConfiguration(newDc, SetActive::Cascade); + m_removeDeployToolButton->setEnabled(bc->deployConfigurations().size() > 1); }); } } @@ -364,9 +355,11 @@ void RunSettingsWidget::removeDeployConfiguration() return; } - m_target->removeDeployConfiguration(dc); + BuildConfiguration * const bc = m_target->activeBuildConfiguration(); + QTC_ASSERT(bc, return); + bc->removeDeployConfiguration(dc); - m_removeDeployToolButton->setEnabled(m_target->deployConfigurations().size() > 1); + m_removeDeployToolButton->setEnabled(bc->deployConfigurations().size() > 1); } void RunSettingsWidget::activeDeployConfigurationChanged() @@ -391,9 +384,31 @@ void RunSettingsWidget::renameDeployConfiguration() m_target->activeDeployConfiguration()->setDisplayName(name); } +void RunSettingsWidget::initForActiveBuildConfig() +{ + disconnect(m_deployConfigurationCombo, &QComboBox::currentIndexChanged, + this, &RunSettingsWidget::currentDeployConfigurationChanged); + m_deployConfigurationCombo->setModel( + m_target->activeBuildConfiguration()->deployConfigurationModel()); + connect(m_deployConfigurationCombo, &QComboBox::currentIndexChanged, + this, &RunSettingsWidget::currentDeployConfigurationChanged); + + // Some projects may not support deployment, so we need this: + // FIXME: Not true anymore? There should always be an active deploy config. + m_addDeployToolButton->setEnabled(m_target->activeDeployConfiguration()); + m_deployConfigurationCombo->setEnabled(m_target->activeDeployConfiguration()); + m_renameDeployButton->setEnabled(m_target->activeDeployConfiguration()); + + m_removeDeployToolButton->setEnabled( + m_target->activeBuildConfiguration()->deployConfigurations().count() > 1); + updateDeployConfiguration(m_target->activeDeployConfiguration()); +} + void RunSettingsWidget::updateRemoveToolButtons() { - m_removeDeployToolButton->setEnabled(m_target->deployConfigurations().count() > 1); + const BuildConfiguration * const bc = m_target->activeBuildConfiguration(); + QTC_ASSERT(bc, return); + m_removeDeployToolButton->setEnabled(bc->deployConfigurations().count() > 1); const bool hasRunConfigs = !m_target->runConfigurations().isEmpty(); m_removeRunToolButton->setEnabled(hasRunConfigs); m_removeAllRunConfigsButton->setEnabled(hasRunConfigs); @@ -416,7 +431,9 @@ void RunSettingsWidget::updateDeployConfiguration(DeployConfiguration *dc) if (!dc) return; - int index = m_target->deployConfigurationModel()->indexFor(dc); + const BuildConfiguration * const bc = m_target->activeBuildConfiguration(); + QTC_ASSERT(bc, return); + int index = bc->deployConfigurationModel()->indexFor(dc); { const Utils::GuardLocker locker(m_ignoreChanges); @@ -457,9 +474,11 @@ QString RunSettingsWidget::uniqueDCName(const QString &name) QString result = name.trimmed(); if (!result.isEmpty()) { QStringList dcNames; - const QList configurations = m_target->deployConfigurations(); + const BuildConfiguration * const bc = m_target->activeBuildConfiguration(); + QTC_ASSERT(bc, return name); + const QList configurations = bc->deployConfigurations(); for (DeployConfiguration *dc : configurations) { - if (dc == m_target->activeDeployConfiguration()) + if (dc == bc->activeDeployConfiguration()) continue; dcNames.append(dc->displayName()); } diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.h b/src/plugins/projectexplorer/runsettingspropertiespage.h index 18db4568a45..b87cbb0a71b 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.h +++ b/src/plugins/projectexplorer/runsettingspropertiespage.h @@ -49,6 +49,7 @@ private: void removeDeployConfiguration(); void activeDeployConfigurationChanged(); void renameDeployConfiguration(); + void initForActiveBuildConfig(); void updateRemoveToolButtons(); diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index a4663d7afda..601ea5a1eee 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -25,8 +25,6 @@ #include "projectmanager.h" #include "runconfiguration.h" -#include - #include #include #include @@ -37,8 +35,6 @@ #include #include -#include - using namespace Utils; namespace ProjectExplorer { @@ -47,15 +43,13 @@ const char ACTIVE_BC_KEY[] = "ProjectExplorer.Target.ActiveBuildConfiguration"; const char BC_KEY_PREFIX[] = "ProjectExplorer.Target.BuildConfiguration."; const char BC_COUNT_KEY[] = "ProjectExplorer.Target.BuildConfigurationCount"; -const char ACTIVE_DC_KEY[] = "ProjectExplorer.Target.ActiveDeployConfiguration"; -const char DC_KEY_PREFIX[] = "ProjectExplorer.Target.DeployConfiguration."; -const char DC_COUNT_KEY[] = "ProjectExplorer.Target.DeployConfigurationCount"; - const char ACTIVE_RC_KEY[] = "ProjectExplorer.Target.ActiveRunConfiguration"; const char RC_KEY_PREFIX[] = "ProjectExplorer.Target.RunConfiguration."; const char RC_COUNT_KEY[] = "ProjectExplorer.Target.RunConfigurationCount"; const char PLUGIN_SETTINGS_KEY[] = "ProjectExplorer.Target.PluginSettings"; +const char HAS_PER_BC_DCS[] = "HasPerBcDcs"; + static QString formatDeviceInfo(const ProjectExplorer::IDevice::DeviceInfo &input) { const QStringList lines @@ -75,7 +69,6 @@ public: TargetPrivate(Target *t, Kit *k) : m_kit(k), m_buildConfigurationModel(t), - m_deployConfigurationModel(t), m_runConfigurationModel(t) { } @@ -83,8 +76,6 @@ public: QList m_buildConfigurations; QPointer m_activeBuildConfiguration; - QList m_deployConfigurations; - DeployConfiguration *m_activeDeployConfiguration = nullptr; QList m_runConfigurations; RunConfiguration* m_activeRunConfiguration = nullptr; Store m_pluginSettings; @@ -93,7 +84,6 @@ public: MacroExpander m_macroExpander; ProjectConfigurationModel m_buildConfigurationModel; - ProjectConfigurationModel m_deployConfigurationModel; ProjectConfigurationModel m_runConfigurationModel; bool m_shuttingDown = false; @@ -144,7 +134,6 @@ Target::Target(Project *project, Kit *k, _constructor_tag) : Target::~Target() { qDeleteAll(d->m_buildConfigurations); - qDeleteAll(d->m_deployConfigurations); qDeleteAll(d->m_runConfigurations); } @@ -254,38 +243,26 @@ void Target::setActiveBuildConfiguration(BuildConfiguration *bc, SetActive casca } } -void Target::setActiveDeployConfiguration(DeployConfiguration *dc, SetActive cascade) +void Target::setActiveDeployConfiguration(DeployConfiguration *dc) { - QTC_ASSERT(project(), return); - - if (project()->isShuttingDown() || isShuttingDown()) - return; - - setActiveDeployConfiguration(dc); - - if (!dc) - return; - if (cascade != SetActive::Cascade || !ProjectManager::isProjectConfigurationCascading()) - return; - - Id kitId = kit()->id(); - QString name = dc->displayName(); // We match on displayname - for (Project *otherProject : ProjectManager::projects()) { - if (otherProject == project()) - continue; - Target *otherTarget = otherProject->activeTarget(); - if (!otherTarget || otherTarget->kit()->id() != kitId) - continue; - - for (DeployConfiguration *otherDc : otherTarget->deployConfigurations()) { - if (otherDc->displayName() == name) { - otherTarget->setActiveDeployConfiguration(otherDc); - break; - } + for (BuildConfiguration * const bc : std::as_const(d->m_buildConfigurations)) { + if (bc->deployConfigurations().contains(dc)) { + bc->setActiveDeployConfiguration(dc); + if (bc != d->m_activeBuildConfiguration) + setActiveBuildConfiguration(bc, SetActive::NoCascade); + return; } } } +QList Target::deployConfigurations() const +{ + QList dcs; + for (BuildConfiguration * const bc : std::as_const(d->m_buildConfigurations)) + dcs << bc->deployConfigurations(); + return dcs; +} + Utils::Id Target::id() const { return d->m_kit->id(); @@ -327,6 +304,8 @@ void Target::addBuildConfiguration(BuildConfiguration *bc) bc->setDisplayName(configurationDisplayName); } + bc->updateDefaultDeployConfigurations(); + // add it d->m_buildConfigurations.push_back(bc); @@ -374,6 +353,12 @@ BuildConfiguration *Target::activeBuildConfiguration() const return d->m_activeBuildConfiguration; } +DeployConfiguration *Target::activeDeployConfiguration() const +{ + QTC_ASSERT(activeBuildConfiguration(), return nullptr); + return activeBuildConfiguration()->activeDeployConfiguration(); +} + void Target::setActiveBuildConfiguration(BuildConfiguration *bc) { if ((!bc && d->m_buildConfigurations.isEmpty()) || @@ -385,80 +370,6 @@ void Target::setActiveBuildConfiguration(BuildConfiguration *bc) } } -void Target::addDeployConfiguration(DeployConfiguration *dc) -{ - QTC_ASSERT(dc && !d->m_deployConfigurations.contains(dc), return); - Q_ASSERT(dc->target() == this); - - // Check that we don't have a configuration with the same displayName - QString configurationDisplayName = dc->displayName(); - QStringList displayNames = Utils::transform(d->m_deployConfigurations, &DeployConfiguration::displayName); - configurationDisplayName = Utils::makeUniquelyNumbered(configurationDisplayName, displayNames); - dc->setDisplayName(configurationDisplayName); - - // add it - d->m_deployConfigurations.push_back(dc); - - ProjectExplorerPlugin::targetSelector()->addedDeployConfiguration(dc); - d->m_deployConfigurationModel.addProjectConfiguration(dc); - emit addedDeployConfiguration(dc); - - if (!d->m_activeDeployConfiguration) - setActiveDeployConfiguration(dc); - Q_ASSERT(activeDeployConfiguration()); -} - -bool Target::removeDeployConfiguration(DeployConfiguration *dc) -{ - //todo: this might be error prone - if (!d->m_deployConfigurations.contains(dc)) - return false; - - if (BuildManager::isBuilding(dc)) - return false; - - d->m_deployConfigurations.removeOne(dc); - - if (activeDeployConfiguration() == dc) { - if (d->m_deployConfigurations.isEmpty()) - setActiveDeployConfiguration(nullptr, SetActive::Cascade); - else - setActiveDeployConfiguration(d->m_deployConfigurations.at(0), SetActive::Cascade); - } - - ProjectExplorerPlugin::targetSelector()->removedDeployConfiguration(dc); - d->m_deployConfigurationModel.removeProjectConfiguration(dc); - emit removedDeployConfiguration(dc); - - delete dc; - return true; -} - -const QList Target::deployConfigurations() const -{ - return d->m_deployConfigurations; -} - -DeployConfiguration *Target::activeDeployConfiguration() const -{ - return d->m_activeDeployConfiguration; -} - -void Target::setActiveDeployConfiguration(DeployConfiguration *dc) -{ - if (dc) { - QTC_ASSERT(d->m_deployConfigurations.contains(dc), return); - } else { - QTC_ASSERT(d->m_deployConfigurations.isEmpty(), return); - } - if (dc == d->m_activeDeployConfiguration) - return; - - d->m_activeDeployConfiguration = dc; - emit activeDeployConfigurationChanged(d->m_activeDeployConfiguration); - updateDeviceState(); // FIXME: Does not belong here? -} - const QList Target::runConfigurations() const { return d->m_runConfigurations; @@ -592,14 +503,11 @@ Store Target::toMap() const map.insert(numberedKey(BC_KEY_PREFIX, i), variantFromStore(data)); } - const QList dcs = deployConfigurations(); - map.insert(ACTIVE_DC_KEY, dcs.indexOf(d->m_activeDeployConfiguration)); - map.insert(DC_COUNT_KEY, dcs.size()); - for (int i = 0; i < dcs.size(); ++i) { - Store data; - dcs.at(i)->toMap(data); - map.insert(numberedKey(DC_KEY_PREFIX, i), variantFromStore(data)); - } + // Forward compatibility for Qt Creator < 17: Store the active build configuration's + // deploy configurations as the target-global ones. A special tag signifies that + // we should not read these ourselves. + d->m_activeBuildConfiguration->storeConfigurationsToMap(map); + map.insert(HAS_PER_BC_DCS, true); const QList rcs = runConfigurations(); map.insert(ACTIVE_RC_KEY, rcs.indexOf(d->m_activeRunConfiguration)); @@ -631,37 +539,8 @@ void Target::updateDefaultBuildConfigurations() void Target::updateDefaultDeployConfigurations() { - const QList dcFactories = DeployConfigurationFactory::find(this); - if (dcFactories.isEmpty()) { - qWarning("No deployment configuration factory found for target id '%s'.", qPrintable(id().toString())); - return; - } - - QList dcIds; - for (const DeployConfigurationFactory *dcFactory : dcFactories) - dcIds.append(dcFactory->creationId()); - - const QList dcList = deployConfigurations(); - QList toCreate = dcIds; - - for (DeployConfiguration *dc : dcList) { - if (dcIds.contains(dc->id())) - toCreate.removeOne(dc->id()); - else - removeDeployConfiguration(dc); - } - - for (Utils::Id id : std::as_const(toCreate)) { - for (DeployConfigurationFactory *dcFactory : dcFactories) { - if (dcFactory->creationId() == id) { - DeployConfiguration *dc = dcFactory->create(this); - if (dc) { - QTC_CHECK(dc->id() == id); - addDeployConfiguration(dc); - } - } - } - } + for (BuildConfiguration * const bc : std::as_const(d->m_buildConfigurations)) + bc->updateDefaultDeployConfigurations(); } void Target::updateDefaultRunConfigurations() @@ -828,11 +707,6 @@ ProjectConfigurationModel *Target::buildConfigurationModel() const return &d->m_buildConfigurationModel; } -ProjectConfigurationModel *Target::deployConfigurationModel() const -{ - return &d->m_deployConfigurationModel; -} - ProjectConfigurationModel *Target::runConfigurationModel() const { return &d->m_runConfigurationModel; @@ -897,6 +771,7 @@ bool Target::addConfigurationsFromMap(const Utils::Store &map, bool setActiveCon if (!setActiveConfigurations) activeConfiguration = -1; + const bool hasDeployConfigsPerBuildConfig = map.value(HAS_PER_BC_DCS).toBool(); for (int i = 0; i < bcCount; ++i) { const Key key = numberedKey(BC_KEY_PREFIX, i); if (!map.contains(key)) @@ -908,38 +783,19 @@ bool Target::addConfigurationsFromMap(const Utils::Store &map, bool setActiveCon continue; } QTC_CHECK(bc->id() == ProjectExplorer::idFromMap(valueMap)); + + // Pre-17 backward compatibility: Give each build config the formerly target-global deploy + // configurations. + if (!hasDeployConfigsPerBuildConfig) { + if (!bc->addConfigurationsFromMap(map, true)) + return false; + } + addBuildConfiguration(bc); if (i == activeConfiguration) setActiveBuildConfiguration(bc); } - int dcCount = map.value(DC_COUNT_KEY, 0).toInt(&ok); - if (!ok || dcCount < 0) - dcCount = 0; - activeConfiguration = map.value(ACTIVE_DC_KEY, 0).toInt(&ok); - if (!ok || 0 > activeConfiguration || dcCount < activeConfiguration) - activeConfiguration = 0; - if (!setActiveConfigurations) - activeConfiguration = -1; - - for (int i = 0; i < dcCount; ++i) { - const Key key = numberedKey(DC_KEY_PREFIX, i); - if (!map.contains(key)) - return false; - Store valueMap = storeFromVariant(map.value(key)); - DeployConfiguration *dc = DeployConfigurationFactory::restore(this, valueMap); - if (!dc) { - Utils::Id id = idFromMap(valueMap); - qWarning("No factory found to restore deployment configuration of id '%s'!", - id.isValid() ? qPrintable(id.toString()) : "UNKNOWN"); - continue; - } - QTC_CHECK(dc->id() == ProjectExplorer::idFromMap(valueMap)); - addDeployConfiguration(dc); - if (i == activeConfiguration) - setActiveDeployConfiguration(dc); - } - int rcCount = map.value(RC_COUNT_KEY, 0).toInt(&ok); if (!ok || rcCount < 0) rcCount = 0; diff --git a/src/plugins/projectexplorer/target.h b/src/plugins/projectexplorer/target.h index 2f3102d76b6..3d66370da1b 100644 --- a/src/plugins/projectexplorer/target.h +++ b/src/plugins/projectexplorer/target.h @@ -64,12 +64,6 @@ public: const QList buildConfigurations() const; BuildConfiguration *activeBuildConfiguration() const; - - // DeployConfiguration - void addDeployConfiguration(DeployConfiguration *dc); - bool removeDeployConfiguration(DeployConfiguration *dc); - - const QList deployConfigurations() const; DeployConfiguration *activeDeployConfiguration() const; // Running @@ -100,7 +94,6 @@ public: Utils::MacroExpander *macroExpander() const; ProjectConfigurationModel *buildConfigurationModel() const; - ProjectConfigurationModel *deployConfigurationModel() const; ProjectConfigurationModel *runConfigurationModel() const; DeploymentData deploymentData() const; @@ -110,7 +103,10 @@ public: QString activeBuildKey() const; // Build key of active run configuaration void setActiveBuildConfiguration(BuildConfiguration *bc, SetActive cascade); - void setActiveDeployConfiguration(DeployConfiguration *dc, SetActive cascade); + + // Do not use, only for QtAM. + void setActiveDeployConfiguration(DeployConfiguration *dc); + QList deployConfigurations() const; signals: void targetEnabled(bool); @@ -153,7 +149,6 @@ private: void handleKitRemoval(ProjectExplorer::Kit *k); void setActiveBuildConfiguration(BuildConfiguration *configuration); - void setActiveDeployConfiguration(DeployConfiguration *configuration); const std::unique_ptr d; friend class Project; diff --git a/src/plugins/qtapplicationmanager/appmanagercmakepackagestep.cpp b/src/plugins/qtapplicationmanager/appmanagercmakepackagestep.cpp index 18d2f476761..e7caa20a36c 100644 --- a/src/plugins/qtapplicationmanager/appmanagercmakepackagestep.cpp +++ b/src/plugins/qtapplicationmanager/appmanagercmakepackagestep.cpp @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include @@ -31,7 +31,7 @@ public: setExtraInit([] (BuildStep *step) { // We update the build targets when the active run configuration changes const auto updaterSlot = [step] { - const TargetInformation targetInformation(step->target()); + const TargetInformation targetInformation(step->buildConfiguration()); step->setBuildTargets({targetInformation.cmakeBuildTarget}); step->setStepEnabled(!targetInformation.isBuiltin); }; diff --git a/src/plugins/qtapplicationmanager/appmanagerdeployconfigurationautoswitcher.cpp b/src/plugins/qtapplicationmanager/appmanagerdeployconfigurationautoswitcher.cpp index c6321c2a6da..2ab0c640ec2 100644 --- a/src/plugins/qtapplicationmanager/appmanagerdeployconfigurationautoswitcher.cpp +++ b/src/plugins/qtapplicationmanager/appmanagerdeployconfigurationautoswitcher.cpp @@ -80,7 +80,7 @@ void AppManagerDeployConfigurationAutoSwitcher::onActiveRunConfigurationChanged( if (stored) { // deploy selection stored -> restore auto deployConfiguration = m_deployConfigurationsUsageHistory.value(runConfiguration, nullptr); - target->setActiveDeployConfiguration(deployConfiguration, SetActive::NoCascade); + target->setActiveDeployConfiguration(deployConfiguration); } else if (auto activeDeployConfiguration = target->activeDeployConfiguration()) { // active deploy configuration exists if (isApplicationManagerRunConfiguration(runConfiguration)) { @@ -91,7 +91,7 @@ void AppManagerDeployConfigurationAutoSwitcher::onActiveRunConfigurationChanged( // find AM deploy configuration if (isApplicationManagerDeployConfiguration(deployConfiguration)) { // make it active - target->setActiveDeployConfiguration(deployConfiguration, SetActive::NoCascade); + target->setActiveDeployConfiguration(deployConfiguration); break; } } @@ -104,7 +104,7 @@ void AppManagerDeployConfigurationAutoSwitcher::onActiveRunConfigurationChanged( // find not AM deploy configuration if (!isApplicationManagerDeployConfiguration(deployConfiguration)) { // make it active - target->setActiveDeployConfiguration(deployConfiguration, SetActive::NoCascade); + target->setActiveDeployConfiguration(deployConfiguration); break; } } diff --git a/src/plugins/qtapplicationmanager/appmanagerdeploypackagestep.cpp b/src/plugins/qtapplicationmanager/appmanagerdeploypackagestep.cpp index 242b9ccd36f..abf2e99ad4b 100644 --- a/src/plugins/qtapplicationmanager/appmanagerdeploypackagestep.cpp +++ b/src/plugins/qtapplicationmanager/appmanagerdeploypackagestep.cpp @@ -51,7 +51,7 @@ public: if (customizeStep.value()) return; - const TargetInformation targetInformation(target()); + const TargetInformation targetInformation(buildConfiguration()); packageFilePath.setValue(targetInformation.packageFilePath); packageFilePath.setDefaultValue(packageFilePath.value()); @@ -75,7 +75,7 @@ public: private: bool init() final { - return TargetInformation(target()).isValid(); + return TargetInformation(buildConfiguration()).isValid(); } GroupItem runRecipe() final diff --git a/src/plugins/qtapplicationmanager/appmanagerinstallpackagestep.cpp b/src/plugins/qtapplicationmanager/appmanagerinstallpackagestep.cpp index 891e08d4ccd..9163815d29a 100644 --- a/src/plugins/qtapplicationmanager/appmanagerinstallpackagestep.cpp +++ b/src/plugins/qtapplicationmanager/appmanagerinstallpackagestep.cpp @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -72,7 +71,7 @@ AppManagerInstallPackageStep::AppManagerInstallPackageStep(BuildStepList *bsl, I if (customizeStep.value()) return; - const TargetInformation targetInformation(target()); + const TargetInformation targetInformation(buildConfiguration()); IDeviceConstPtr device = RunDeviceKitAspect::device(kit()); if (device && device->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) { @@ -97,7 +96,7 @@ AppManagerInstallPackageStep::AppManagerInstallPackageStep(BuildStepList *bsl, I GroupItem AppManagerInstallPackageStep::deployRecipe() { - const TargetInformation targetInformation(target()); + const TargetInformation targetInformation(buildConfiguration()); const FilePath controllerPath = controller().isEmpty() ? FilePath::fromString(controller.defaultValue()) : diff --git a/src/plugins/qtapplicationmanager/appmanagerrunconfiguration.cpp b/src/plugins/qtapplicationmanager/appmanagerrunconfiguration.cpp index edb97c0186e..f754becace7 100644 --- a/src/plugins/qtapplicationmanager/appmanagerrunconfiguration.cpp +++ b/src/plugins/qtapplicationmanager/appmanagerrunconfiguration.cpp @@ -36,7 +36,8 @@ public: setDefaultDisplayName(Tr::tr("Run an Application Manager Package")); setUpdater([this, target] { - QList tis = TargetInformation::readFromProject(target, buildKey()); + QList tis + = TargetInformation::readFromProject(target->activeBuildConfiguration(), buildKey()); if (tis.isEmpty()) return; const TargetInformation targetInformation = tis.at(0); @@ -87,7 +88,8 @@ public: virtual bool supportsBuildKey(Target *target, const QString &key) const final { - QList tis = TargetInformation::readFromProject(target, key); + QList tis + = TargetInformation::readFromProject(target->activeBuildConfiguration(), key); return !tis.isEmpty(); } @@ -103,7 +105,7 @@ public: target->project(), &Project::displayNameChanged, Qt::UniqueConnection); - const auto buildTargets = TargetInformation::readFromProject(target); + const auto buildTargets = TargetInformation::readFromProject(target->activeBuildConfiguration()); const auto filteredTargets = Utils::filtered(buildTargets, [this, target](const TargetInformation &ti) { return filterTarget(target, ti); }); diff --git a/src/plugins/qtapplicationmanager/appmanagerruncontrol.cpp b/src/plugins/qtapplicationmanager/appmanagerruncontrol.cpp index 39fa791f2b8..e5e90e9b745 100644 --- a/src/plugins/qtapplicationmanager/appmanagerruncontrol.cpp +++ b/src/plugins/qtapplicationmanager/appmanagerruncontrol.cpp @@ -13,7 +13,6 @@ #include #include -#include #include @@ -28,13 +27,12 @@ #include #include #include -#include #include #include +#include #include -#include using namespace ProjectExplorer; using namespace Utils; @@ -126,7 +124,7 @@ private: { Target *target = runControl()->target(); - const Internal::TargetInformation targetInformation(target); + const Internal::TargetInformation targetInformation(target->activeBuildConfiguration()); if (!targetInformation.isValid()) { reportFailure(Tr::tr("Cannot debug: Invalid target information.")); return; diff --git a/src/plugins/qtapplicationmanager/appmanagertargetinformation.cpp b/src/plugins/qtapplicationmanager/appmanagertargetinformation.cpp index 166a0ddd2cc..603d8a0c149 100644 --- a/src/plugins/qtapplicationmanager/appmanagertargetinformation.cpp +++ b/src/plugins/qtapplicationmanager/appmanagertargetinformation.cpp @@ -7,36 +7,34 @@ #include "appmanagerconstants.h" +#include +#include #include -#include +#include #include #include #include #include -#include - -#include - -#include - #include using namespace ProjectExplorer; -using namespace QmakeProjectManager; -using namespace QtSupport; using namespace Utils; namespace AppManager { namespace Internal { -QList TargetInformation::readFromProject(const Target *target , const QString &buildKey) +QList TargetInformation::readFromProject( + const BuildConfiguration *bc, const QString &buildKey) { + if (!bc) + return {}; + QList result; - if (!target->project()->rootProjectNode()) + if (!bc->project()->rootProjectNode()) return result; - QVariantList packageTargets = target->project()->extraData(AppManager::Constants::APPMAN_PACKAGE_TARGETS).toList(); + QVariantList packageTargets = bc->project()->extraData(AppManager::Constants::APPMAN_PACKAGE_TARGETS).toList(); // qDebug() << "APPMAN TARGETS" << packageTargets; for (const auto &packageTarget : packageTargets) { @@ -100,17 +98,17 @@ QList TargetInformation::readFromProject(const Target *target return result; } -TargetInformation::TargetInformation(const Target *target) +TargetInformation::TargetInformation(const BuildConfiguration *bc) { - if (!target) + if (!bc) return; - if (target->buildSystem() && target->buildSystem()->isParsing()) + if (bc->buildSystem()->isParsing()) return; - auto project = target->project(); + auto project = bc->project(); if (!project) return; - const RunConfiguration *rc = target->activeRunConfiguration(); + const RunConfiguration *rc = bc->target()->activeRunConfiguration(); if (!rc) return; if (rc->id() != Constants::RUNCONFIGURATION_ID && @@ -121,7 +119,7 @@ TargetInformation::TargetInformation(const Target *target) if (buildKey.isEmpty()) return; - const auto targetInfoList = TargetInformation::readFromProject(target, buildKey); + const auto targetInfoList = TargetInformation::readFromProject(bc, buildKey); if (targetInfoList.isEmpty()) return; diff --git a/src/plugins/qtapplicationmanager/appmanagertargetinformation.h b/src/plugins/qtapplicationmanager/appmanagertargetinformation.h index a20c5076b82..00e46590cf9 100644 --- a/src/plugins/qtapplicationmanager/appmanagertargetinformation.h +++ b/src/plugins/qtapplicationmanager/appmanagertargetinformation.h @@ -8,7 +8,7 @@ #include #include -#include +namespace ProjectExplorer { class BuildConfiguration; } namespace AppManager { namespace Internal { @@ -44,9 +44,10 @@ public: bool isValid() const; TargetInformation() = default; - TargetInformation(const ProjectExplorer::Target *target); + TargetInformation(const ProjectExplorer::BuildConfiguration *bc); - static QList readFromProject(const ProjectExplorer::Target *target, const QString &buildKey = QString()); + static QList readFromProject( + const ProjectExplorer::BuildConfiguration *bc, const QString &buildKey = QString()); }; } // namespace Internal