From 0d4fdd291ab85183c937223a0b33e901023ea448 Mon Sep 17 00:00:00 2001
From: dt <qtc-committer@nokia.com>
Date: Tue, 16 Mar 2010 14:36:59 +0100
Subject: [PATCH] Use a type enum instead of duplicating functions between
 build and clean

That is e.g. buildSteps() and cleanSteps() --> steps(type)
---
 .../cmakebuildconfiguration.cpp               |   4 +-
 .../cmakeprojectmanager/cmakeproject.cpp      |   3 +-
 .../cmakeprojectmanager/cmaketarget.cpp       |   5 +-
 src/plugins/cmakeprojectmanager/makestep.cpp  |  26 +++--
 src/plugins/cmakeprojectmanager/makestep.h    |  16 +--
 .../genericbuildconfiguration.cpp             |   2 +-
 .../genericprojectmanager/genericmakestep.cpp |  24 ++--
 .../genericprojectmanager/genericmakestep.h   |  12 +-
 .../genericprojectmanager/generictarget.cpp   |   2 +-
 .../projectexplorer/buildconfiguration.cpp    | 108 +++++++-----------
 .../projectexplorer/buildconfiguration.h      |  16 +--
 src/plugins/projectexplorer/buildmanager.cpp  |   4 +-
 .../buildsettingspropertiespage.cpp           |   4 +-
 src/plugins/projectexplorer/buildstep.h       |  19 +--
 .../projectexplorer/buildstepspage.cpp        |  30 ++---
 src/plugins/projectexplorer/buildstepspage.h  |   5 +-
 src/plugins/projectexplorer/processstep.cpp   |  28 ++---
 src/plugins/projectexplorer/processstep.h     |  14 +--
 src/plugins/projectexplorer/projectwindow.cpp |   1 -
 src/plugins/qt4projectmanager/makestep.cpp    |  26 +++--
 src/plugins/qt4projectmanager/makestep.h      |  16 +--
 src/plugins/qt4projectmanager/qmakestep.cpp   |  33 +++---
 src/plugins/qt4projectmanager/qmakestep.h     |  14 +--
 .../qt4buildconfiguration.cpp                 |   4 +-
 src/plugins/qt4projectmanager/qt4target.cpp   |   6 +-
 25 files changed, 214 insertions(+), 208 deletions(-)

diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
index 9127252b083..6e006053c41 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
@@ -213,10 +213,10 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer:
     bc->setDisplayName(buildConfigurationName);
 
     MakeStep *makeStep = new MakeStep(bc);
-    bc->insertBuildStep(0, makeStep);
+    bc->insertStep(ProjectExplorer::Build, 0, makeStep);
 
     MakeStep *cleanMakeStep = new MakeStep(bc);
-    bc->insertCleanStep(0, cleanMakeStep);
+    bc->insertStep(ProjectExplorer::Clean, 0, cleanMakeStep);
     cleanMakeStep->setAdditionalArguments(QStringList() << "clean");
     cleanMakeStep->setClean(true);
 
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index cb6ab490440..b4304bb60a0 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -523,7 +523,8 @@ bool CMakeProject::fromMap(const QVariantMap &map)
         return false;
 
     if (!hasUserFile && hasBuildTarget("all")) {
-        MakeStep *makeStep(qobject_cast<MakeStep *>(activeTarget()->activeBuildConfiguration()->buildSteps().at(0)));
+        MakeStep *makeStep = qobject_cast<MakeStep *>(
+                activeTarget()->activeBuildConfiguration()->steps(ProjectExplorer::Build).at(0));
         Q_ASSERT(makeStep);
         makeStep->setBuildTarget("all", true);
     }
diff --git a/src/plugins/cmakeprojectmanager/cmaketarget.cpp b/src/plugins/cmakeprojectmanager/cmaketarget.cpp
index c38ccd15d43..a96cedf5033 100644
--- a/src/plugins/cmakeprojectmanager/cmaketarget.cpp
+++ b/src/plugins/cmakeprojectmanager/cmaketarget.cpp
@@ -32,6 +32,7 @@
 #include "cmakeopenprojectwizard.h"
 #include "cmakeproject.h"
 #include "cmakerunconfiguration.h"
+#include "cmakebuildconfiguration.h"
 
 #include <QtGui/QApplication>
 #include <QtGui/QStyle>
@@ -168,10 +169,10 @@ CMakeTarget *CMakeTargetFactory::create(ProjectExplorer::Project *parent, const
     bc->setDisplayName("all");
 
     // Now create a standard build configuration
-    bc->insertBuildStep(0, new MakeStep(bc));
+    bc->insertStep(ProjectExplorer::Build, 0, new MakeStep(bc));
 
     MakeStep *cleanMakeStep = new MakeStep(bc);
-    bc->insertCleanStep(0, cleanMakeStep);
+    bc->insertStep(ProjectExplorer::Clean, 0, cleanMakeStep);
     cleanMakeStep->setAdditionalArguments(QStringList() << "clean");
     cleanMakeStep->setClean(true);
 
diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp
index e5d303f7225..48b78b6be44 100644
--- a/src/plugins/cmakeprojectmanager/makestep.cpp
+++ b/src/plugins/cmakeprojectmanager/makestep.cpp
@@ -317,41 +317,42 @@ MakeStepFactory::~MakeStepFactory()
 {
 }
 
-bool MakeStepFactory::canCreate(BuildConfiguration *parent, const QString &id) const
+bool MakeStepFactory::canCreate(BuildConfiguration *parent, ProjectExplorer::StepType type, const QString &id) const
 {
+    Q_UNUSED(type)
     if (!qobject_cast<CMakeBuildConfiguration *>(parent))
         return false;
     return QLatin1String(MS_ID) == id;
 }
 
-BuildStep *MakeStepFactory::create(BuildConfiguration *parent, const QString &id)
+BuildStep *MakeStepFactory::create(BuildConfiguration *parent, ProjectExplorer::StepType type, const QString &id)
 {
-    if (!canCreate(parent, id))
+    if (!canCreate(parent, type, id))
         return 0;
     return new MakeStep(parent);
 }
 
-bool MakeStepFactory::canClone(BuildConfiguration *parent, BuildStep *source) const
+bool MakeStepFactory::canClone(BuildConfiguration *parent, ProjectExplorer::StepType type, BuildStep *source) const
 {
-    return canCreate(parent, source->id());
+    return canCreate(parent, type, source->id());
 }
 
-BuildStep *MakeStepFactory::clone(BuildConfiguration *parent, BuildStep *source)
+BuildStep *MakeStepFactory::clone(BuildConfiguration *parent, ProjectExplorer::StepType type, BuildStep *source)
 {
-    if (!canClone(parent, source))
+    if (!canClone(parent, type, source))
         return 0;
     return new MakeStep(parent, static_cast<MakeStep *>(source));
 }
 
-bool MakeStepFactory::canRestore(BuildConfiguration *parent, const QVariantMap &map) const
+bool MakeStepFactory::canRestore(BuildConfiguration *parent, ProjectExplorer::StepType type, const QVariantMap &map) const
 {
     QString id(ProjectExplorer::idFromMap(map));
-    return canCreate(parent, id);
+    return canCreate(parent, type, id);
 }
 
-BuildStep *MakeStepFactory::restore(BuildConfiguration *parent, const QVariantMap &map)
+BuildStep *MakeStepFactory::restore(BuildConfiguration *parent, ProjectExplorer::StepType type, const QVariantMap &map)
 {
-    if (!canRestore(parent, map))
+    if (!canRestore(parent, type, map))
         return 0;
     MakeStep *bs(new MakeStep(parent));
     if (bs->fromMap(map))
@@ -360,8 +361,9 @@ BuildStep *MakeStepFactory::restore(BuildConfiguration *parent, const QVariantMa
     return 0;
 }
 
-QStringList MakeStepFactory::availableCreationIds(ProjectExplorer::BuildConfiguration *parent) const
+QStringList MakeStepFactory::availableCreationIds(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type) const
 {
+    Q_UNUSED(type)
     if (!qobject_cast<CMakeBuildConfiguration *>(parent))
         return QStringList();
     return QStringList() << QLatin1String(MS_ID);
diff --git a/src/plugins/cmakeprojectmanager/makestep.h b/src/plugins/cmakeprojectmanager/makestep.h
index ede5bb4035a..102b73ca604 100644
--- a/src/plugins/cmakeprojectmanager/makestep.h
+++ b/src/plugins/cmakeprojectmanager/makestep.h
@@ -119,14 +119,14 @@ public:
     explicit MakeStepFactory(QObject *parent = 0);
     virtual ~MakeStepFactory();
 
-    virtual bool canCreate(ProjectExplorer::BuildConfiguration *parent, const QString &id) const;
-    virtual ProjectExplorer::BuildStep *create(ProjectExplorer::BuildConfiguration *parent, const QString &id);
-    virtual bool canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep *source) const;
-    virtual ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep *source);
-    virtual bool canRestore(ProjectExplorer::BuildConfiguration *parent, const QVariantMap &map) const;
-    virtual ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildConfiguration *parent, const QVariantMap &map);
-
-    virtual QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *bc) const;
+    virtual bool canCreate(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, const QString &id) const;
+    virtual ProjectExplorer::BuildStep *create(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, const QString &id);
+    virtual bool canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, ProjectExplorer::BuildStep *source) const;
+    virtual ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, ProjectExplorer::BuildStep *source);
+    virtual bool canRestore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, const QVariantMap &map) const;
+    virtual ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, const QVariantMap &map);
+
+    virtual QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *bc, ProjectExplorer::StepType type) const;
     virtual QString displayNameForId(const QString &id) const;
 };
 
diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
index 970fd66fed4..b35000b40e4 100644
--- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
+++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
@@ -175,7 +175,7 @@ BuildConfiguration *GenericBuildConfigurationFactory::create(ProjectExplorer::Ta
     bc->setDisplayName(buildConfigurationName);
 
     GenericMakeStep *makeStep = new GenericMakeStep(bc);
-    bc->insertBuildStep(0, makeStep);
+    bc->insertStep(ProjectExplorer::Build, 0, makeStep);
     makeStep->setBuildTarget("all", /* on = */ true);
 
     target->addBuildConfiguration(bc); // also makes the name unique...
diff --git a/src/plugins/genericprojectmanager/genericmakestep.cpp b/src/plugins/genericprojectmanager/genericmakestep.cpp
index 292469119cb..655717bfb83 100644
--- a/src/plugins/genericprojectmanager/genericmakestep.cpp
+++ b/src/plugins/genericprojectmanager/genericmakestep.cpp
@@ -307,32 +307,38 @@ GenericMakeStepFactory::~GenericMakeStepFactory()
 {
 }
 
-bool GenericMakeStepFactory::canCreate(ProjectExplorer::BuildConfiguration *parent, const QString &id) const
+bool GenericMakeStepFactory::canCreate(ProjectExplorer::BuildConfiguration *parent,
+                                       ProjectExplorer::StepType type,
+                                       const QString &id) const
 {
+    Q_UNUSED(type)
     if (!qobject_cast<GenericBuildConfiguration *>(parent))
         return false;
     return id == QLatin1String(GENERIC_MS_ID);
 }
 
 ProjectExplorer::BuildStep *GenericMakeStepFactory::create(ProjectExplorer::BuildConfiguration *parent,
+                                                           ProjectExplorer::StepType type,
                                                            const QString &id)
 {
-    if (!canCreate(parent, id))
+    if (!canCreate(parent, type, id))
         return 0;
     return new GenericMakeStep(parent);
 }
 
 bool GenericMakeStepFactory::canClone(ProjectExplorer::BuildConfiguration *parent,
+                                      ProjectExplorer::StepType type,
                                       ProjectExplorer::BuildStep *source) const
 {
     const QString id(source->id());
-    return canCreate(parent, id);
+    return canCreate(parent, type, id);
 }
 
 ProjectExplorer::BuildStep *GenericMakeStepFactory::clone(ProjectExplorer::BuildConfiguration *parent,
+                                                          ProjectExplorer::StepType type,
                                                           ProjectExplorer::BuildStep *source)
 {
-    if (!canClone(parent, source))
+    if (!canClone(parent, type, source))
         return 0;
     GenericMakeStep *old(qobject_cast<GenericMakeStep *>(source));
     Q_ASSERT(old);
@@ -340,16 +346,18 @@ ProjectExplorer::BuildStep *GenericMakeStepFactory::clone(ProjectExplorer::Build
 }
 
 bool GenericMakeStepFactory::canRestore(ProjectExplorer::BuildConfiguration *parent,
+                                        ProjectExplorer::StepType type,
                                         const QVariantMap &map) const
 {
     QString id(ProjectExplorer::idFromMap(map));
-    return canCreate(parent, id);
+    return canCreate(parent, type, id);
 }
 
 ProjectExplorer::BuildStep *GenericMakeStepFactory::restore(ProjectExplorer::BuildConfiguration *parent,
+                                                            ProjectExplorer::StepType type,
                                                             const QVariantMap &map)
 {
-    if (!canRestore(parent, map))
+    if (!canRestore(parent, type, map))
         return 0;
     GenericMakeStep *bs(new GenericMakeStep(parent));
     if (bs->fromMap(map))
@@ -358,8 +366,10 @@ ProjectExplorer::BuildStep *GenericMakeStepFactory::restore(ProjectExplorer::Bui
     return 0;
 }
 
-QStringList GenericMakeStepFactory::availableCreationIds(ProjectExplorer::BuildConfiguration *parent) const
+QStringList GenericMakeStepFactory::availableCreationIds(ProjectExplorer::BuildConfiguration *parent,
+                                                         ProjectExplorer::StepType type) const
 {
+    Q_UNUSED(type)
     if (!qobject_cast<GenericBuildConfiguration *>(parent))
         return QStringList();
     return QStringList() << QLatin1String(GENERIC_MS_ID);
diff --git a/src/plugins/genericprojectmanager/genericmakestep.h b/src/plugins/genericprojectmanager/genericmakestep.h
index 8e6edd84c89..fbe22581c21 100644
--- a/src/plugins/genericprojectmanager/genericmakestep.h
+++ b/src/plugins/genericprojectmanager/genericmakestep.h
@@ -113,19 +113,27 @@ public:
     explicit GenericMakeStepFactory(QObject *parent = 0);
     virtual ~GenericMakeStepFactory();
 
-    virtual bool canCreate(ProjectExplorer::BuildConfiguration *parent, const QString &id) const;
+    virtual bool canCreate(ProjectExplorer::BuildConfiguration *parent,
+                           ProjectExplorer::StepType type,
+                           const QString &id) const;
     virtual ProjectExplorer::BuildStep *create(ProjectExplorer::BuildConfiguration *parent,
+                                               ProjectExplorer::StepType type,
                                                const QString &id);
     virtual bool canClone(ProjectExplorer::BuildConfiguration *parent,
+                          ProjectExplorer::StepType type,
                           ProjectExplorer::BuildStep *source) const;
     virtual ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildConfiguration *parent,
+                                              ProjectExplorer::StepType type,
                                               ProjectExplorer::BuildStep *source);
     virtual bool canRestore(ProjectExplorer::BuildConfiguration *parent,
+                            ProjectExplorer::StepType type,
                             const QVariantMap &map) const;
     virtual ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildConfiguration *parent,
+                                                ProjectExplorer::StepType type,
                                                 const QVariantMap &map);
 
-    virtual QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *bc) const;
+    virtual QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *bc,
+                                             ProjectExplorer::StepType type) const;
     virtual QString displayNameForId(const QString &id) const;
 };
 
diff --git a/src/plugins/genericprojectmanager/generictarget.cpp b/src/plugins/genericprojectmanager/generictarget.cpp
index 6d0c9dfe5c9..cabd75cfbea 100644
--- a/src/plugins/genericprojectmanager/generictarget.cpp
+++ b/src/plugins/genericprojectmanager/generictarget.cpp
@@ -137,7 +137,7 @@ GenericTarget *GenericTargetFactory::create(ProjectExplorer::Project *parent, co
     bc->setDisplayName("all");
 
     GenericMakeStep *makeStep = new GenericMakeStep(bc);
-    bc->insertBuildStep(0, makeStep);
+    bc->insertStep(ProjectExplorer::Build, 0, makeStep);
 
     makeStep->setBuildTarget("all", /* on = */ true);
 
diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp
index cb14f384359..62ff6475235 100644
--- a/src/plugins/projectexplorer/buildconfiguration.cpp
+++ b/src/plugins/projectexplorer/buildconfiguration.cpp
@@ -39,20 +39,20 @@ using namespace ProjectExplorer;
 
 namespace {
 
-IBuildStepFactory *findCloneFactory(BuildConfiguration *parent, BuildStep *source)
+IBuildStepFactory *findCloneFactory(BuildConfiguration *parent, StepType type, BuildStep *source)
 {
     QList<IBuildStepFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IBuildStepFactory>();
     foreach(IBuildStepFactory *factory, factories)
-        if (factory->canClone(parent, source))
+        if (factory->canClone(parent, type, source))
             return factory;
     return 0;
 }
 
-IBuildStepFactory *findRestoreFactory(BuildConfiguration *parent, const QVariantMap &map)
+IBuildStepFactory *findRestoreFactory(BuildConfiguration *parent, StepType type, const QVariantMap &map)
 {
     QList<IBuildStepFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IBuildStepFactory>();
     foreach(IBuildStepFactory *factory, factories)
-        if (factory->canRestore(parent, map))
+        if (factory->canRestore(parent, type, map))
             return factory;
     return 0;
 }
@@ -85,19 +85,20 @@ BuildConfiguration::BuildConfiguration(Target *target, BuildConfiguration *sourc
 
 BuildConfiguration::~BuildConfiguration()
 {
-    qDeleteAll(m_buildSteps);
-    qDeleteAll(m_cleanSteps);
+    for (int i = 0; i < LastStepType; ++i) {
+        qDeleteAll(m_steps[i]);
+    }
 }
 
 QVariantMap BuildConfiguration::toMap() const
 {
     QVariantMap map(ProjectConfiguration::toMap());
-    map.insert(QLatin1String(BUILD_STEPS_COUNT_KEY), m_buildSteps.count());
-    for (int i = 0; i < m_buildSteps.count(); ++i)
-        map.insert(QString::fromLatin1(BUILD_STEPS_PREFIX) + QString::number(i), m_buildSteps.at(i)->toMap());
-    map.insert(QLatin1String(CLEAN_STEPS_COUNT_KEY), m_cleanSteps.count());
-    for (int i = 0; i < m_cleanSteps.count(); ++i)
-        map.insert(QString::fromLatin1(CLEAN_STEPS_PREFIX) + QString::number(i), m_cleanSteps.at(i)->toMap());
+    map.insert(QLatin1String(BUILD_STEPS_COUNT_KEY), m_steps[Build].count());
+    for (int i = 0; i < m_steps[Build].count(); ++i)
+        map.insert(QString::fromLatin1(BUILD_STEPS_PREFIX) + QString::number(i), m_steps[Build].at(i)->toMap());
+    map.insert(QLatin1String(CLEAN_STEPS_COUNT_KEY), m_steps[Clean].count());
+    for (int i = 0; i < m_steps[Clean].count(); ++i)
+        map.insert(QString::fromLatin1(CLEAN_STEPS_PREFIX) + QString::number(i), m_steps[Clean].at(i)->toMap());
     map.insert(QLatin1String(CLEAR_SYSTEM_ENVIRONMENT_KEY), m_clearSystemEnvironment);
     map.insert(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY), EnvironmentItem::toStringList(m_userEnvironmentChanges));
 
@@ -107,21 +108,15 @@ QVariantMap BuildConfiguration::toMap() const
 void BuildConfiguration::cloneSteps(BuildConfiguration *source)
 {
     Q_ASSERT(source);
-    foreach (BuildStep *originalbs, source->buildSteps()) {
-        IBuildStepFactory *factory(findCloneFactory(this, originalbs));
-        if (!factory)
-            continue;
-        BuildStep *clonebs(factory->clone(this, originalbs));
-        if (clonebs)
-            m_buildSteps.append(clonebs);
-    }
-    foreach (BuildStep *originalcs, source->cleanSteps()) {
-        IBuildStepFactory *factory = findCloneFactory(this, originalcs);
-        if (!factory)
-            continue;
-        BuildStep *clonecs = factory->clone(this, originalcs);
-        if (clonecs)
-            m_cleanSteps.append(clonecs);
+    for (int i = 0; i < LastStepType; ++i) {
+        foreach (BuildStep *originalbs, source->steps(StepType(i))) {
+            IBuildStepFactory *factory(findCloneFactory(this, StepType(i), originalbs));
+            if (!factory)
+                continue;
+            BuildStep *clonebs(factory->clone(this, StepType(i), originalbs));
+            if (clonebs)
+                m_steps[i].append(clonebs);
+        }
     }
 }
 
@@ -139,17 +134,17 @@ bool BuildConfiguration::fromMap(const QVariantMap &map)
             qWarning() << "No buildstep data found (continuing).";
             continue;
         }
-        IBuildStepFactory *factory(findRestoreFactory(this, bsData));
+        IBuildStepFactory *factory(findRestoreFactory(this, Build, bsData));
         if (!factory) {
             qWarning() << "No factory for buildstep found (continuing).";
             continue;
         }
-        BuildStep *bs(factory->restore(this, bsData));
+        BuildStep *bs(factory->restore(this, Build, bsData));
         if (!bs) {
             qWarning() << "Restoration of buildstep failed (continuing).";
             continue;
         }
-        insertBuildStep(m_buildSteps.count(), bs);
+        insertStep(Build, m_steps[Build].count(), bs);
     }
 
     maxI = map.value(QLatin1String(CLEAN_STEPS_COUNT_KEY), 0).toInt();
@@ -161,17 +156,17 @@ bool BuildConfiguration::fromMap(const QVariantMap &map)
             qWarning() << "No cleanstep data found for (continuing).";
             continue;
         }
-        IBuildStepFactory *factory(findRestoreFactory(this, bsData));
+        IBuildStepFactory *factory(findRestoreFactory(this, Clean, bsData));
         if (!factory) {
             qWarning() << "No factory for cleanstep found (continuing).";
             continue;
         }
-        BuildStep *bs(factory->restore(this, bsData));
+        BuildStep *bs(factory->restore(this, Clean, bsData));
         if (!bs) {
             qWarning() << "Restoration of cleanstep failed (continuing).";
             continue;
         }
-        insertCleanStep(m_cleanSteps.count(), bs);
+        insertStep(Clean, m_steps[Clean].count(), bs);
     }
 
     m_clearSystemEnvironment = map.value(QLatin1String(CLEAR_SYSTEM_ENVIRONMENT_KEY)).toBool();
@@ -180,51 +175,32 @@ bool BuildConfiguration::fromMap(const QVariantMap &map)
     return true;
 }
 
-QList<BuildStep *> BuildConfiguration::buildSteps() const
+QList<BuildStep *> BuildConfiguration::steps(StepType type) const
 {
-    return m_buildSteps;
+    Q_ASSERT(type >= 0 && type < LastStepType);
+    return m_steps[type];
 }
 
-void BuildConfiguration::insertBuildStep(int position, BuildStep *step)
+void BuildConfiguration::insertStep(StepType type, int position, BuildStep *step)
 {
-    m_buildSteps.insert(position, step);
+    Q_ASSERT(type >= 0 && type < LastStepType);
+    m_steps[type].insert(position, step);
 }
 
-void BuildConfiguration::removeBuildStep(int position)
+void BuildConfiguration::removeStep(StepType type, int position)
 {
-    delete m_buildSteps.at(position);
-    m_buildSteps.removeAt(position);
+    Q_ASSERT(type >= 0 && type < LastStepType);
+    delete m_steps[type].at(position);
+    m_steps[type].removeAt(position);
 }
 
-void BuildConfiguration::moveBuildStepUp(int position)
+void BuildConfiguration::moveStepUp(StepType type, int position)
 {
-    if (position <= 0 || m_buildSteps.size() <= 1)
+    Q_ASSERT(type >= 0 && type < LastStepType);
+    if (position <= 0 || m_steps[type].size() <= 1)
         return;
-    m_buildSteps.swap(position - 1, position);
-
-}
-
-QList<BuildStep *> BuildConfiguration::cleanSteps() const
-{
-    return m_cleanSteps;
-}
+    m_steps[type].swap(position - 1, position);
 
-void BuildConfiguration::insertCleanStep(int position, BuildStep *step)
-{
-    m_cleanSteps.insert(position, step);
-}
-
-void BuildConfiguration::removeCleanStep(int position)
-{
-    delete m_cleanSteps.at(position);
-    m_cleanSteps.removeAt(position);
-}
-
-void BuildConfiguration::moveCleanStepUp(int position)
-{
-    if (position <= 0 || m_cleanSteps.size() <= 1)
-        return;
-    m_cleanSteps.swap(position - 1, position);
 }
 
 Target *BuildConfiguration::target() const
diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h
index e391e03877f..c0bc765771c 100644
--- a/src/plugins/projectexplorer/buildconfiguration.h
+++ b/src/plugins/projectexplorer/buildconfiguration.h
@@ -53,15 +53,10 @@ public:
     // ctors are protected
     virtual ~BuildConfiguration();
 
-    QList<BuildStep *> buildSteps() const;
-    void insertBuildStep(int position, BuildStep *step);
-    void removeBuildStep(int position);
-    void moveBuildStepUp(int position);
-
-    QList<BuildStep *> cleanSteps() const;
-    void insertCleanStep(int position, BuildStep *step);
-    void removeCleanStep(int position);
-    void moveCleanStepUp(int position);
+    QList<BuildStep *> steps(StepType type) const;
+    void insertStep(StepType type, int position, BuildStep *step);
+    void removeStep(StepType type, int position);
+    void moveStepUp(StepType type, int position);
 
     virtual QString buildDirectory() const = 0;
 
@@ -90,8 +85,7 @@ protected:
     virtual bool fromMap(const QVariantMap &map);
 
 private:
-    QList<BuildStep *> m_buildSteps;
-    QList<BuildStep *> m_cleanSteps;
+    QList<BuildStep *> m_steps[LastStepType];
     Target *m_target;
 
     bool m_clearSystemEnvironment;
diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp
index 09f940f5030..3cef5471dbe 100644
--- a/src/plugins/projectexplorer/buildmanager.cpp
+++ b/src/plugins/projectexplorer/buildmanager.cpp
@@ -401,7 +401,7 @@ void BuildManager::buildProjects(const QList<BuildConfiguration *> &configuratio
 {
     QList<BuildStep *> steps;
     foreach(BuildConfiguration *bc, configurations)
-        steps.append(bc->buildSteps());
+        steps.append(bc->steps(Build));
 
     bool success = buildQueueAppend(steps);
     if (!success) {
@@ -418,7 +418,7 @@ void BuildManager::cleanProjects(const QList<BuildConfiguration *> &configuratio
 {
     QList<BuildStep *> steps;
     foreach(BuildConfiguration *bc, configurations)
-        steps.append(bc->cleanSteps());
+        steps.append(bc->steps(Clean));
 
     bool success = buildQueueAppend(steps);
     if (!success) {
diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
index a50d1a530aa..deaac215133 100644
--- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
+++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
@@ -292,8 +292,8 @@ void BuildSettingsWidget::updateBuildSettings()
     BuildConfigWidget *generalConfigWidget = m_target->project()->createConfigWidget();
     addSubWidget(generalConfigWidget->displayName(), generalConfigWidget);
 
-    addSubWidget(tr("Build Steps"), new BuildStepsPage(m_target, false));
-    addSubWidget(tr("Clean Steps"), new BuildStepsPage(m_target, true));
+    addSubWidget(tr("Build Steps"), new BuildStepsPage(m_target, Build));
+    addSubWidget(tr("Clean Steps"), new BuildStepsPage(m_target, Clean));
 
     QList<BuildConfigWidget *> subConfigWidgets = m_target->project()->subConfigWidgets();
     foreach (BuildConfigWidget *subConfigWidget, subConfigWidgets)
diff --git a/src/plugins/projectexplorer/buildstep.h b/src/plugins/projectexplorer/buildstep.h
index 9f5f8629348..d5d5fa3a541 100644
--- a/src/plugins/projectexplorer/buildstep.h
+++ b/src/plugins/projectexplorer/buildstep.h
@@ -38,6 +38,11 @@
 #include <QtGui/QWidget>
 
 namespace ProjectExplorer {
+
+enum StepType { Build = 0,
+                Clean = 1,
+                LastStepType = 2};
+
 class BuildConfiguration;
 
 /*
@@ -122,17 +127,17 @@ public:
     virtual ~IBuildStepFactory();
 
     // used to show the list of possible additons to a target, returns a list of types
-    virtual QStringList availableCreationIds(BuildConfiguration *parent) const = 0;
+    virtual QStringList availableCreationIds(BuildConfiguration *parent, StepType type) const = 0;
     // used to translate the types to names to display to the user
     virtual QString displayNameForId(const QString &id) const = 0;
 
-    virtual bool canCreate(BuildConfiguration *parent, const QString &id) const = 0;
-    virtual BuildStep *create(BuildConfiguration *parent, const QString &id) = 0;
+    virtual bool canCreate(BuildConfiguration *parent, StepType type, const QString &id) const = 0;
+    virtual BuildStep *create(BuildConfiguration *parent, StepType type, const QString &id) = 0;
     // used to recreate the runConfigurations when restoring settings
-    virtual bool canRestore(BuildConfiguration *parent, const QVariantMap &map) const = 0;
-    virtual BuildStep *restore(BuildConfiguration *parent, const QVariantMap &map) = 0;
-    virtual bool canClone(BuildConfiguration *parent, BuildStep *product) const = 0;
-    virtual BuildStep *clone(BuildConfiguration *parent, BuildStep *product) = 0;
+    virtual bool canRestore(BuildConfiguration *parent, StepType type, const QVariantMap &map) const = 0;
+    virtual BuildStep *restore(BuildConfiguration *parent, StepType type, const QVariantMap &map) = 0;
+    virtual bool canClone(BuildConfiguration *parent, StepType type, BuildStep *product) const = 0;
+    virtual BuildStep *clone(BuildConfiguration *parent, StepType type, BuildStep *product) = 0;
 };
 
 class PROJECTEXPLORER_EXPORT BuildConfigWidget
diff --git a/src/plugins/projectexplorer/buildstepspage.cpp b/src/plugins/projectexplorer/buildstepspage.cpp
index 349e938c82e..02dc875ee80 100644
--- a/src/plugins/projectexplorer/buildstepspage.cpp
+++ b/src/plugins/projectexplorer/buildstepspage.cpp
@@ -46,9 +46,9 @@
 using namespace ProjectExplorer;
 using namespace ProjectExplorer::Internal;
 
-BuildStepsPage::BuildStepsPage(Target *target, bool clean) :
+BuildStepsPage::BuildStepsPage(Target *target, StepType type) :
     BuildConfigWidget(),
-    m_clean(clean),
+    m_type(type),
     m_addButton(0),
     m_leftMargin(-1)
 {
@@ -79,7 +79,10 @@ void BuildStepsPage::updateSummary()
 
 QString BuildStepsPage::displayName() const
 {
-    return m_clean ? tr("Clean Steps") : tr("Build Steps");
+    if (m_type == Build)
+        return tr("Build Steps");
+    else
+        return tr("Clean Steps");
 }
 
 void BuildStepsPage::init(BuildConfiguration *bc)
@@ -96,7 +99,7 @@ void BuildStepsPage::init(BuildConfiguration *bc)
 
     m_configuration = bc;
 
-    const QList<BuildStep *> &steps = m_clean ? m_configuration->cleanSteps() : m_configuration->buildSteps();
+    const QList<BuildStep *> &steps = m_configuration->steps(m_type);
     int i = 0;
     foreach (BuildStep *bs, steps) {
         addBuildStepWidget(i, bs);
@@ -119,7 +122,7 @@ void BuildStepsPage::updateAddBuildStepMenu()
     //Build up a list of possible steps and save map the display names to the (internal) name and factories.
     QList<IBuildStepFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IBuildStepFactory>();
     foreach (IBuildStepFactory *factory, factories) {
-        QStringList ids = factory->availableCreationIds(m_configuration);
+        QStringList ids = factory->availableCreationIds(m_configuration, m_type);
         foreach (const QString &id, ids) {
             map.insert(factory->displayNameForId(id), QPair<QString, IBuildStepFactory *>(id, factory));
         }
@@ -207,9 +210,9 @@ void BuildStepsPage::addBuildStep()
 {
     if (QAction *action = qobject_cast<QAction *>(sender())) {
         QPair<QString, IBuildStepFactory *> pair = m_addBuildStepHash.value(action);
-        BuildStep *newStep = pair.second->create(m_configuration, pair.first);
-        int pos = m_clean ? m_configuration->cleanSteps().count() : m_configuration->buildSteps().count();
-        m_clean ? m_configuration->insertCleanStep(pos, newStep) : m_configuration->insertBuildStep(pos, newStep);
+        BuildStep *newStep = pair.second->create(m_configuration, m_type, pair.first);
+        int pos = m_configuration->steps(m_type).count();
+        m_configuration->insertStep(m_type, pos, newStep);
 
         addBuildStepWidget(pos, newStep);
         const BuildStepsWidgetStruct s = m_buildSteps.at(pos);
@@ -222,7 +225,7 @@ void BuildStepsPage::addBuildStep()
 
 void BuildStepsPage::stepMoveUp(int pos)
 {
-    m_clean ? m_configuration->moveCleanStepUp(pos) : m_configuration->moveBuildStepUp(pos);
+    m_configuration->moveStepUp(m_type, pos);
 
     m_vbox->insertWidget(pos - 1, m_buildSteps.at(pos).detailsWidget);
 
@@ -242,12 +245,11 @@ void BuildStepsPage::stepRemove(int pos)
     delete s.widget;
     delete s.detailsWidget;
     m_buildSteps.removeAt(pos);
-    m_clean ? m_configuration->removeCleanStep(pos) : m_configuration->removeBuildStep(pos);
+    m_configuration->removeStep(m_type, pos);
 
     updateBuildStepButtonsState();
 
-    bool hasSteps(m_clean ? m_configuration->cleanSteps().isEmpty() :
-                            m_configuration->buildSteps().isEmpty());
+    bool hasSteps = m_configuration->steps(m_type).isEmpty();
     m_noStepsLabel->setVisible(hasSteps);
 }
 
@@ -282,7 +284,7 @@ void BuildStepsPage::setupUi()
     QHBoxLayout *hboxLayout = new QHBoxLayout();
     hboxLayout->setContentsMargins(m_leftMargin, 4, 0, 0);
     m_addButton = new QPushButton(this);
-    m_addButton->setText(m_clean ? tr("Add clean step") :  tr("Add build step"));
+    m_addButton->setText(m_type == Clean ? tr("Add clean step") :  tr("Add build step"));
     m_addButton->setMenu(new QMenu(this));
     hboxLayout->addWidget(m_addButton);
 
@@ -300,7 +302,7 @@ void BuildStepsPage::setupUi()
 
 void BuildStepsPage::updateBuildStepButtonsState()
 {
-    const QList<BuildStep *> &steps = m_clean ? m_configuration->cleanSteps() : m_configuration->buildSteps();
+    const QList<BuildStep *> &steps = m_configuration->steps(m_type);
     for(int i = 0; i < m_buildSteps.count(); ++i) {
         BuildStepsWidgetStruct s = m_buildSteps.at(i);
         s.removeButton->setEnabled(!steps.at(i)->immutable());
diff --git a/src/plugins/projectexplorer/buildstepspage.h b/src/plugins/projectexplorer/buildstepspage.h
index 765ed51dae1..689eb5d4906 100644
--- a/src/plugins/projectexplorer/buildstepspage.h
+++ b/src/plugins/projectexplorer/buildstepspage.h
@@ -31,6 +31,7 @@
 #define BUILDSTEPSPAGE_H
 
 #include "buildstep.h"
+#include "buildconfiguration.h"
 #include <utils/detailswidget.h>
 
 QT_BEGIN_NAMESPACE
@@ -66,7 +67,7 @@ class BuildStepsPage : public BuildConfigWidget
     Q_OBJECT
 
 public:
-    explicit BuildStepsPage(Target *target, bool clean = false);
+    explicit BuildStepsPage(Target *target, StepType type);
     virtual ~BuildStepsPage();
 
     QString displayName() const;
@@ -87,7 +88,7 @@ private:
 
     BuildConfiguration * m_configuration;
     QHash<QAction *, QPair<QString, ProjectExplorer::IBuildStepFactory *> > m_addBuildStepHash;
-    bool m_clean;
+    StepType m_type;
 
     QList<BuildStepsWidgetStruct> m_buildSteps;
 
diff --git a/src/plugins/projectexplorer/processstep.cpp b/src/plugins/projectexplorer/processstep.cpp
index c1f19087ea0..7ea0c27f651 100644
--- a/src/plugins/projectexplorer/processstep.cpp
+++ b/src/plugins/projectexplorer/processstep.cpp
@@ -185,40 +185,41 @@ ProcessStepFactory::~ProcessStepFactory()
 {
 }
 
-bool ProcessStepFactory::canCreate(BuildConfiguration *parent, const QString &id) const
+bool ProcessStepFactory::canCreate(BuildConfiguration *parent, StepType type, const QString &id) const
 {
     Q_UNUSED(parent);
+    Q_UNUSED(type);
     return id == QLatin1String(PROCESS_STEP_ID);
 }
 
-BuildStep *ProcessStepFactory::create(BuildConfiguration *parent, const QString &id)
+BuildStep *ProcessStepFactory::create(BuildConfiguration *parent, StepType type, const QString &id)
 {
-    if (!canCreate(parent, id))
+    if (!canCreate(parent, type, id))
         return 0;
     return new ProcessStep(parent);
 }
 
-bool ProcessStepFactory::canClone(BuildConfiguration *parent, BuildStep *bs) const
+bool ProcessStepFactory::canClone(BuildConfiguration *parent, StepType type, BuildStep *bs) const
 {
-    return canCreate(parent, bs->id());
+    return canCreate(parent, type, bs->id());
 }
 
-BuildStep *ProcessStepFactory::clone(BuildConfiguration *parent, BuildStep *bs)
+BuildStep *ProcessStepFactory::clone(BuildConfiguration *parent, StepType type, BuildStep *bs)
 {
-    if (!canClone(parent, bs))
+    if (!canClone(parent, type, bs))
         return 0;
     return new ProcessStep(parent, static_cast<ProcessStep *>(bs));
 }
 
-bool ProcessStepFactory::canRestore(BuildConfiguration *parent, const QVariantMap &map) const
+bool ProcessStepFactory::canRestore(BuildConfiguration *parent, StepType type, const QVariantMap &map) const
 {
     QString id(ProjectExplorer::idFromMap(map));
-    return canCreate(parent, id);
+    return canCreate(parent, type, id);
 }
 
-BuildStep *ProcessStepFactory::restore(BuildConfiguration *parent, const QVariantMap &map)
+BuildStep *ProcessStepFactory::restore(BuildConfiguration *parent, StepType type, const QVariantMap &map)
 {
-    if (!canRestore(parent, map))
+    if (!canRestore(parent, type, map))
         return 0;
 
     ProcessStep *bs(new ProcessStep(parent));
@@ -228,9 +229,10 @@ BuildStep *ProcessStepFactory::restore(BuildConfiguration *parent, const QVarian
     return 0;
 }
 
-QStringList ProcessStepFactory::availableCreationIds(BuildConfiguration *parent) const
+QStringList ProcessStepFactory::availableCreationIds(BuildConfiguration *parent, StepType type) const
 {
-    Q_UNUSED(parent)
+    Q_UNUSED(parent);
+    Q_UNUSED(type);
     return QStringList() << QLatin1String(PROCESS_STEP_ID);
 }
 QString ProcessStepFactory::displayNameForId(const QString &id) const
diff --git a/src/plugins/projectexplorer/processstep.h b/src/plugins/projectexplorer/processstep.h
index 611009a74dd..88c4e1bb6b9 100644
--- a/src/plugins/projectexplorer/processstep.h
+++ b/src/plugins/projectexplorer/processstep.h
@@ -46,15 +46,15 @@ public:
     ProcessStepFactory();
     ~ProcessStepFactory();
 
-    virtual QStringList availableCreationIds(BuildConfiguration *parent) const;
+    virtual QStringList availableCreationIds(BuildConfiguration *parent, StepType type) const;
     virtual QString displayNameForId(const QString &id) const;
 
-    virtual bool canCreate(BuildConfiguration *parent, const QString &id) const;
-    virtual BuildStep *create(BuildConfiguration *parent, const QString &id);
-    virtual bool canRestore(BuildConfiguration *parent, const QVariantMap &map) const;
-    virtual BuildStep *restore(BuildConfiguration *parent, const QVariantMap &map);
-    virtual bool canClone(BuildConfiguration *parent, BuildStep *product) const;
-    virtual BuildStep *clone(BuildConfiguration *parent, BuildStep *product);
+    virtual bool canCreate(BuildConfiguration *parent, StepType type, const QString &id) const;
+    virtual BuildStep *create(BuildConfiguration *parent, StepType type, const QString &id);
+    virtual bool canRestore(BuildConfiguration *parent, StepType type, const QVariantMap &map) const;
+    virtual BuildStep *restore(BuildConfiguration *parent, StepType type, const QVariantMap &map);
+    virtual bool canClone(BuildConfiguration *parent, StepType type, BuildStep *product) const;
+    virtual BuildStep *clone(BuildConfiguration *parent, StepType type, BuildStep *product);
 };
 
 class ProcessStep : public ProjectExplorer::AbstractProcessStep
diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp
index a8e87ee682e..f2f27a20e5f 100644
--- a/src/plugins/projectexplorer/projectwindow.cpp
+++ b/src/plugins/projectexplorer/projectwindow.cpp
@@ -40,7 +40,6 @@
 #include "target.h"
 #include "projecttreewidget.h"
 #include "runconfiguration.h"
-#include "buildconfiguration.h"
 #include "buildsettingspropertiespage.h"
 #include "runsettingspropertiespage.h"
 #include "targetsettingspanel.h"
diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp
index 0d65bb12eec..1775e85255a 100644
--- a/src/plugins/qt4projectmanager/makestep.cpp
+++ b/src/plugins/qt4projectmanager/makestep.cpp
@@ -328,41 +328,42 @@ MakeStepFactory::~MakeStepFactory()
 {
 }
 
-bool MakeStepFactory::canCreate(ProjectExplorer::BuildConfiguration *parent, const QString &id) const
+bool MakeStepFactory::canCreate(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, const QString &id) const
 {
+    Q_UNUSED(type)
     if (!qobject_cast<Qt4BuildConfiguration *>(parent))
         return false;
     return (id == QLatin1String(MAKESTEP_BS_ID));
 }
 
-ProjectExplorer::BuildStep *MakeStepFactory::create(ProjectExplorer::BuildConfiguration *parent, const QString &id)
+ProjectExplorer::BuildStep *MakeStepFactory::create(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, const QString &id)
 {
-    if (!canCreate(parent, id))
+    if (!canCreate(parent, type, id))
         return 0;
     return new MakeStep(parent);
 }
 
-bool MakeStepFactory::canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep *source) const
+bool MakeStepFactory::canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, ProjectExplorer::BuildStep *source) const
 {
-    return canCreate(parent, source->id());
+    return canCreate(parent, type, source->id());
 }
 
-ProjectExplorer::BuildStep *MakeStepFactory::clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep *source)
+ProjectExplorer::BuildStep *MakeStepFactory::clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, ProjectExplorer::BuildStep *source)
 {
-    if (!canClone(parent, source))
+    if (!canClone(parent, type, source))
         return 0;
     return new MakeStep(parent, static_cast<MakeStep *>(source));
 }
 
-bool MakeStepFactory::canRestore(ProjectExplorer::BuildConfiguration *parent, const QVariantMap &map) const
+bool MakeStepFactory::canRestore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, const QVariantMap &map) const
 {
     QString id(ProjectExplorer::idFromMap(map));
-    return canCreate(parent, id);
+    return canCreate(parent, type, id);
 }
 
-ProjectExplorer::BuildStep *MakeStepFactory::restore(ProjectExplorer::BuildConfiguration *parent, const QVariantMap &map)
+ProjectExplorer::BuildStep *MakeStepFactory::restore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, const QVariantMap &map)
 {
-    if (!canRestore(parent, map))
+    if (!canRestore(parent, type, map))
         return 0;
     MakeStep *bs(new MakeStep(parent));
     if (bs->fromMap(map))
@@ -371,8 +372,9 @@ ProjectExplorer::BuildStep *MakeStepFactory::restore(ProjectExplorer::BuildConfi
     return 0;
 }
 
-QStringList MakeStepFactory::availableCreationIds(ProjectExplorer::BuildConfiguration *parent) const
+QStringList MakeStepFactory::availableCreationIds(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type) const
 {
+    Q_UNUSED(type)
     if (qobject_cast<Qt4BuildConfiguration *>(parent))
         return QStringList() << QLatin1String(MAKESTEP_BS_ID);
     return QStringList();
diff --git a/src/plugins/qt4projectmanager/makestep.h b/src/plugins/qt4projectmanager/makestep.h
index 2805ea857d1..fabbf26c871 100644
--- a/src/plugins/qt4projectmanager/makestep.h
+++ b/src/plugins/qt4projectmanager/makestep.h
@@ -54,14 +54,14 @@ public:
     explicit MakeStepFactory(QObject *parent = 0);
     virtual ~MakeStepFactory();
 
-    bool canCreate(ProjectExplorer::BuildConfiguration *parent, const QString &id) const;
-    ProjectExplorer::BuildStep *create(ProjectExplorer::BuildConfiguration *parent, const QString &id);
-    bool canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep *source) const;
-    ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep *source);
-    bool canRestore(ProjectExplorer::BuildConfiguration *parent, const QVariantMap &map) const;
-    ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildConfiguration *parent, const QVariantMap &map);
-
-    QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *parent) const;
+    bool canCreate(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, const QString &id) const;
+    ProjectExplorer::BuildStep *create(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, const QString &id);
+    bool canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, ProjectExplorer::BuildStep *source) const;
+    ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, ProjectExplorer::BuildStep *source);
+    bool canRestore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, const QVariantMap &map) const;
+    ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, const QVariantMap &map);
+
+    QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type) const;
     QString displayNameForId(const QString &id) const;
 };
 } //namespace Internal
diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp
index 7652949b81e..508e6146b9a 100644
--- a/src/plugins/qt4projectmanager/qmakestep.cpp
+++ b/src/plugins/qt4projectmanager/qmakestep.cpp
@@ -402,45 +402,47 @@ QMakeStepFactory::~QMakeStepFactory()
 {
 }
 
-bool QMakeStepFactory::canCreate(BuildConfiguration *parent, const QString &id) const
+bool QMakeStepFactory::canCreate(BuildConfiguration *parent, ProjectExplorer::StepType type, const QString &id) const
 {
+    if (type != ProjectExplorer::Build)
+        return false;
     if (!qobject_cast<Qt4BuildConfiguration *>(parent))
         return false;
     return (id == QLatin1String(QMAKE_BS_ID));
 }
 
-ProjectExplorer::BuildStep *QMakeStepFactory::create(BuildConfiguration *parent, const QString &id)
+ProjectExplorer::BuildStep *QMakeStepFactory::create(BuildConfiguration *parent, ProjectExplorer::StepType type,const QString &id)
 {
-    if (!canCreate(parent, id))
+    if (!canCreate(parent, type, id))
         return 0;
     Qt4BuildConfiguration *bc(qobject_cast<Qt4BuildConfiguration *>(parent));
     Q_ASSERT(bc);
     return new QMakeStep(bc);
 }
 
-bool QMakeStepFactory::canClone(BuildConfiguration *parent, BuildStep *source) const
+bool QMakeStepFactory::canClone(BuildConfiguration *parent, ProjectExplorer::StepType type, BuildStep *source) const
 {
-    return canCreate(parent, source->id());
+    return canCreate(parent, type, source->id());
 }
 
-ProjectExplorer::BuildStep *QMakeStepFactory::clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep *source)
+ProjectExplorer::BuildStep *QMakeStepFactory::clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, ProjectExplorer::BuildStep *source)
 {
-    if (!canClone(parent, source))
+    if (!canClone(parent, type, source))
         return 0;
     Qt4BuildConfiguration *bc(qobject_cast<Qt4BuildConfiguration *>(parent));
     Q_ASSERT(bc);
     return new QMakeStep(bc, qobject_cast<QMakeStep *>(source));
 }
 
-bool QMakeStepFactory::canRestore(ProjectExplorer::BuildConfiguration *parent, const QVariantMap &map) const
+bool QMakeStepFactory::canRestore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, const QVariantMap &map) const
 {
     QString id(ProjectExplorer::idFromMap(map));
-    return canCreate(parent, id);
+    return canCreate(parent, type, id);
 }
 
-ProjectExplorer::BuildStep *QMakeStepFactory::restore(ProjectExplorer::BuildConfiguration *parent, const QVariantMap &map)
+ProjectExplorer::BuildStep *QMakeStepFactory::restore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type, const QVariantMap &map)
 {
-    if (!canRestore(parent, map))
+    if (!canRestore(parent, type, map))
         return 0;
     Qt4BuildConfiguration *bc(qobject_cast<Qt4BuildConfiguration *>(parent));
     Q_ASSERT(bc);
@@ -451,11 +453,12 @@ ProjectExplorer::BuildStep *QMakeStepFactory::restore(ProjectExplorer::BuildConf
     return 0;
 }
 
-QStringList QMakeStepFactory::availableCreationIds(ProjectExplorer::BuildConfiguration *parent) const
+QStringList QMakeStepFactory::availableCreationIds(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type) const
 {
-    if (Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(parent))
-        if (!bc->qmakeStep())
-            return QStringList() << QLatin1String(QMAKE_BS_ID);
+    if (type == Build)
+        if (Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(parent))
+            if (!bc->qmakeStep())
+                return QStringList() << QLatin1String(QMAKE_BS_ID);
     return QStringList();
 }
 
diff --git a/src/plugins/qt4projectmanager/qmakestep.h b/src/plugins/qt4projectmanager/qmakestep.h
index c90606f7730..436183ec001 100644
--- a/src/plugins/qt4projectmanager/qmakestep.h
+++ b/src/plugins/qt4projectmanager/qmakestep.h
@@ -55,13 +55,13 @@ class QMakeStepFactory : public ProjectExplorer::IBuildStepFactory
 public:
     explicit QMakeStepFactory(QObject *parent = 0);
     virtual ~QMakeStepFactory();
-    bool canCreate(ProjectExplorer::BuildConfiguration *parent, const QString & id) const;
-    ProjectExplorer::BuildStep *create(ProjectExplorer::BuildConfiguration *parent, const QString &id);
-    bool canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep *bs) const;
-    ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep *bs);
-    bool canRestore(ProjectExplorer::BuildConfiguration *parent, const QVariantMap &map) const;
-    ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildConfiguration *parent, const QVariantMap &map);
-    QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *bc) const;
+    bool canCreate(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type,const QString & id) const;
+    ProjectExplorer::BuildStep *create(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type,const QString &id);
+    bool canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type,ProjectExplorer::BuildStep *bs) const;
+    ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type,ProjectExplorer::BuildStep *bs);
+    bool canRestore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type,const QVariantMap &map) const;
+    ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::StepType type,const QVariantMap &map);
+    QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *bc, ProjectExplorer::StepType type) const;
     QString displayNameForId(const QString &id) const;
 };
 
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
index 5254dab4af6..2ac72ee3486 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
@@ -362,7 +362,7 @@ void Qt4BuildConfiguration::getConfigCommandLineArguments(QStringList *addedUser
 QMakeStep *Qt4BuildConfiguration::qmakeStep() const
 {
     QMakeStep *qs = 0;
-    foreach(BuildStep *bs, buildSteps())
+    foreach(BuildStep *bs, steps(ProjectExplorer::Build))
         if ((qs = qobject_cast<QMakeStep *>(bs)) != 0)
             return qs;
     return 0;
@@ -371,7 +371,7 @@ QMakeStep *Qt4BuildConfiguration::qmakeStep() const
 MakeStep *Qt4BuildConfiguration::makeStep() const
 {
     MakeStep *qs = 0;
-    foreach(BuildStep *bs, buildSteps())
+    foreach(BuildStep *bs, steps(ProjectExplorer::Build))
         if ((qs = qobject_cast<MakeStep *>(bs)) != 0)
             return qs;
     return 0;
diff --git a/src/plugins/qt4projectmanager/qt4target.cpp b/src/plugins/qt4projectmanager/qt4target.cpp
index 1ce701fa9b0..856fd4b5e6b 100644
--- a/src/plugins/qt4projectmanager/qt4target.cpp
+++ b/src/plugins/qt4projectmanager/qt4target.cpp
@@ -244,15 +244,15 @@ Qt4BuildConfiguration *Qt4Target::addQt4BuildConfiguration(QString displayName,
     bc->setDisplayName(displayName);
 
     QMakeStep *qmakeStep = new QMakeStep(bc);
-    bc->insertBuildStep(0, qmakeStep);
+    bc->insertStep(ProjectExplorer::Build, 0, qmakeStep);
 
     MakeStep *makeStep = new MakeStep(bc);
-    bc->insertBuildStep(1, makeStep);
+    bc->insertStep(ProjectExplorer::Build, 1, makeStep);
 
     MakeStep* cleanStep = new MakeStep(bc);
     cleanStep->setClean(true);
     cleanStep->setUserArguments(QStringList() << "clean");
-    bc->insertCleanStep(0, cleanStep);
+    bc->insertStep(ProjectExplorer::Clean, 0, cleanStep);
     if (!additionalArguments.isEmpty())
         qmakeStep->setUserArguments(additionalArguments);
 
-- 
GitLab