diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp index 7aa146484f9b3c0122fef6d3d67e4e043b74c73f..149501f5c75cfed28d21e13f03417bf710e075c9 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp @@ -183,11 +183,19 @@ BuildConfiguration *GenericBuildConfigurationFactory::create(ProjectExplorer::Ta bc->setDisplayName(buildConfigurationName); ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + ProjectExplorer::BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); + Q_ASSERT(buildSteps); GenericMakeStep *makeStep = new GenericMakeStep(buildSteps); buildSteps->insertStep(0, makeStep); makeStep->setBuildTarget("all", /* on = */ true); + Q_ASSERT(cleanSteps); + GenericMakeStep *cleanMakeStep = new GenericMakeStep(cleanSteps); + cleanSteps->insertStep(0, cleanMakeStep); + cleanMakeStep->setBuildTarget("clean", /* on = */ true); + cleanMakeStep->setClean(true); + target->addBuildConfiguration(bc); // also makes the name unique... return bc; } diff --git a/src/plugins/genericprojectmanager/genericmakestep.cpp b/src/plugins/genericprojectmanager/genericmakestep.cpp index 50ee3adfeb902c2a1fc1a986351b116cce7134ac..5db0853275db5c9f72af4e1157533969e4950170 100644 --- a/src/plugins/genericprojectmanager/genericmakestep.cpp +++ b/src/plugins/genericprojectmanager/genericmakestep.cpp @@ -64,16 +64,19 @@ const char * const GENERIC_MS_DISPLAY_NAME(QT_TRANSLATE_NOOP("GenericProjectMana const char * const BUILD_TARGETS_KEY("GenericProjectManager.GenericMakeStep.BuildTargets"); const char * const MAKE_ARGUMENTS_KEY("GenericProjectManager.GenericMakeStep.MakeArguments"); const char * const MAKE_COMMAND_KEY("GenericProjectManager.GenericMakeStep.MakeCommand"); +const char * const CLEAN_KEY("GenericProjectManager.GenericMakeStep.Clean"); } GenericMakeStep::GenericMakeStep(ProjectExplorer::BuildStepList *parent) : - AbstractProcessStep(parent, QLatin1String(GENERIC_MS_ID)) + AbstractProcessStep(parent, QLatin1String(GENERIC_MS_ID)), + m_clean(false) { ctor(); } GenericMakeStep::GenericMakeStep(ProjectExplorer::BuildStepList *parent, const QString &id) : - AbstractProcessStep(parent, id) + AbstractProcessStep(parent, id), + m_clean(false) { ctor(); } @@ -82,7 +85,8 @@ GenericMakeStep::GenericMakeStep(ProjectExplorer::BuildStepList *parent, Generic AbstractProcessStep(parent, bs), m_buildTargets(bs->m_buildTargets), m_makeArguments(bs->m_makeArguments), - m_makeCommand(bs->m_makeCommand) + m_makeCommand(bs->m_makeCommand), + m_clean(bs->m_clean) { ctor(); } @@ -114,6 +118,11 @@ bool GenericMakeStep::init() pp->setCommand(makeCommand()); pp->setArguments(allArguments()); + // If we are cleaning, then make can fail with an error code, but that doesn't mean + // we should stop the clean queue + // That is mostly so that rebuild works on an already clean project + setIgnoreReturnValue(m_clean); + setOutputParser(new ProjectExplorer::GnuMakeParser()); if (bc->genericTarget()->genericProject()->toolChain()) appendOutputParser(bc->genericTarget()->genericProject()->toolChain()->outputParser()); @@ -122,6 +131,16 @@ bool GenericMakeStep::init() return AbstractProcessStep::init(); } +void GenericMakeStep::setClean(bool clean) +{ + m_clean = clean; +} + +bool GenericMakeStep::isClean() const +{ + return m_clean; +} + QVariantMap GenericMakeStep::toMap() const { QVariantMap map(AbstractProcessStep::toMap()); @@ -129,6 +148,7 @@ QVariantMap GenericMakeStep::toMap() const map.insert(QLatin1String(BUILD_TARGETS_KEY), m_buildTargets); map.insert(QLatin1String(MAKE_ARGUMENTS_KEY), m_makeArguments); map.insert(QLatin1String(MAKE_COMMAND_KEY), m_makeCommand); + map.insert(QLatin1String(CLEAN_KEY), m_clean); return map; } @@ -137,6 +157,7 @@ bool GenericMakeStep::fromMap(const QVariantMap &map) m_buildTargets = map.value(QLatin1String(BUILD_TARGETS_KEY)).toStringList(); m_makeArguments = map.value(QLatin1String(MAKE_ARGUMENTS_KEY)).toString(); m_makeCommand = map.value(QLatin1String(MAKE_COMMAND_KEY)).toString(); + m_clean = map.value(QLatin1String(CLEAN_KEY)).toBool(); return BuildStep::fromMap(map); } diff --git a/src/plugins/genericprojectmanager/genericmakestep.h b/src/plugins/genericprojectmanager/genericmakestep.h index d321fdbd72dda6adf21f60fe47533bf7d8dbd3ee..bcbfe406977ad5585e8daff324ce262c07504e50 100644 --- a/src/plugins/genericprojectmanager/genericmakestep.h +++ b/src/plugins/genericprojectmanager/genericmakestep.h @@ -79,6 +79,9 @@ public: QString allArguments() const; QString makeCommand() const; + void setClean(bool clean); + bool isClean() const; + QVariantMap toMap() const; protected: @@ -92,6 +95,7 @@ private: QStringList m_buildTargets; QString m_makeArguments; QString m_makeCommand; + bool m_clean; }; class GenericMakeStepConfigWidget :public ProjectExplorer::BuildStepConfigWidget diff --git a/src/plugins/genericprojectmanager/generictarget.cpp b/src/plugins/genericprojectmanager/generictarget.cpp index 606ca36301a5a9592b6c46bcb3825a6b28f4e24e..8ee925413200987c8e4b34866f8d127fc8e3aa12 100644 --- a/src/plugins/genericprojectmanager/generictarget.cpp +++ b/src/plugins/genericprojectmanager/generictarget.cpp @@ -136,11 +136,17 @@ GenericTarget *GenericTargetFactory::create(ProjectExplorer::Project *parent, co bc->setDisplayName("all"); ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + ProjectExplorer::BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); + GenericMakeStep *makeStep = new GenericMakeStep(buildSteps); buildSteps->insertStep(0, makeStep); - makeStep->setBuildTarget("all", /* on = */ true); + GenericMakeStep *cleanMakeStep = new GenericMakeStep(cleanSteps); + cleanSteps->insertStep(0, cleanMakeStep); + cleanMakeStep->setBuildTarget("clean", /* on = */ true); + cleanMakeStep->setClean(true); + bc->setBuildDirectory(genericproject->projectDirectory()); t->addBuildConfiguration(bc);