aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRadovan Zivkovic <pivonroll@gmail.com>2012-11-25 23:07:01 +0100
committerOswald Buddenhagen <oswald.buddenhagen@digia.com>2014-03-11 19:54:51 +0100
commit169921274f17c46b32b6ef5a32c7778ee4c37c08 (patch)
tree2dfb604f3af8db463b28da41dcf0b126ef907ab2
parentafb07299882ef935d47dc4d6be82dc566f6a5818 (diff)
Added vc project build configuration.
Change-Id: I0302f38228b914a8dd0ef3348cbce975bd6f4b96 Reviewed-by: Bojan Petrovic <bojan85@gmail.com>
-rw-r--r--src/plugins/vcprojectmanager/vcmakestep.cpp208
-rw-r--r--src/plugins/vcprojectmanager/vcmakestep.h68
-rw-r--r--src/plugins/vcprojectmanager/vcproject.cpp73
-rw-r--r--src/plugins/vcprojectmanager/vcproject.h16
-rw-r--r--src/plugins/vcprojectmanager/vcprojectbuildconfiguration.cpp162
-rw-r--r--src/plugins/vcprojectmanager/vcprojectbuildconfiguration.h53
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmanager.pro10
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmanagerconstants.h1
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmanagerplugin.cpp4
9 files changed, 590 insertions, 5 deletions
diff --git a/src/plugins/vcprojectmanager/vcmakestep.cpp b/src/plugins/vcprojectmanager/vcmakestep.cpp
new file mode 100644
index 0000000000..424bae0c60
--- /dev/null
+++ b/src/plugins/vcprojectmanager/vcmakestep.cpp
@@ -0,0 +1,208 @@
+#include "vcmakestep.h"
+
+#include "vcprojectbuildconfiguration.h"
+#include "vcprojectfile.h"
+#include "vcprojectmanagerconstants.h"
+
+#include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/project.h>
+#include <projectexplorer/projectconfiguration.h>
+#include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/target.h>
+#include <projectexplorer/task.h>
+
+#include <QFormLayout>
+#include <QLabel>
+
+namespace VcProjectManager {
+namespace Internal {
+
+namespace {
+const char MS_ID[] = "VcProjectManager.MakeStep";
+const char CLEAN_KEY[] = "VcProjectManager.MakeStep.Clean";
+const char BUILD_TARGETS_KEY[] = "VcProjectManager.MakeStep.BuildTargets";
+const char ADDITIONAL_ARGUMENTS_KEY[] = "VcProjectManager.MakeStep.AdditionalArguments";
+}
+
+VcMakeStep::VcMakeStep(ProjectExplorer::BuildStepList *bsl)
+ : AbstractProcessStep(bsl, Core::Id(MS_ID))
+{
+}
+
+bool VcMakeStep::init()
+{
+ VcProjectBuildConfiguration *bc = vcProjectBuildConfiguration();
+
+ if (!bc) {
+ m_tasks.append(ProjectExplorer::Task(ProjectExplorer::Task::Error,
+ tr("Qt Creator didn't detected any proper build tool for .vcproj files."),
+ Utils::FileName(), -1,
+ Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)));
+ return true;
+ }
+
+ ProjectExplorer::ProcessParameters *pp = processParameters();
+ pp->setMacroExpander(bc->macroExpander());
+ pp->setEnvironment(bc->environment());
+ pp->setWorkingDirectory(bc->buildDirectory());
+ pp->setCommand(QString("C:/Windows/Microsoft.NET/Framework/v3.5/MSBuild.exe"));
+ ProjectExplorer::Project *project = bc->target()->project();
+ VcProjectFile* document = static_cast<VcProjectFile *>(project->document());
+
+ pp->setArguments(document->filePath());
+ return AbstractProcessStep::init();
+}
+
+void VcMakeStep::run(QFutureInterface<bool> &fi)
+{
+ bool canContinue = true;
+
+ foreach (const ProjectExplorer::Task &t, m_tasks) {
+ addTask(t);
+ canContinue = false;
+ }
+
+ if (!canContinue) {
+ emit addOutput(tr("Configuration is faulty. Check the Issues view for details."), BuildStep::MessageOutput);
+ fi.reportResult(false);
+ return;
+ }
+
+ m_futureInterface = &fi;
+ m_futureInterface->setProgressRange(0, 100);
+ AbstractProcessStep::run(fi);
+ m_futureInterface->setProgressValue(100);
+ m_futureInterface->reportFinished();
+ m_futureInterface = 0;
+}
+
+ProjectExplorer::BuildStepConfigWidget *VcMakeStep::createConfigWidget()
+{
+ return new VcMakeStepConfigWidget(this);
+}
+
+bool VcMakeStep::immutable() const
+{
+ return false;
+}
+
+VcProjectBuildConfiguration *VcMakeStep::vcProjectBuildConfiguration() const
+{
+ return static_cast<VcProjectBuildConfiguration *>(buildConfiguration());
+}
+
+QVariantMap VcMakeStep::toMap() const
+{
+ return BuildStep::toMap();
+}
+
+bool VcMakeStep::fromMap(const QVariantMap &map)
+{
+ return BuildStep::fromMap(map);
+}
+
+VcMakeStep::VcMakeStep(ProjectExplorer::BuildStepList *parent, VcMakeStep *vcMakeStep) :
+ AbstractProcessStep(parent, vcMakeStep)
+{
+}
+
+/////////////////////////
+// VcMakeStepConfigWidget
+/////////////////////////
+VcMakeStepConfigWidget::VcMakeStepConfigWidget(VcMakeStep *makeStep) :
+ m_makeStep(makeStep)
+{
+ QFormLayout *mainLayout = new QFormLayout(this);
+ mainLayout->setMargin(0);
+ mainLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
+ QLabel *label = new QLabel("C:/Windows/Microsoft.NET/Framework/v3.5/MSBuild.exe");
+ mainLayout->addRow(tr("Command:"), label);
+ setLayout(mainLayout);
+}
+
+QString VcMakeStepConfigWidget::displayName() const
+{
+ return tr("Vc Make Step Config Widget");
+}
+
+QString VcMakeStepConfigWidget::summaryText() const
+{
+ return tr("This is Vc Project's build step configuration widget.");
+}
+
+////////////////////
+// VcMakeStepFactory
+////////////////////
+VcMakeStepFactory::VcMakeStepFactory(QObject *parent)
+ : IBuildStepFactory(parent)
+{
+}
+
+VcMakeStepFactory::~VcMakeStepFactory()
+{
+}
+
+bool VcMakeStepFactory::canCreate(ProjectExplorer::BuildStepList *parent, const Core::Id id) const
+{
+ qDebug() << "VcMakeStepFactory::canCreate()";
+ if (parent->target()->project()->id() == Constants::VC_PROJECT_ID)
+ return id == MS_ID;
+ return false;
+}
+
+ProjectExplorer::BuildStep* VcMakeStepFactory::create(ProjectExplorer::BuildStepList *parent, const Core::Id id)
+{
+ if (!canCreate(parent, id))
+ return 0;
+ VcMakeStep *step = new VcMakeStep(parent);
+ return step;
+}
+
+bool VcMakeStepFactory::canClone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) const
+{
+ return canCreate(parent, product->id());
+}
+
+ProjectExplorer::BuildStep *VcMakeStepFactory::clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product)
+{
+ if (!canClone(parent, product))
+ return 0;
+ return new VcMakeStep(parent, static_cast<VcMakeStep *>(product));
+}
+
+bool VcMakeStepFactory::canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const
+{
+ return canCreate(parent, ProjectExplorer::idFromMap(map));
+}
+
+ProjectExplorer::BuildStep *VcMakeStepFactory::restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map)
+{
+ if (!canRestore(parent, map))
+ return 0;
+ VcMakeStep *bs = new VcMakeStep(parent);
+ if (bs->fromMap(map))
+ return bs;
+ delete bs;
+ return 0;
+}
+
+QList<Core::Id> VcMakeStepFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const
+{
+ if (parent->target() && parent->target()->project()) {
+ if (parent->target()->project()->id() == Constants::VC_PROJECT_ID) {
+ return QList<Core::Id>() << Core::Id(MS_ID);
+ }
+ }
+ return QList<Core::Id>();
+}
+
+QString VcMakeStepFactory::displayNameForId(const Core::Id id) const
+{
+ if (id == MS_ID)
+ return tr("Make", "Vc Project Make Step Factory id.");
+ return QString();
+}
+
+
+} // namespace Internal
+} // namespace VcProjectManager
diff --git a/src/plugins/vcprojectmanager/vcmakestep.h b/src/plugins/vcprojectmanager/vcmakestep.h
new file mode 100644
index 0000000000..606301563e
--- /dev/null
+++ b/src/plugins/vcprojectmanager/vcmakestep.h
@@ -0,0 +1,68 @@
+#ifndef VCPROJECTMANAGER_INTERNAL_VCMAKESTEP_H
+#define VCPROJECTMANAGER_INTERNAL_VCMAKESTEP_H
+
+#include <projectexplorer/abstractprocessstep.h>
+
+namespace VcProjectManager {
+namespace Internal {
+
+class VcProjectBuildConfiguration;
+
+class VcMakeStep : public ProjectExplorer::AbstractProcessStep
+{
+ Q_OBJECT
+ friend class VcMakeStepFactory;
+
+public:
+ explicit VcMakeStep(ProjectExplorer::BuildStepList *bsl);
+
+ bool init();
+ void run(QFutureInterface<bool> &fi);
+ ProjectExplorer::BuildStepConfigWidget *createConfigWidget();
+ bool immutable() const;
+
+ VcProjectBuildConfiguration *vcProjectBuildConfiguration() const;
+
+ QVariantMap toMap() const;
+ bool fromMap(const QVariantMap &map);
+private:
+ explicit VcMakeStep(ProjectExplorer::BuildStepList *parent, VcMakeStep *vcMakeStep);
+
+ QList<ProjectExplorer::Task> m_tasks;
+ QFutureInterface<bool> *m_futureInterface;
+};
+
+class VcMakeStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget
+{
+ Q_OBJECT
+public:
+ VcMakeStepConfigWidget(VcMakeStep *makeStep);
+ virtual QString displayName() const;
+ virtual QString summaryText() const;
+private:
+ VcMakeStep *m_makeStep;
+};
+
+class VcMakeStepFactory : public ProjectExplorer::IBuildStepFactory
+{
+ Q_OBJECT
+
+public:
+ explicit VcMakeStepFactory(QObject *parent = 0);
+ virtual ~VcMakeStepFactory();
+
+ bool canCreate(ProjectExplorer::BuildStepList *parent, const Core::Id id) const;
+ ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, const Core::Id id);
+ bool canClone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) const;
+ ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product);
+ bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const;
+ ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map);
+
+ QList<Core::Id> availableCreationIds(ProjectExplorer::BuildStepList *parent) const;
+ QString displayNameForId(const Core::Id id) const;
+};
+
+} // namespace Internal
+} // namespace VcProjectManager
+
+#endif // VCPROJECTMANAGER_INTERNAL_VCMAKESTEP_H
diff --git a/src/plugins/vcprojectmanager/vcproject.cpp b/src/plugins/vcprojectmanager/vcproject.cpp
index 0f972a0b41..c93a00c9da 100644
--- a/src/plugins/vcprojectmanager/vcproject.cpp
+++ b/src/plugins/vcprojectmanager/vcproject.cpp
@@ -2,17 +2,27 @@
#include "vcprojectfile.h"
#include "vcprojectnodes.h"
+#include "vcmakestep.h"
#include "vcprojectmanager.h"
#include "vcprojectmanagerconstants.h"
#include "vcprojectreader.h"
+#include "vcprojectbuildconfiguration.h"
#include <coreplugin/icontext.h>
#include <coreplugin/icore.h>
+#include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/buildenvironmentwidget.h>
#include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/kit.h>
+#include <projectexplorer/kitmanager.h>
+#include <projectexplorer/target.h>
+#include <extensionsystem/pluginmanager.h>
#include <utils/filesystemwatcher.h>
#include <QFileInfo>
#include <QFileSystemWatcher>
+#include <QFormLayout>
+#include <QLabel>
using namespace ProjectExplorer;
@@ -66,10 +76,20 @@ QStringList VcProject::files(Project::FilesMode fileMode) const
return m_rootNode->files();
}
-void VcProject::reparse()
+QList<BuildConfigWidget *> VcProject::subConfigWidgets()
{
- qDebug() << "reparse";
+ QList<ProjectExplorer::BuildConfigWidget*> list;
+ list << new BuildEnvironmentWidget;
+ return list;
+}
+QString VcProject::defaultBuildDirectory() const
+{
+ return projectDirectory() + QLatin1String("-build");
+}
+
+void VcProject::reparse()
+{
QString projectFilePath = m_projectFile->filePath();
VcProjectInfo::Project *projInfo = reader.parse(projectFilePath);
@@ -92,5 +112,54 @@ void VcProject::reparse()
emit fileListChanged();
}
+bool VcProject::fromMap(const QVariantMap &map)
+{
+ Kit *defaultKit = KitManager::instance()->defaultKit();
+ if (defaultKit) {
+ qDebug() << "VcProject::fromMap() defaultKit:" << defaultKit->displayName();
+ Target *target = new Target(this, defaultKit);
+ VcProjectBuildConfiguration *bc = new VcProjectBuildConfiguration(target);
+ ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
+ VcMakeStep *makeStep = new VcMakeStep(buildSteps);
+ buildSteps->insertStep(0, makeStep);
+ target->addBuildConfiguration(bc);
+ addTarget(target);
+ }
+
+ return Project::fromMap(map);
+}
+
+bool VcProject::setupTarget(ProjectExplorer::Target *t)
+{
+ VcProjectBuildConfigurationFactory *factory
+ = ExtensionSystem::PluginManager::instance()->getObject<VcProjectBuildConfigurationFactory>();
+ VcProjectBuildConfiguration *bc = factory->create(t, Constants::VC_PROJECT_BC_ID, QLatin1String("vcproj"));
+ if (!bc)
+ return false;
+
+ t->addBuildConfiguration(bc);
+ return true;
+}
+
+VcProjectBuildSettingsWidget::VcProjectBuildSettingsWidget()
+{
+ QFormLayout *f1 = new QFormLayout(this);
+ f1->setContentsMargins(0, 0, 0, 0);
+ f1->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
+
+ QLabel *l = new QLabel(tr("Vcproj Build Configuration widget."));
+ f1->addRow(tr("Vc Project"), l);
+}
+
+QString VcProjectBuildSettingsWidget::displayName() const
+{
+ return tr("Vc Project Settings Widget");
+}
+
+void VcProjectBuildSettingsWidget::init(BuildConfiguration *bc)
+{
+ Q_UNUSED(bc);
+}
+
} // namespace Internal
} // namespace VcProjectManager
diff --git a/src/plugins/vcprojectmanager/vcproject.h b/src/plugins/vcprojectmanager/vcproject.h
index 3540465bbc..8aed3a291a 100644
--- a/src/plugins/vcprojectmanager/vcproject.h
+++ b/src/plugins/vcprojectmanager/vcproject.h
@@ -3,6 +3,7 @@
#include "vcprojectreader.h"
+#include <projectexplorer/buildstep.h>
#include <projectexplorer/project.h>
class QFileSystemWatcher;
@@ -27,11 +28,12 @@ public:
ProjectExplorer::IProjectManager *projectManager() const;
ProjectExplorer::ProjectNode *rootProjectNode() const;
QStringList files(FilesMode fileMode) const;
+ QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets();
+ QString defaultBuildDirectory() const;
public slots:
void reparse();
-// virtual QList<BuildConfigWidget*> subConfigWidgets();
// virtual QString generatedUiHeader(const QString &formFile) const;
// static QString makeUnique(const QString &preferedName, const QStringList &usedNames);
// virtual QVariantMap toMap() const;
@@ -40,6 +42,10 @@ public slots:
// virtual bool needsConfiguration() const;
// virtual void configureAsExampleProject(const QStringList &platforms);
+protected:
+ bool fromMap(const QVariantMap &map);
+ bool setupTarget(ProjectExplorer::Target *t);
+
private:
VcManager *m_projectManager;
VcProjectFile *m_projectFile;
@@ -49,6 +55,14 @@ private:
QFileSystemWatcher *m_projectFileWatcher;
};
+class VcProjectBuildSettingsWidget : public ProjectExplorer::BuildConfigWidget
+{
+public:
+ VcProjectBuildSettingsWidget();
+ QString displayName() const;
+ void init(ProjectExplorer::BuildConfiguration *bc);
+};
+
} // namespace Internal
} // namespace VcProjectManager
diff --git a/src/plugins/vcprojectmanager/vcprojectbuildconfiguration.cpp b/src/plugins/vcprojectmanager/vcprojectbuildconfiguration.cpp
new file mode 100644
index 0000000000..ef8afa29a6
--- /dev/null
+++ b/src/plugins/vcprojectmanager/vcprojectbuildconfiguration.cpp
@@ -0,0 +1,162 @@
+#include "vcprojectbuildconfiguration.h"
+#include "vcprojectmanagerconstants.h"
+#include "vcmakestep.h"
+
+#include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/gnumakeparser.h>
+#include <projectexplorer/kitinformation.h>
+#include <projectexplorer/project.h>
+#include <projectexplorer/projectexplorerconstants.h>
+#include <qtsupport/qtkitinformation.h>
+#include <utils/qtcassert.h>
+#include <projectexplorer/target.h>
+
+#include <QFormLayout>
+#include <QLabel>
+#include <QInputDialog>
+
+////////////////////////////////////
+// VcProjectBuildConfiguration class
+////////////////////////////////////
+namespace VcProjectManager {
+namespace Internal {
+
+VcProjectBuildConfiguration::VcProjectBuildConfiguration(ProjectExplorer::Target *parent) :
+ BuildConfiguration(parent, Core::Id(Constants::VC_PROJECT_BC_ID))
+{
+ m_buildDirectory = static_cast<VcProject *>(parent->project())->defaultBuildDirectory();
+}
+
+ProjectExplorer::BuildConfigWidget *VcProjectBuildConfiguration::createConfigWidget()
+{
+ return new VcProjectBuildSettingsWidget;
+}
+
+QString VcProjectBuildConfiguration::buildDirectory() const
+{
+ return QString();
+}
+
+ProjectExplorer::IOutputParser *VcProjectBuildConfiguration::createOutputParser() const
+{
+ ProjectExplorer::IOutputParser *parserchain = new ProjectExplorer::GnuMakeParser;
+
+ ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(target()->kit());
+ if (tc)
+ parserchain->appendOutputParser(tc->outputParser());
+ return parserchain;
+}
+
+ProjectExplorer::BuildConfiguration::BuildType VcProjectBuildConfiguration::buildType() const
+{
+ return Debug;
+}
+
+VcProjectBuildConfiguration::VcProjectBuildConfiguration(ProjectExplorer::Target *parent, VcProjectBuildConfiguration *source)
+ : BuildConfiguration(parent, source)
+{
+ cloneSteps(source);
+}
+
+///////////////////////////////////////////
+// VcProjectBuildConfigurationFactory class
+///////////////////////////////////////////
+VcProjectBuildConfigurationFactory::VcProjectBuildConfigurationFactory(QObject *parent)
+ : IBuildConfigurationFactory(parent)
+{
+}
+
+QList<Core::Id> VcProjectBuildConfigurationFactory::availableCreationIds(const ProjectExplorer::Target *parent) const
+{
+ if (!canHandle(parent))
+ return QList<Core::Id>();
+
+ return QList<Core::Id>() << Core::Id(Constants::VC_PROJECT_BC_ID);
+}
+
+QString VcProjectBuildConfigurationFactory::displayNameForId(const Core::Id id) const
+{
+ if (id == Constants::VC_PROJECT_BC_ID)
+ return tr("Vc Project");
+
+ return QString();
+}
+
+bool VcProjectBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const
+{
+ if (!canHandle(parent))
+ return false;
+ if (id == Constants::VC_PROJECT_BC_ID)
+ return true;
+ return false;
+}
+
+VcProjectBuildConfiguration *VcProjectBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name)
+{
+ if (!canCreate(parent, id))
+ return 0;
+// VcProject *project = static_cast<VcProject *>(parent->project());
+
+ bool ok = true;
+ QString buildConfigName = name;
+ if (buildConfigName.isEmpty())
+ buildConfigName = QInputDialog::getText(0,
+ tr("New Vc Project Configuration"),
+ tr("New Configuration name:"),
+ QLineEdit::Normal,
+ QString(), &ok);
+ buildConfigName = buildConfigName.trimmed();
+ if (!ok || buildConfigName.isEmpty())
+ return 0;
+
+ VcProjectBuildConfiguration *bc = new VcProjectBuildConfiguration(parent);
+ bc->setDisplayName(buildConfigName);
+
+ ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
+
+ VcMakeStep *makeStep = new VcMakeStep(buildSteps);
+ buildSteps->insertStep(0, makeStep);
+
+ return bc;
+}
+
+bool VcProjectBuildConfigurationFactory::canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const
+{
+ return canCreate(parent, ProjectExplorer::idFromMap(map));
+}
+
+VcProjectBuildConfiguration *VcProjectBuildConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map)
+{
+ if (!canRestore(parent, map))
+ return 0;
+
+ VcProjectBuildConfiguration *bc = new VcProjectBuildConfiguration(parent);
+ if (bc->fromMap(map))
+ return bc;
+ delete bc;
+ return 0;
+}
+
+bool VcProjectBuildConfigurationFactory::canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const
+{
+ return canCreate(parent, source->id());
+}
+
+VcProjectBuildConfiguration *VcProjectBuildConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source)
+{
+ if (!canClone(parent, source))
+ return 0;
+
+ VcProjectBuildConfiguration *old = static_cast<VcProjectBuildConfiguration *>(source);
+ return new VcProjectBuildConfiguration(parent, old);
+}
+
+bool VcProjectBuildConfigurationFactory::canHandle(const ProjectExplorer::Target *t) const
+{
+ if (!t->project()->supportsKit(t->kit()))
+ return false;
+ return qobject_cast<VcProject *>(t->project());
+}
+
+} // namespace Internal
+} // namespace VcProjectManager
diff --git a/src/plugins/vcprojectmanager/vcprojectbuildconfiguration.h b/src/plugins/vcprojectmanager/vcprojectbuildconfiguration.h
new file mode 100644
index 0000000000..cb0ba11a57
--- /dev/null
+++ b/src/plugins/vcprojectmanager/vcprojectbuildconfiguration.h
@@ -0,0 +1,53 @@
+#ifndef VCPROJECTMANAGER_BUILDCONFIGURATION_H
+#define VCPROJECTMANAGER_BUILDCONFIGURATION_H
+
+#include "vcproject.h"
+
+#include <projectexplorer/buildconfiguration.h>
+
+namespace VcProjectManager {
+namespace Internal {
+
+class VcProjectBuildConfiguration : public ProjectExplorer::BuildConfiguration
+{
+ Q_OBJECT
+ friend class VcProjectBuildConfigurationFactory;
+
+public:
+ explicit VcProjectBuildConfiguration(ProjectExplorer::Target *parent);
+
+ ProjectExplorer::BuildConfigWidget *createConfigWidget();
+ QString buildDirectory() const;
+ ProjectExplorer::IOutputParser *createOutputParser() const;
+ BuildType buildType() const;
+
+protected:
+ VcProjectBuildConfiguration(ProjectExplorer::Target *parent, VcProjectBuildConfiguration *source);
+
+private:
+ QString m_buildDirectory;
+};
+
+class VcProjectBuildConfigurationFactory : public ProjectExplorer::IBuildConfigurationFactory
+{
+ Q_OBJECT
+
+public:
+ explicit VcProjectBuildConfigurationFactory(QObject *parent = 0);
+
+ QList<Core::Id> availableCreationIds(const ProjectExplorer::Target *parent) const;
+ QString displayNameForId(const Core::Id id) const;
+ bool canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const;
+ VcProjectBuildConfiguration* create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name);
+ bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const;
+ VcProjectBuildConfiguration* restore(ProjectExplorer::Target *parent, const QVariantMap &map);
+ bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const;
+ VcProjectBuildConfiguration* clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source);
+
+private:
+ bool canHandle(const ProjectExplorer::Target *t) const;
+};
+
+} // namespace Internal
+} // namespace VcProjectManager
+#endif // VCPROJECTBUILDCONFIGURATION_H
diff --git a/src/plugins/vcprojectmanager/vcprojectmanager.pro b/src/plugins/vcprojectmanager/vcprojectmanager.pro
index a83fa5abf2..311d08d0e1 100644
--- a/src/plugins/vcprojectmanager/vcprojectmanager.pro
+++ b/src/plugins/vcprojectmanager/vcprojectmanager.pro
@@ -7,13 +7,19 @@ HEADERS = vcprojectmanagerplugin.h \
vcprojectmanager_global.h \
vcprojectmanager.h \
vcprojectfile.h \
- vcproject.h
+ vcproject.h \
+ vcprojectbuildconfiguration.h \
+ vcmakestep.h \
+ vcprojectbuildoptionspage.h
SOURCES = vcprojectmanagerplugin.cpp \
vcprojectreader.cpp \
vcprojectnodes.cpp \
vcprojectmanager.cpp \
vcprojectfile.cpp \
- vcproject.cpp
+ vcproject.cpp \
+ vcprojectbuildconfiguration.cpp \
+ vcmakestep.cpp \
+ vcprojectbuildoptionspage.cpp
OTHER_FILES += \
VcProject.mimetypes.xml
diff --git a/src/plugins/vcprojectmanager/vcprojectmanagerconstants.h b/src/plugins/vcprojectmanager/vcprojectmanagerconstants.h
index 1b28f9f83e..6de5e2b67b 100644
--- a/src/plugins/vcprojectmanager/vcprojectmanagerconstants.h
+++ b/src/plugins/vcprojectmanager/vcprojectmanagerconstants.h
@@ -8,6 +8,7 @@ const char VCPROJ_MIMETYPE[] = "text/x-vc-project"; // TODO: is this good enough
const char VC_PROJECT_ID[] = "VcProject.VcProject";
const char VC_PROJECT_CONTEXT[] = "VcProject.ProjectContext";
const char VC_PROJECT_TARGET_ID[] = "VcProject.DefaultVcProjectTarget";
+const char VC_PROJECT_BC_ID[] = "VcProject.VcProjectBuildConfiguration";
const char REPARSE_ACTION_ID[] = "VcProject.ReparseMenuAction";
const char REPARSE_CONTEXT_MENU_ACTION_ID[] = "VcProject.ReparseContextMenuAction";
diff --git a/src/plugins/vcprojectmanager/vcprojectmanagerplugin.cpp b/src/plugins/vcprojectmanager/vcprojectmanagerplugin.cpp
index 51ae6cb0b3..39b38b6231 100644
--- a/src/plugins/vcprojectmanager/vcprojectmanagerplugin.cpp
+++ b/src/plugins/vcprojectmanager/vcprojectmanagerplugin.cpp
@@ -2,6 +2,8 @@
#include "vcprojectmanager.h"
#include "vcprojectmanagerconstants.h"
+#include "vcprojectbuildconfiguration.h"
+#include "vcmakestep.h"
// TODO: clean up
#include <coreplugin/actionmanager/actionmanager.h>
@@ -48,6 +50,8 @@ bool VcProjectManagerPlugin::initialize(const QStringList &arguments, QString *e
return false;
addAutoReleasedObject(new VcManager);
+ addAutoReleasedObject(new VcProjectBuildConfigurationFactory);
+ addAutoReleasedObject(new VcMakeStepFactory);
return true;
}