diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index d3a60ae9a0e70f248925baa83d809d42d264637e..3440cfac250dfb166c86862cfe406314a7926139 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -667,7 +667,7 @@ bool CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader MakeStep *cleanMakeStep = new MakeStep(this); insertCleanStep(0, cleanMakeStep); - cleanMakeStep->setValue("clean", true); + cleanMakeStep->setClean(true); setActiveBuildConfiguration(bc); } else { // We have a user file, but we could still be missing the cbp file diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp index 3a9b975882e92a0e3734f3604d6e13cda9d2f4b3..c102774b75759f4f85bab43c074078303933f12c 100644 --- a/src/plugins/cmakeprojectmanager/makestep.cpp +++ b/src/plugins/cmakeprojectmanager/makestep.cpp @@ -42,7 +42,7 @@ using namespace CMakeProjectManager; using namespace CMakeProjectManager::Internal; MakeStep::MakeStep(CMakeProject *pro) - : AbstractMakeStep(pro), m_pro(pro) + : AbstractMakeStep(pro), m_pro(pro), m_clean(false) { m_percentProgress = QRegExp("^\\[\\s*(\\d*)%\\]"); } @@ -52,27 +52,70 @@ MakeStep::~MakeStep() } +void MakeStep::setClean(bool clean) +{ + m_clean = clean; +} + +void MakeStep::restoreFromMap(const QMap<QString, QVariant> &map) +{ + if (map.value("clean").isValid() && map.value("clean").toBool()) + m_clean = true; + ProjectExplorer::AbstractMakeStep::restoreFromMap(map); +} + +void MakeStep::storeIntoMap(QMap<QString, QVariant> &map) +{ + if (m_clean) + map["clean"] = true; + ProjectExplorer::AbstractMakeStep::storeIntoMap(map); +} + +void MakeStep::restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map) +{ + m_values[buildConfiguration].buildTargets = map["buildTargets"].toStringList(); + m_values[buildConfiguration].additionalArguments = map["additionalArguments"].toStringList(); + ProjectExplorer::AbstractMakeStep::restoreFromMap(buildConfiguration, map); +} + +void MakeStep::storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map) +{ + map["buildTargets"] = m_values.value(buildConfiguration).buildTargets; + map["additionalArguments"] = m_values.value(buildConfiguration).additionalArguments; + ProjectExplorer::AbstractMakeStep::storeIntoMap(buildConfiguration, map); +} + + +void MakeStep::addBuildConfiguration(const QString & name) +{ + m_values.insert(name, MakeStepSettings()); +} + +void MakeStep::removeBuildConfiguration(const QString & name) +{ + m_values.remove(name); +} + +void MakeStep::copyBuildConfiguration(const QString &source, const QString &dest) +{ + m_values.insert(dest, m_values.value(source)); +} + bool MakeStep::init(const QString &buildConfiguration) { ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(buildConfiguration); setBuildParser(m_pro->buildParser(bc)); - setEnabled(buildConfiguration, true); - setWorkingDirectory(buildConfiguration, m_pro->buildDirectory(bc)); + setEnabled(true); + setWorkingDirectory(m_pro->buildDirectory(bc)); - setCommand(buildConfiguration, m_pro->toolChain(bc)->makeCommand()); - - if (!value(buildConfiguration, "cleanConfig").isValid() &&value("clean").isValid() && value("clean").toBool()) { - // Import old settings - setValue(buildConfiguration, "cleanConfig", true); - setAdditionalArguments(buildConfiguration, QStringList() << "clean"); - } + setCommand(m_pro->toolChain(bc)->makeCommand()); - QStringList arguments = value(buildConfiguration, "buildTargets").toStringList(); + QStringList arguments = m_values.value(buildConfiguration).buildTargets; arguments << additionalArguments(buildConfiguration); - setArguments(buildConfiguration, arguments); // TODO - setEnvironment(buildConfiguration, m_pro->environment(bc)); - setIgnoreReturnValue(buildConfiguration, value(buildConfiguration, "cleanConfig").isValid()); + setArguments(arguments); // TODO + setEnvironment(m_pro->environment(bc)); + setIgnoreReturnValue(m_clean); return AbstractMakeStep::init(buildConfiguration); } @@ -125,28 +168,27 @@ CMakeProject *MakeStep::project() const bool MakeStep::buildsTarget(const QString &buildConfiguration, const QString &target) const { - return value(buildConfiguration, "buildTargets").toStringList().contains(target); + return m_values.value(buildConfiguration).buildTargets.contains(target); } void MakeStep::setBuildTarget(const QString &buildConfiguration, const QString &target, bool on) { - QStringList old = value(buildConfiguration, "buildTargets").toStringList(); + QStringList old = m_values.value(buildConfiguration).buildTargets; if (on && !old.contains(target)) - old.append(target); + old << target; else if(!on && old.contains(target)) old.removeOne(target); - - setValue(buildConfiguration, "buildTargets", old); + m_values[buildConfiguration].buildTargets = old; } QStringList MakeStep::additionalArguments(const QString &buildConfiguration) const { - return value(buildConfiguration, "additionalArguments").toStringList(); + return m_values.value(buildConfiguration).additionalArguments; } void MakeStep::setAdditionalArguments(const QString &buildConfiguration, const QStringList &list) { - setValue(buildConfiguration, "additionalArguments", list); + m_values[buildConfiguration].additionalArguments = list; } // @@ -202,12 +244,6 @@ QString MakeStepConfigWidget::displayName() const void MakeStepConfigWidget::init(const QString &buildConfiguration) { - if (!m_makeStep->value(buildConfiguration, "cleanConfig").isValid() && m_makeStep->value("clean").isValid() && m_makeStep->value("clean").toBool()) { - // Import old settings - m_makeStep->setValue(buildConfiguration, "cleanConfig", true); - m_makeStep->setAdditionalArguments(buildConfiguration, QStringList() << "clean"); - } - // disconnect to make the changes to the items disconnect(m_targetsList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*))); m_buildConfiguration = buildConfiguration; @@ -225,7 +261,7 @@ void MakeStepConfigWidget::init(const QString &buildConfiguration) void MakeStepConfigWidget::updateDetails() { - QStringList arguments = m_makeStep->value(m_buildConfiguration, "buildTargets").toStringList(); + QStringList arguments = m_makeStep->m_values.value(m_buildConfiguration).buildTargets; arguments << m_makeStep->additionalArguments(m_buildConfiguration); m_summaryText = tr("<b>Make:</b> %1 %2") .arg(m_makeStep->project()->toolChain( diff --git a/src/plugins/cmakeprojectmanager/makestep.h b/src/plugins/cmakeprojectmanager/makestep.h index 404e2bcea9b9f0029e9a27d87d11834d86f74867..05062c90c1f91c416f232bc910c3cfbb5c46cab8 100644 --- a/src/plugins/cmakeprojectmanager/makestep.h +++ b/src/plugins/cmakeprojectmanager/makestep.h @@ -43,9 +43,17 @@ namespace Internal { class CMakeProject; +struct MakeStepSettings +{ + QStringList buildTargets; + QStringList additionalArguments; +}; + class MakeStep : public ProjectExplorer::AbstractMakeStep { Q_OBJECT + friend class MakeStepConfigWidget; // TODO remove + // This is for modifying m_values public: MakeStep(CMakeProject *pro); ~MakeStep(); @@ -62,13 +70,27 @@ public: void setBuildTarget(const QString &buildConfiguration, const QString &target, bool on); QStringList additionalArguments(const QString &buildConfiguration) const; void setAdditionalArguments(const QString &buildConfiguration, const QStringList &list); + + virtual void restoreFromMap(const QMap<QString, QVariant> &map); + virtual void storeIntoMap(QMap<QString, QVariant> &map); + + void setClean(bool clean); + + virtual void restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map); + virtual void storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map); + + virtual void addBuildConfiguration(const QString & name); + virtual void removeBuildConfiguration(const QString & name); + virtual void copyBuildConfiguration(const QString &source, const QString &dest); protected: // For parsing [ 76%] virtual void stdOut(const QString &line); private: CMakeProject *m_pro; + bool m_clean; QRegExp m_percentProgress; QFutureInterface<bool> *m_futureInterface; + QMap<QString, MakeStepSettings> m_values; }; class MakeStepConfigWidget :public ProjectExplorer::BuildStepConfigWidget diff --git a/src/plugins/genericprojectmanager/genericmakestep.cpp b/src/plugins/genericprojectmanager/genericmakestep.cpp index 57e648d455e4c5fa1440526a7c91d9fd2eb39b3c..d418eea038962f57a26d76ae53623cf1232264bc 100644 --- a/src/plugins/genericprojectmanager/genericmakestep.cpp +++ b/src/plugins/genericprojectmanager/genericmakestep.cpp @@ -63,24 +63,56 @@ bool GenericMakeStep::init(const QString &buildConfigurationName) setBuildParser(buildParser); qDebug() << "*** build parser:" << buildParser; - setEnabled(buildConfigurationName, true); + setEnabled(true); Core::VariableManager *vm = Core::VariableManager::instance(); const QString rawBuildDir = m_pro->buildDirectory(bc); const QString buildDir = vm->resolve(rawBuildDir); - setWorkingDirectory(buildConfigurationName, buildDir); + setWorkingDirectory(buildDir); - setCommand(buildConfigurationName, makeCommand(buildConfigurationName)); - setArguments(buildConfigurationName, replacedArguments(buildConfigurationName)); + setCommand(makeCommand(buildConfigurationName)); + setArguments(replacedArguments(buildConfigurationName)); - setEnvironment(buildConfigurationName, m_pro->environment(bc)); + setEnvironment(m_pro->environment(bc)); return AbstractMakeStep::init(buildConfigurationName); } +void GenericMakeStep::restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map) +{ + m_values[buildConfiguration].buildTargets = map.value("buildTargets").toStringList(); + m_values[buildConfiguration].makeArguments = map.value("makeArguments").toStringList(); + m_values[buildConfiguration].makeCommand = map.value("makeCommand").toString(); + ProjectExplorer::AbstractMakeStep::restoreFromMap(buildConfiguration, map); +} + +void GenericMakeStep::storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map) +{ + map["buildTargets"] = m_values.value(buildConfiguration).buildTargets; + map["makeArguments"] = m_values.value(buildConfiguration).makeArguments; + map["makeCommand"] = m_values.value(buildConfiguration).makeCommand; + ProjectExplorer::AbstractMakeStep::storeIntoMap(buildConfiguration, map); +} + +void GenericMakeStep::addBuildConfiguration(const QString & name) +{ + m_values.insert(name, GenericMakeStepSettings()); +} + +void GenericMakeStep::removeBuildConfiguration(const QString & name) +{ + m_values.remove(name); +} + +void GenericMakeStep::copyBuildConfiguration(const QString &source, const QString &dest) +{ + m_values.insert(dest, m_values.value(source)); +} + + QStringList GenericMakeStep::replacedArguments(const QString &buildConfiguration) const { Core::VariableManager *vm = Core::VariableManager::instance(); - const QStringList targets = value(buildConfiguration, "buildTargets").toStringList(); - QStringList arguments = value(buildConfiguration, "makeArguments").toStringList(); + const QStringList targets = m_values.value(buildConfiguration).buildTargets; + QStringList arguments = m_values.value(buildConfiguration).makeArguments; QStringList replacedArguments; foreach (const QString &arg, arguments) { replacedArguments.append(vm->resolve(arg)); @@ -93,7 +125,7 @@ QStringList GenericMakeStep::replacedArguments(const QString &buildConfiguration QString GenericMakeStep::makeCommand(const QString &buildConfiguration) const { - QString command = value(buildConfiguration, "makeCommand").toString(); + QString command = m_values.value(buildConfiguration).makeCommand; if (command.isEmpty()) { if (ProjectExplorer::ToolChain *toolChain = m_pro->toolChain()) command = toolChain->makeCommand(); @@ -135,17 +167,18 @@ GenericProject *GenericMakeStep::project() const bool GenericMakeStep::buildsTarget(const QString &buildConfiguration, const QString &target) const { - return value(buildConfiguration, "buildTargets").toStringList().contains(target); + return m_values.value(buildConfiguration).buildTargets.contains(target); } void GenericMakeStep::setBuildTarget(const QString &buildConfiguration, const QString &target, bool on) { - QStringList old = value(buildConfiguration, "buildTargets").toStringList(); + QStringList old = m_values.value(buildConfiguration).buildTargets; if (on && !old.contains(target)) - old << target; + old << target; else if(!on && old.contains(target)) old.removeOne(target); - setValue(buildConfiguration, "buildTargets", old); + + m_values[buildConfiguration].buildTargets = old; } // @@ -196,11 +229,10 @@ void GenericMakeStepConfigWidget::init(const QString &buildConfiguration) updateMakeOverrrideLabel(); - QString makeCommand = m_makeStep->value(buildConfiguration, "makeCommand").toString(); + QString makeCommand = m_makeStep->m_values.value(buildConfiguration).makeCommand; m_ui->makeLineEdit->setText(makeCommand); - const QStringList &makeArguments = - m_makeStep->value(buildConfiguration, "makeArguments").toStringList(); + const QStringList &makeArguments = m_makeStep->m_values.value(buildConfiguration).makeArguments; m_ui->makeArgumentsLineEdit->setText(ProjectExplorer::Environment::joinArgumentList(makeArguments)); // Disconnect to make the changes to the items @@ -240,15 +272,15 @@ void GenericMakeStepConfigWidget::itemChanged(QListWidgetItem *item) void GenericMakeStepConfigWidget::makeLineEditTextEdited() { QTC_ASSERT(!m_buildConfiguration.isNull(), return); - m_makeStep->setValue(m_buildConfiguration, "makeCommand", m_ui->makeLineEdit->text()); + m_makeStep->m_values[m_buildConfiguration].makeCommand = m_ui->makeLineEdit->text(); updateDetails(); } void GenericMakeStepConfigWidget::makeArgumentsLineEditTextEdited() { QTC_ASSERT(!m_buildConfiguration.isNull(), return); - m_makeStep->setValue(m_buildConfiguration, "makeArguments", - ProjectExplorer::Environment::parseCombinedArgString(m_ui->makeArgumentsLineEdit->text())); + m_makeStep->m_values[m_buildConfiguration].makeArguments = + ProjectExplorer::Environment::parseCombinedArgString(m_ui->makeArgumentsLineEdit->text()); updateDetails(); } diff --git a/src/plugins/genericprojectmanager/genericmakestep.h b/src/plugins/genericprojectmanager/genericmakestep.h index afcb48ead0c0164cd2d8fd279321a0a3537a91b5..5ec2dc5eaec444b3f3a06a9fce1ed08989b7a7e4 100644 --- a/src/plugins/genericprojectmanager/genericmakestep.h +++ b/src/plugins/genericprojectmanager/genericmakestep.h @@ -44,10 +44,20 @@ namespace GenericProjectManager { namespace Internal { class GenericProject; +class GenericMakeStepConfigWidget; + +struct GenericMakeStepSettings +{ + QStringList buildTargets; + QStringList makeArguments; + QString makeCommand; +}; class GenericMakeStep : public ProjectExplorer::AbstractMakeStep { Q_OBJECT + friend class GenericMakeStepConfigWidget; // TODO remove again? + // Currently the ConfigWidget accesses the m_values directly public: GenericMakeStep(GenericProject *pro); ~GenericMakeStep(); @@ -64,8 +74,16 @@ public: void setBuildTarget(const QString &buildConfiguration, const QString &target, bool on); QStringList replacedArguments(const QString &buildConfiguration) const; QString makeCommand(const QString &buildConfiguration) const; + + virtual void restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map); + virtual void storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map); + + virtual void addBuildConfiguration(const QString & name); + virtual void removeBuildConfiguration(const QString & name); + virtual void copyBuildConfiguration(const QString &source, const QString &dest); private: GenericProject *m_pro; + QMap<QString, GenericMakeStepSettings> m_values; }; class GenericMakeStepConfigWidget :public ProjectExplorer::BuildStepConfigWidget diff --git a/src/plugins/projectexplorer/abstractmakestep.cpp b/src/plugins/projectexplorer/abstractmakestep.cpp index 85f2a45d224139553bc94934f3140bc25a1ec383..3f2d6ee382776d60b5860e2a5a555e4f7580df2e 100644 --- a/src/plugins/projectexplorer/abstractmakestep.cpp +++ b/src/plugins/projectexplorer/abstractmakestep.cpp @@ -64,7 +64,7 @@ bool AbstractMakeStep::init(const QString &buildConfiguration) m_buildConfiguration = buildConfiguration; m_openDirectories.clear(); - addDirectory(workingDirectory(buildConfiguration)); + addDirectory(workingDirectory()); return AbstractProcessStep::init(buildConfiguration); } diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp index e3b7757881ea3ab21ea8545db5c4491bb694535f..90b86978b130f2e1fca6ee4e8364d86b8f459f08 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.cpp +++ b/src/plugins/projectexplorer/abstractprocessstep.cpp @@ -39,92 +39,54 @@ using namespace ProjectExplorer; -static const char * const PROCESS_COMMAND = "abstractProcess.command"; -static const char * const PROCESS_WORKINGDIRECTORY = "abstractProcess.workingDirectory"; -static const char * const PROCESS_ARGUMENTS = "abstractProcess.arguments"; -static const char * const PROCESS_ENABLED = "abstractProcess.enabled"; -static const char * const PROCESS_ENVIRONMENT = "abstractProcess.Environment"; -static const char * const PROCESS_IGNORE_RETURN_VALUE = "abstractProcess.IgnoreReturnValue"; - AbstractProcessStep::AbstractProcessStep(Project *pro) : BuildStep(pro) { } -void AbstractProcessStep::setCommand(const QString &buildConfiguration, const QString &cmd) -{ - setValue(buildConfiguration, PROCESS_COMMAND, cmd); -} - -QString AbstractProcessStep::command(const QString &buildConfiguration) const -{ - QString result = value(buildConfiguration, PROCESS_COMMAND).toString(); - if (QFileInfo(result).isRelative()) { - QString searchInPath = environment(buildConfiguration).searchInPath(result); - if (!searchInPath.isEmpty()) - result = searchInPath; - } - return result; -} - -void AbstractProcessStep::setWorkingDirectory(const QString &buildConfiguration, const QString &workingDirectory) -{ - setValue(buildConfiguration, PROCESS_WORKINGDIRECTORY, workingDirectory); -} - -QString AbstractProcessStep::workingDirectory(const QString &buildConfiguration) const -{ - return value(buildConfiguration, PROCESS_WORKINGDIRECTORY).toString(); -} - -void AbstractProcessStep::setArguments(const QString &buildConfiguration, const QStringList &arguments) +void AbstractProcessStep::setCommand(const QString &cmd) { - setValue(buildConfiguration, PROCESS_ARGUMENTS, arguments); + m_command = cmd; } -QStringList AbstractProcessStep::arguments(const QString &buildConfiguration) const +QString AbstractProcessStep::workingDirectory() const { - return value(buildConfiguration, PROCESS_ARGUMENTS).toStringList(); + return m_workingDirectory; } -void AbstractProcessStep::setEnabled(const QString &buildConfiguration, bool b) +void AbstractProcessStep::setWorkingDirectory(const QString &workingDirectory) { - setValue(buildConfiguration, PROCESS_ENABLED, b); + m_workingDirectory = workingDirectory; } -bool AbstractProcessStep::enabled(const QString &buildConfiguration) const +void AbstractProcessStep::setArguments(const QStringList &arguments) { - return value(buildConfiguration, PROCESS_ENABLED).toBool(); + m_arguments = arguments; } -void AbstractProcessStep::setIgnoreReturnValue(const QString &buildConfiguration, bool b) +void AbstractProcessStep::setEnabled(bool b) { - setValue(buildConfiguration, PROCESS_IGNORE_RETURN_VALUE, b); + m_enabled = b; } -bool AbstractProcessStep::ignoreReturnValue(const QString &buildConfiguration) const +void AbstractProcessStep::setIgnoreReturnValue(bool b) { - return value(buildConfiguration, PROCESS_IGNORE_RETURN_VALUE).toBool(); + m_ignoreReturnValue = b; } -void AbstractProcessStep::setEnvironment(const QString &buildConfiguration, Environment env) +void AbstractProcessStep::setEnvironment(Environment env) { - setValue(buildConfiguration, PROCESS_ENVIRONMENT, env.toStringList()); + m_environment = env; } -Environment AbstractProcessStep::environment(const QString &buildConfiguration) const +bool AbstractProcessStep::init(const QString &buildConfiguration) { - return Environment(value(buildConfiguration, PROCESS_ENVIRONMENT).toStringList()); -} - -bool AbstractProcessStep::init(const QString &name) -{ - m_command = command(name); - m_arguments = arguments(name); - m_enabled = enabled(name); - m_workingDirectory = workingDirectory(name); - m_environment = environment(name); - m_ignoreReturnValue = ignoreReturnValue(name); + Q_UNUSED(buildConfiguration) + if (QFileInfo(m_command).isRelative()) { + QString searchInPath = m_environment.searchInPath(m_command); + if (!searchInPath.isEmpty()) + m_command = searchInPath; + } return true; } diff --git a/src/plugins/projectexplorer/abstractprocessstep.h b/src/plugins/projectexplorer/abstractprocessstep.h index 3d7cc5c019fc6a2b23a8943bd36ee7935029a036..fae2a7ad3d2a80c243b4f647dd02e2015f0a99d4 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.h +++ b/src/plugins/projectexplorer/abstractprocessstep.h @@ -80,39 +80,34 @@ public: virtual bool immutable() const = 0; /// setCommand() sets the executable to run in the \p buildConfiguration - void setCommand(const QString &buildConfiguration, const QString &cmd); - /// returns the executable that is run for the \p buildConfiguration - QString command(const QString &buildConfiguration) const; + /// should be called from init() + void setCommand(const QString &cmd); /// sets the workingDirectory for the process for a buildConfiguration - /// if no workingDirectory is set, it falls back to the projects workingDirectory TODO remove that magic, thats bad - void setWorkingDirectory(const QString &buildConfiguration, const QString &workingDirectory); - /// returns the workingDirectory for a \p buildConfiguration - QString workingDirectory(const QString &buildConfiguration) const; + /// should be called from init() + void setWorkingDirectory(const QString &workingDirectory); /// sets the command line arguments used by the process for a \p buildConfiguration - void setArguments(const QString &buildConfiguration, const QStringList &arguments); - /// returns the arguments used in the \p buildCOnfiguration - QStringList arguments(const QString &buildConfiguration) const; + /// should be called from init() + void setArguments(const QStringList &arguments); /// enables or disables a BuildStep /// Disabled BuildSteps immediately return true from their run method - void setEnabled(const QString &buildConfiguration, bool b); - /// returns wheter the BuildStep is disabled - bool enabled(const QString &buildConfiguration) const; - - /*! If ignoreReturnValue is set to true, then the abstractprocess step will - return sucess even if the return value indicates otherwise - */ - void setIgnoreReturnValue(const QString &buildConfiguration,bool b); - /*! returns ignoreReturnValue - */ - bool ignoreReturnValue(const QString &buildConfiguration) const; - - void setEnvironment(const QString &buildConfiguration, Environment env); - Environment environment(const QString &buildConfiguration) const; - + /// should be called from init() + void setEnabled(bool b); + + /// If ignoreReturnValue is set to true, then the abstractprocess step will + /// return sucess even if the return value indicates otherwise + /// should be called from init + void setIgnoreReturnValue(bool b); + /// Set the Environment for running the command + /// should be called from init() + void setEnvironment(Environment env); + + // TODO can I remove this? + QString workingDirectory() const; protected: + /// Called after the process is started /// the default implementation adds a process started message to the output message virtual void processStarted(); @@ -122,7 +117,13 @@ protected: /// Called if the process could not be started, /// by default adds a message to the output window virtual void processStartupFailed(); + /// Called for each line of output on stdOut() + /// the default implementation adds the line to the + /// application output window virtual void stdOut(const QString &line); + /// Called for each line of output on StdErrror() + /// the default implementation adds the line to the + /// application output window virtual void stdError(const QString &line); private slots: void processReadyReadStdOutput(); diff --git a/src/plugins/projectexplorer/buildstep.cpp b/src/plugins/projectexplorer/buildstep.cpp index 51d6e83161428d4a3940c81dfb70fcfed5fedb8a..57c45f0bead975db55a0ab360fbcbc99d43454c9 100644 --- a/src/plugins/projectexplorer/buildstep.cpp +++ b/src/plugins/projectexplorer/buildstep.cpp @@ -39,94 +39,55 @@ using namespace ProjectExplorer; BuildStep::BuildStep(Project * pro) : m_project(pro) { - m_configuration = new BuildConfiguration(""); } BuildStep::~BuildStep() { - qDeleteAll(m_buildConfigurations); - delete m_configuration; -} - -Project * BuildStep::project() const -{ - return m_project; -} -void BuildStep::addBuildConfiguration(const QString &name) -{ - m_buildConfigurations.push_back(new BuildConfiguration(name)); } -void BuildStep::removeBuildConfiguration(const QString &name) -{ - for (int i = 0; i != m_buildConfigurations.size(); ++i) - if (m_buildConfigurations.at(i)->name() == name) { - delete m_buildConfigurations.at(i); - m_buildConfigurations.removeAt(i); - break; - } -} -void BuildStep::copyBuildConfiguration(const QString &source, const QString &dest) +void BuildStep::restoreFromMap(const QMap<QString, QVariant> &map) { - for (int i = 0; i != m_buildConfigurations.size(); ++i) - if (m_buildConfigurations.at(i)->name() == source) - m_buildConfigurations.push_back(new BuildConfiguration(dest, m_buildConfigurations.at(i))); + Q_UNUSED(map) } -void BuildStep::setValue(const QString &buildConfiguration, const QString &name, const QVariant &value) +void BuildStep::storeIntoMap(QMap<QString, QVariant> &map) { - BuildConfiguration *bc = getBuildConfiguration(buildConfiguration); - Q_ASSERT(bc); - bc->setValue(name, value); + Q_UNUSED(map) } -void BuildStep::setValue(const QString &name, const QVariant &value) +void BuildStep::restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map) { - m_configuration->setValue(name, value); + Q_UNUSED(buildConfiguration) + Q_UNUSED(map) } -QVariant BuildStep::value(const QString &buildConfiguration, const QString &name) const +void BuildStep::storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map) { - BuildConfiguration *bc = getBuildConfiguration(buildConfiguration); - if (bc) - return bc->value(name); - else - return QVariant(); + Q_UNUSED(buildConfiguration) + Q_UNUSED(map) } -QVariant BuildStep::value(const QString &name) const -{ - return m_configuration->value(name); -} - -void BuildStep::setValuesFromMap(const QMap<QString, QVariant> & values) -{ - m_configuration->setValuesFromMap(values); -} - -void BuildStep::setValuesFromMap(const QString & buildConfiguration, const QMap<QString, QVariant> & values) +Project * BuildStep::project() const { - getBuildConfiguration(buildConfiguration)->setValuesFromMap(values); + return m_project; } -QMap<QString, QVariant> BuildStep::valuesToMap() +void BuildStep::addBuildConfiguration(const QString &name) { - return m_configuration->toMap(); + Q_UNUSED(name) } -QMap<QString, QVariant> BuildStep::valuesToMap(const QString & buildConfiguration) +void BuildStep::removeBuildConfiguration(const QString &name) { - return getBuildConfiguration(buildConfiguration)->toMap(); + Q_UNUSED(name) } -BuildConfiguration * BuildStep::getBuildConfiguration(const QString & name) const +void BuildStep::copyBuildConfiguration(const QString &source, const QString &dest) { - for (int i = 0; i != m_buildConfigurations.size(); ++i) - if (m_buildConfigurations.at(i)->name() == name) - return m_buildConfigurations.at(i); - return 0; + Q_UNUSED(source) + Q_UNUSED(dest) } bool BuildStep::immutable() const diff --git a/src/plugins/projectexplorer/buildstep.h b/src/plugins/projectexplorer/buildstep.h index e78f2d7ad9d984d296314c512d3240e34e5d59f6..08a8d1f67a076f67e2925fe76ee5f5acd03c31f6 100644 --- a/src/plugins/projectexplorer/buildstep.h +++ b/src/plugins/projectexplorer/buildstep.h @@ -92,17 +92,6 @@ public: // The name shown to the user virtual QString displayName() = 0; - // sets a value, which can be retrieved with value() - // these values are automatically saved and restored when qt creator is quit and restarted - void setValue(const QString &name, const QVariant &value); - // sets a value specific to a buildConfiguration - void setValue(const QString &buildConfiguration, const QString &name, const QVariant &value); - - // retrieves a value - QVariant value(const QString &name) const; - // retrieves a value specific to a buildConfiguration - QVariant value(const QString &buildConfiguration, const QString & name) const; - // the Widget shown in the project settings dialog for this buildStep // ownership is transfered to the caller virtual BuildStepConfigWidget *createConfigWidget() = 0; @@ -112,18 +101,17 @@ public: // the default implementation returns false virtual bool immutable() const; - Project *project() const; + virtual void restoreFromMap(const QMap<QString, QVariant> &map); + virtual void storeIntoMap(QMap<QString, QVariant> &map); -protected: - // internal function for restoring the configuration - void setValuesFromMap(const QMap<QString, QVariant> &values); - // internal function for restoring the configuration - void setValuesFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &values); + virtual void restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map); + virtual void storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map); - // internal function for storing the configuration - QMap<QString, QVariant> valuesToMap(); - // internal function for storing the configuration - QMap<QString, QVariant> valuesToMap(const QString & buildConfiguration); + virtual void addBuildConfiguration(const QString & name); + virtual void removeBuildConfiguration(const QString & name); + virtual void copyBuildConfiguration(const QString &source, const QString &dest); + + Project *project() const; Q_SIGNALS: void addToTaskWindow(const ProjectExplorer::TaskWindow::Task &task); @@ -132,13 +120,6 @@ Q_SIGNALS: void addToOutputWindow(const QString &string); private: - void addBuildConfiguration(const QString & name); - void removeBuildConfiguration(const QString & name); - BuildConfiguration *getBuildConfiguration(const QString & name) const; - void copyBuildConfiguration(const QString &source, const QString &dest); - - QList<BuildConfiguration *> m_buildConfigurations; - BuildConfiguration *m_configuration; Project *m_project; }; diff --git a/src/plugins/projectexplorer/processstep.cpp b/src/plugins/projectexplorer/processstep.cpp index 15c5b0d17ac981300423e29b8dfd309379ef7182..d3850455abc4586b33d62ca3de55534010971014 100644 --- a/src/plugins/projectexplorer/processstep.cpp +++ b/src/plugins/projectexplorer/processstep.cpp @@ -32,6 +32,7 @@ #include "project.h" #include <coreplugin/ifile.h> +#include <utils/qtcassert.h> #include <QtCore/QDebug> #include <QtGui/QFileDialog> @@ -39,6 +40,11 @@ using namespace ProjectExplorer; using namespace ProjectExplorer::Internal; +static const char * const PROCESS_COMMAND = "abstractProcess.command"; +static const char * const PROCESS_WORKINGDIRECTORY = "abstractProcess.workingDirectory"; +static const char * const PROCESS_ARGUMENTS = "abstractProcess.arguments"; +static const char * const PROCESS_ENABLED = "abstractProcess.enabled"; + ProcessStep::ProcessStep(Project *pro) : AbstractProcessStep(pro) { @@ -48,14 +54,12 @@ ProcessStep::ProcessStep(Project *pro) bool ProcessStep::init(const QString &buildConfigurationName) { BuildConfiguration *bc = project()->buildConfiguration(buildConfigurationName); - setEnvironment(buildConfigurationName, project()->environment(bc)); - QVariant wd = value(buildConfigurationName, "workingDirectory").toString(); - QString workingDirectory; - if (!wd.isValid() || wd.toString().isEmpty()) - workingDirectory = "$BUILDDIR"; - else - workingDirectory = wd.toString(); - setWorkingDirectory(buildConfigurationName, workingDirectory.replace("$BUILDDIR", project()->buildDirectory(bc))); + setEnvironment(project()->environment(bc)); + QString wd = workingDirectory(buildConfigurationName); + if (wd.isEmpty()) + wd = "$BUILDDIR"; + + AbstractProcessStep::setWorkingDirectory(wd.replace("$BUILDDIR", project()->buildDirectory(bc))); return AbstractProcessStep::init(buildConfigurationName); } @@ -69,19 +73,52 @@ QString ProcessStep::name() return "projectexplorer.processstep"; } +void ProcessStep::restoreFromMap(const QMap<QString, QVariant> &map) +{ + QMap<QString, QVariant>::const_iterator it = map.constFind("ProjectExplorer.ProcessStep.DisplayName"); + if (it != map.constEnd()) + m_name = (*it).toString(); + ProjectExplorer::AbstractProcessStep::restoreFromMap(map); +} + +void ProcessStep::storeIntoMap(QMap<QString, QVariant> &map) +{ + map["ProjectExplorer.ProcessStep.DisplayName"] = m_name; + ProjectExplorer::AbstractProcessStep::storeIntoMap(map); +} + +void ProcessStep::restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map) +{ + // TODO checking for PROCESS_* + setCommand(buildConfiguration, map.value(PROCESS_COMMAND).toString()); + setWorkingDirectory(buildConfiguration, map.value(PROCESS_WORKINGDIRECTORY).toString()); + setArguments(buildConfiguration, map.value(PROCESS_ARGUMENTS).toStringList()); + setEnabled(buildConfiguration, map.value(PROCESS_ENABLED).toBool()); + ProjectExplorer::AbstractProcessStep::restoreFromMap(buildConfiguration, map); +} + +void ProcessStep::storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map) +{ + map[PROCESS_COMMAND] = command(buildConfiguration); + map[PROCESS_WORKINGDIRECTORY] = workingDirectory(buildConfiguration); + map[PROCESS_ARGUMENTS] = arguments(buildConfiguration); + map[PROCESS_ENABLED] = enabled(buildConfiguration); + ProjectExplorer::AbstractProcessStep::storeIntoMap(buildConfiguration, map); +} + + void ProcessStep::setDisplayName(const QString &name) { if (name.isEmpty()) - setValue("ProjectExplorer.ProcessStep.DisplayName", QVariant()); + m_name = QString::null; else - setValue("ProjectExplorer.ProcessStep.DisplayName", name); + m_name = name; } QString ProcessStep::displayName() { - QVariant displayName = value("ProjectExplorer.ProcessStep.DisplayName"); - if (displayName.isValid()) - return displayName.toString(); + if (!m_name.isNull()) + return m_name; else return tr("Custom Process Step"); } @@ -96,6 +133,83 @@ bool ProcessStep::immutable() const return false; } +QString ProcessStep::command(const QString &buildConfiguration) const +{ + QMap<QString, ProcessStepSettings>::const_iterator it = m_values.constFind(buildConfiguration); + QTC_ASSERT(it != m_values.end(), return QString::null); + return (*it).command; +} + +QStringList ProcessStep::arguments(const QString &buildConfiguration) const +{ + QMap<QString, ProcessStepSettings>::const_iterator it = m_values.constFind(buildConfiguration); + QTC_ASSERT(it != m_values.end(), return QStringList()); + return (*it).arguments; +} + +bool ProcessStep::enabled(const QString &buildConfiguration) const +{ + QMap<QString, ProcessStepSettings>::const_iterator it = m_values.constFind(buildConfiguration); + QTC_ASSERT(it != m_values.end(), return false); + return (*it).enabled; +} + +QString ProcessStep::workingDirectory(const QString &buildConfiguration) const +{ + QMap<QString, ProcessStepSettings>::const_iterator it = m_values.constFind(buildConfiguration); + QTC_ASSERT(it != m_values.end(), return QString::null); + return (*it).workingDirectory; +} + +void ProcessStep::setCommand(const QString &buildConfiguration, const QString &command) +{ + QMap<QString, ProcessStepSettings>::iterator it = m_values.find(buildConfiguration); + QTC_ASSERT(it != m_values.end(), return); + it->command = command; +} + +void ProcessStep::setArguments(const QString &buildConfiguration, const QStringList &arguments) +{ + QMap<QString, ProcessStepSettings>::iterator it = m_values.find(buildConfiguration); + QTC_ASSERT(it != m_values.end(), return); + it->arguments = arguments; +} + +void ProcessStep::setEnabled(const QString &buildConfiguration, bool enabled) +{ + QMap<QString, ProcessStepSettings>::iterator it = m_values.find(buildConfiguration); + QTC_ASSERT(it != m_values.end(), return); + it->enabled = enabled; +} + +void ProcessStep::setWorkingDirectory(const QString &buildConfiguration, const QString &workingDirectory) +{ + QMap<QString, ProcessStepSettings>::iterator it = m_values.find(buildConfiguration); + QTC_ASSERT(it != m_values.end(), return); + it->workingDirectory = workingDirectory; +} + +void ProcessStep::addBuildConfiguration(const QString & name) +{ + QMap<QString, ProcessStepSettings>::const_iterator it = m_values.constFind(name); + QTC_ASSERT(it == m_values.constEnd(), return); + m_values.insert(name, ProcessStepSettings()); +} + +void ProcessStep::removeBuildConfiguration(const QString & name) +{ + QMap<QString, ProcessStepSettings>::const_iterator it = m_values.constFind(name); + QTC_ASSERT(it != m_values.constEnd(), return); + m_values.remove(name); +} + +void ProcessStep::copyBuildConfiguration(const QString &source, const QString &dest) +{ + QMap<QString, ProcessStepSettings>::const_iterator it = m_values.constFind(source); + QTC_ASSERT(it != m_values.constEnd(), return); + m_values.insert(dest, *it); +} + //******* // ProcessStepFactory //******* @@ -173,7 +287,7 @@ void ProcessStepConfigWidget::init(const QString &buildConfiguration) if (buildConfiguration != QString::null) { m_ui.command->setPath(m_step->command(buildConfiguration)); - QString workingDirectory = m_step->value(buildConfiguration, "workingDirectory").toString(); + QString workingDirectory = m_step->workingDirectory(buildConfiguration); if (workingDirectory.isEmpty()) workingDirectory = "$BUILDDIR"; m_ui.workingDirectory->setPath(workingDirectory); @@ -204,8 +318,7 @@ void ProcessStepConfigWidget::commandLineEditTextEdited() void ProcessStepConfigWidget::workingDirectoryLineEditTextEdited() { - QString wd = m_ui.workingDirectory->path(); - m_step->setValue(m_buildConfiguration, "workingDirectory", wd); + m_step->setWorkingDirectory(m_buildConfiguration, m_ui.workingDirectory->path()); } void ProcessStepConfigWidget::commandArgumentsLineEditTextEdited() diff --git a/src/plugins/projectexplorer/processstep.h b/src/plugins/projectexplorer/processstep.h index b0a7fcb04d67f8cf1e2e41257998125616d5bee9..2ec55fdb71af5fdd11f74a2cf083f31821eef069 100644 --- a/src/plugins/projectexplorer/processstep.h +++ b/src/plugins/projectexplorer/processstep.h @@ -50,6 +50,15 @@ public: virtual QString displayNameForName(const QString &name) const; }; +struct ProcessStepSettings +{ + QString command; + QStringList arguments; + QString workingDirectory; + Environment env; + bool enabled; +}; + class ProcessStep : public ProjectExplorer::AbstractProcessStep { Q_OBJECT @@ -63,8 +72,30 @@ public: virtual QString displayName(); virtual BuildStepConfigWidget *createConfigWidget(); virtual bool immutable() const; + + virtual void restoreFromMap(const QMap<QString, QVariant> &map); + virtual void storeIntoMap(QMap<QString, QVariant> &map); + + virtual void restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map); + virtual void storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map); + + virtual void addBuildConfiguration(const QString & name); + virtual void removeBuildConfiguration(const QString & name); + virtual void copyBuildConfiguration(const QString &source, const QString &dest); + + QString command(const QString &buildConfiguration) const; + QStringList arguments(const QString &buildConfiguration) const; + bool enabled(const QString &buildConfiguration) const; + QString workingDirectory(const QString &buildConfiguration) const; + + void setCommand(const QString &buildConfiguration, const QString &command); + void setArguments(const QString &buildConfiguration, const QStringList &arguments); + void setEnabled(const QString &buildConfiguration, bool enabled); + void setWorkingDirectory(const QString &buildConfiguration, const QString &workingDirectory); + private: QString m_name; + QMap<QString, ProcessStepSettings> m_values; }; class ProcessStepConfigWidget : public BuildStepConfigWidget diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index d13545c763956d80dfb2be16d365543be9444443..f9d1c389380dc70f0ef7cd42023b80a718458e17 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -66,10 +66,9 @@ Project::~Project() void Project::insertBuildStep(int position, BuildStep *step) { m_buildSteps.insert(position, step); - // check that the step has all the configurations + // add all BuildConfigurations foreach (const BuildConfiguration *bc, buildConfigurations()) - if (!step->getBuildConfiguration(bc->name())) - step->addBuildConfiguration(bc->name()); + step->addBuildConfiguration(bc->name()); } void Project::removeBuildStep(int position) @@ -87,10 +86,9 @@ void Project::moveBuildStepUp(int position) void Project::insertCleanStep(int position, BuildStep *step) { m_cleanSteps.insert(position, step); - // check that the step has all the configurations + // add all BuildConfigurations foreach (const BuildConfiguration *bc, buildConfigurations()) - if (!step->getBuildConfiguration(bc->name())) - step->addBuildConfiguration(bc->name()); + step->addBuildConfiguration(bc->name()); } void Project::removeCleanStep(int position) @@ -256,8 +254,9 @@ void Project::saveSettingsImpl(PersistentSettingsWriter &writer) //save buildstep configuration int buildstepnr = 0; foreach (BuildStep *buildStep, buildSteps()) { - QMap<QString, QVariant> buildConfiguration = buildStep->valuesToMap(); - writer.saveValue("buildstep" + QString().setNum(buildstepnr), buildConfiguration); + QMap<QString, QVariant> buildStepValues; + buildStep->storeIntoMap(buildStepValues); + writer.saveValue("buildstep" + QString().setNum(buildstepnr), buildStepValues); ++buildstepnr; } @@ -265,8 +264,8 @@ void Project::saveSettingsImpl(PersistentSettingsWriter &writer) foreach (const QString &buildConfigurationName, buildConfigurationNames) { buildstepnr = 0; foreach (BuildStep *buildStep, buildSteps()) { - QMap<QString, QVariant> temp = - buildStep->valuesToMap(buildConfigurationName); + QMap<QString, QVariant> temp; + buildStep->storeIntoMap(temp); writer.saveValue("buildconfiguration-" + buildConfigurationName + "-buildstep" + QString().setNum(buildstepnr), temp); ++buildstepnr; } @@ -275,8 +274,9 @@ void Project::saveSettingsImpl(PersistentSettingsWriter &writer) //save cleansteps buildconfiguration int cleanstepnr = 0; foreach (BuildStep *cleanStep, cleanSteps()) { - QMap<QString, QVariant> buildConfiguration = cleanStep->valuesToMap(); - writer.saveValue("cleanstep" + QString().setNum(cleanstepnr), buildConfiguration); + QMap<QString, QVariant> buildStepValues; + cleanStep->storeIntoMap(buildStepValues); + writer.saveValue("cleanstep" + QString().setNum(cleanstepnr), buildStepValues); ++cleanstepnr; } @@ -284,7 +284,8 @@ void Project::saveSettingsImpl(PersistentSettingsWriter &writer) foreach (const QString &buildConfigurationName, buildConfigurationNames) { cleanstepnr = 0; foreach (BuildStep *cleanStep, cleanSteps()) { - QMap<QString, QVariant> temp = cleanStep->valuesToMap(buildConfigurationName); + QMap<QString, QVariant> temp; + cleanStep->storeIntoMap(temp); writer.saveValue("buildconfiguration-" + buildConfigurationName + "-cleanstep" + QString().setNum(cleanstepnr), temp); ++cleanstepnr; } @@ -344,13 +345,13 @@ bool Project::restoreSettingsImpl(PersistentSettingsReader &reader) } // Restoring settings if (buildStep) { - QMap<QString, QVariant> buildConfiguration = reader.restoreValue("buildstep" + QString().setNum(buildstepnr)).toMap(); - buildStep->setValuesFromMap(buildConfiguration); + QMap<QString, QVariant> buildStepValues = reader.restoreValue("buildstep" + QString().setNum(buildstepnr)).toMap(); + buildStep->restoreFromMap(buildStepValues); foreach (const QString &buildConfigurationName, buildConfigurationNames) { //get the buildconfiguration for this build step - QMap<QString, QVariant> buildConfiguration = + QMap<QString, QVariant> buildStepValues = reader.restoreValue("buildconfiguration-" + buildConfigurationName + "-buildstep" + QString().setNum(buildstepnr)).toMap(); - buildStep->setValuesFromMap(buildConfigurationName, buildConfiguration); + buildStep->restoreFromMap(buildStepValues); } } } @@ -374,12 +375,12 @@ bool Project::restoreSettingsImpl(PersistentSettingsReader &reader) } // Restoring settings if (cleanStep) { - QMap<QString, QVariant> buildConfiguration = reader.restoreValue("cleanstep" + QString().setNum(cleanstepnr)).toMap(); - cleanStep->setValuesFromMap(buildConfiguration); + QMap<QString, QVariant> buildStepValues = reader.restoreValue("cleanstep" + QString().setNum(cleanstepnr)).toMap(); + cleanStep->restoreFromMap(buildStepValues); foreach (const QString &buildConfigurationName, buildConfigurationNames) { - QMap<QString, QVariant> buildConfiguration = + QMap<QString, QVariant> buildStepValues = reader.restoreValue("buildconfiguration-" + buildConfigurationName + "-cleanstep" + QString().setNum(cleanstepnr)).toMap(); - cleanStep->setValuesFromMap(buildConfigurationName, buildConfiguration); + cleanStep->restoreFromMap(buildStepValues); } } } diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp index 2201f7fdf9beb477761de455c136a2440d69ca99..8593ccca611fbdfb94a5caaab662abee618edc63 100644 --- a/src/plugins/qt4projectmanager/makestep.cpp +++ b/src/plugins/qt4projectmanager/makestep.cpp @@ -45,7 +45,7 @@ using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; MakeStep::MakeStep(Qt4Project * project) - : AbstractMakeStep(project) + : AbstractMakeStep(project), m_clean(false) { } @@ -55,20 +55,69 @@ MakeStep::~MakeStep() } +void MakeStep::setClean(bool clean) +{ + m_clean = clean; +} + +void MakeStep::restoreFromMap(const QMap<QString, QVariant> &map) +{ + if (map.value("clean").isValid() && map.value("clean").toBool()) + m_clean = true; + ProjectExplorer::AbstractMakeStep::restoreFromMap(map); +} + +void MakeStep::storeIntoMap(QMap<QString, QVariant> &map) +{ + if (m_clean) + map["clean"] = true; + ProjectExplorer::AbstractMakeStep::storeIntoMap(map); +} + +void MakeStep::restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map) +{ + m_values[buildConfiguration].makeargs = map.value("makeargs").toStringList(); + m_values[buildConfiguration].makeCmd = map.value("makeCmd").toString(); + ProjectExplorer::AbstractMakeStep::restoreFromMap(buildConfiguration, map); +} + +void MakeStep::storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map) +{ + map["makeargs"] = m_values.value(buildConfiguration).makeargs; + map["makeCmd"] = m_values.value(buildConfiguration).makeCmd; + ProjectExplorer::AbstractMakeStep::storeIntoMap(buildConfiguration, map); +} + +void MakeStep::addBuildConfiguration(const QString & name) +{ + m_values.insert(name, MakeStepSettings()); +} + +void MakeStep::removeBuildConfiguration(const QString & name) +{ + m_values.remove(name); +} + +void MakeStep::copyBuildConfiguration(const QString &source, const QString &dest) +{ + m_values.insert(dest, m_values.value(source)); +} + + bool MakeStep::init(const QString &name) { m_buildConfiguration = name; ProjectExplorer::BuildConfiguration *bc = project()->buildConfiguration(name); Environment environment = project()->environment(bc); - setEnvironment(name, environment); + setEnvironment(environment); Qt4Project *qt4project = qobject_cast<Qt4Project *>(project()); QString workingDirectory = qt4project->buildDirectory(bc); - setWorkingDirectory(name, workingDirectory); + setWorkingDirectory(workingDirectory); QString makeCmd = qt4project->makeCommand(bc); - if (!value(name, "makeCmd").toString().isEmpty()) - makeCmd = value(name, "makeCmd").toString(); + if (!m_values.value(name).makeCmd.isEmpty()) + makeCmd = m_values.value(name).makeCmd; if (!QFileInfo(makeCmd).isAbsolute()) { // Try to detect command in environment QString tmp = environment.searchInPath(makeCmd); @@ -79,19 +128,14 @@ bool MakeStep::init(const QString &name) } makeCmd = tmp; } - setCommand(name, makeCmd); + setCommand(makeCmd); - if (!value(name, "cleanConfig").isValid() && value("clean").isValid() && value("clean").toBool()) { - // Import old settings - setValue(name, "cleanConfig", true); - setValue(name, "makeargs", QStringList() << "clean"); - } // If we are cleaning, then make can fail with a error code, but that doesn't mean // we should stop the clean queue // That is mostly so that rebuild works on a alrady clean project - setIgnoreReturnValue(name, value(name, "cleanConfig").isValid()); - QStringList args = value(name, "makeargs").toStringList(); - if (!value(name, "cleanConfig").isValid()) { + setIgnoreReturnValue(m_clean); + QStringList args = m_values.value(name).makeargs; + if (!m_clean) { if (!qt4project->defaultMakeTarget(bc).isEmpty()) args << qt4project->defaultMakeTarget(bc); } @@ -106,12 +150,12 @@ bool MakeStep::init(const QString &name) if (toolchain) type = toolchain->type(); if (type != ProjectExplorer::ToolChain::MSVC && type != ProjectExplorer::ToolChain::WINCE) { - if (value(name, "makeCmd").toString().isEmpty()) + if (m_values.value(name).makeCmd.isEmpty()) args << "-w"; } - setEnabled(name, true); - setArguments(name, args); + setEnabled(true); + setArguments(args); if (type == ProjectExplorer::ToolChain::MSVC || type == ProjectExplorer::ToolChain::WINCE) setBuildParser(ProjectExplorer::Constants::BUILD_PARSER_MSVC); @@ -135,12 +179,6 @@ void MakeStep::run(QFutureInterface<bool> & fi) return; } - if (!enabled(m_buildConfiguration)) { - emit addToOutputWindow(tr("<font color=\"#0000ff\"><b>No Makefile found, assuming project is clean.</b></font>")); - fi.reportResult(true); - return; - } - AbstractMakeStep::run(fi); } @@ -164,9 +202,14 @@ ProjectExplorer::BuildStepConfigWidget *MakeStep::createConfigWidget() return new MakeStepConfigWidget(this); } +QStringList MakeStep::makeArguments(const QString &buildConfiguration) +{ + return m_values.value(buildConfiguration).makeargs; +} + void MakeStep::setMakeArguments(const QString &buildConfiguration, const QStringList &arguments) { - setValue(buildConfiguration, "makeargs", arguments); + m_values[buildConfiguration].makeargs = arguments; emit changed(); } @@ -204,8 +247,8 @@ void MakeStepConfigWidget::updateDetails() QString workingDirectory = pro->buildDirectory(bc); QString makeCmd = pro->makeCommand(bc); - if (!m_makeStep->value(m_buildConfiguration, "makeCmd").toString().isEmpty()) - makeCmd = m_makeStep->value(m_buildConfiguration, "makeCmd").toString(); + if (!m_makeStep->m_values.value(m_buildConfiguration).makeCmd.isEmpty()) + makeCmd = m_makeStep->m_values.value(m_buildConfiguration).makeCmd; if (!QFileInfo(makeCmd).isAbsolute()) { Environment environment = pro->environment(bc); // Try to detect command in environment @@ -222,13 +265,13 @@ void MakeStepConfigWidget::updateDetails() // FIXME doing this without the user having a way to override this is rather bad // so we only do it for unix and if the user didn't override the make command // but for now this is the least invasive change - QStringList args = m_makeStep->value(m_buildConfiguration, "makeargs").toStringList(); + QStringList args = m_makeStep->makeArguments(m_buildConfiguration); ProjectExplorer::ToolChain::ToolChainType t = ProjectExplorer::ToolChain::UNKNOWN; ProjectExplorer::ToolChain *toolChain = pro->toolChain(bc); if (toolChain) t = toolChain->type(); if (t != ProjectExplorer::ToolChain::MSVC && t != ProjectExplorer::ToolChain::WINCE) { - if (m_makeStep->value(m_buildConfiguration, "makeCmd").toString().isEmpty()) + if (m_makeStep->m_values.value(m_buildConfiguration).makeCmd.isEmpty()) args << "-w"; } m_summaryText = tr("<b>Make:</b> %1 %2 in %3").arg(QFileInfo(makeCmd).fileName(), args.join(" "), @@ -255,19 +298,12 @@ void MakeStepConfigWidget::init(const QString &buildConfiguration) { m_buildConfiguration = buildConfiguration; - if (!m_makeStep->value(buildConfiguration, "cleanConfig").isValid() && m_makeStep->value("clean").isValid() && m_makeStep->value("clean").toBool()) { - // Import old settings - m_makeStep->setValue(buildConfiguration, "cleanConfig", true); - m_makeStep->setValue(buildConfiguration, "makeargs", QStringList() << "clean"); - } - updateMakeOverrideLabel(); - const QString &makeCmd = m_makeStep->value(buildConfiguration, "makeCmd").toString(); + const QString &makeCmd = m_makeStep->m_values.value(buildConfiguration).makeCmd; m_ui.makeLineEdit->setText(makeCmd); - const QStringList &makeArguments = - m_makeStep->value(buildConfiguration, "makeargs").toStringList(); + const QStringList &makeArguments = m_makeStep->makeArguments(buildConfiguration); m_ui.makeArgumentsLineEdit->setText(ProjectExplorer::Environment::joinArgumentList(makeArguments)); updateDetails(); } @@ -275,14 +311,14 @@ void MakeStepConfigWidget::init(const QString &buildConfiguration) void MakeStepConfigWidget::makeLineEditTextEdited() { Q_ASSERT(!m_buildConfiguration.isNull()); - m_makeStep->setValue(m_buildConfiguration, "makeCmd", m_ui.makeLineEdit->text()); + m_makeStep->m_values[m_buildConfiguration].makeCmd = m_ui.makeLineEdit->text(); updateDetails(); } void MakeStepConfigWidget::makeArgumentsLineEditTextEdited() { Q_ASSERT(!m_buildConfiguration.isNull()); - m_makeStep->setValue(m_buildConfiguration, "makeargs", + m_makeStep->setMakeArguments(m_buildConfiguration, ProjectExplorer::Environment::parseCombinedArgString(m_ui.makeArgumentsLineEdit->text())); updateDetails(); } diff --git a/src/plugins/qt4projectmanager/makestep.h b/src/plugins/qt4projectmanager/makestep.h index be75435311de17104865f8597e2671d819525499..8883573ae09e81270d791f9bdd9802b1be83f623 100644 --- a/src/plugins/qt4projectmanager/makestep.h +++ b/src/plugins/qt4projectmanager/makestep.h @@ -60,9 +60,17 @@ public: class Qt4Project; +struct MakeStepSettings +{ + QStringList makeargs; + QString makeCmd; +}; + class MakeStep : public ProjectExplorer::AbstractMakeStep { Q_OBJECT + friend class MakeStepConfigWidget; // TODO remove this + // currently used to access m_values public: MakeStep(Qt4Project * project); ~MakeStep(); @@ -72,11 +80,26 @@ public: virtual QString displayName(); virtual ProjectExplorer::BuildStepConfigWidget *createConfigWidget(); virtual bool immutable() const; + QStringList makeArguments(const QString &buildConfiguration); void setMakeArguments(const QString &buildConfiguration, const QStringList &arguments); + + virtual void restoreFromMap(const QMap<QString, QVariant> &map); + virtual void storeIntoMap(QMap<QString, QVariant> &map); + + void setClean(bool clean); + + virtual void restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map); + virtual void storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map); + + virtual void addBuildConfiguration(const QString & name); + virtual void removeBuildConfiguration(const QString & name); + virtual void copyBuildConfiguration(const QString &source, const QString &dest); signals: void changed(); private: QString m_buildConfiguration; + bool m_clean; + QMap<QString, MakeStepSettings> m_values; }; class MakeStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp index 51fb62997189e02dd1c72689fcda54dae5fc7fc8..facd9ae3bb947f2ece8a81ea0afc3dcb0c413f30 100644 --- a/src/plugins/qt4projectmanager/qmakestep.cpp +++ b/src/plugins/qt4projectmanager/qmakestep.cpp @@ -60,7 +60,7 @@ QMakeStep::~QMakeStep() QStringList QMakeStep::arguments(const QString &buildConfiguration) { - QStringList additonalArguments = value(buildConfiguration, "qmakeArgs").toStringList(); + QStringList additonalArguments = m_values.value(buildConfiguration).qmakeArgs; ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(buildConfiguration); QStringList arguments; arguments << project()->file()->fileName(); @@ -121,24 +121,24 @@ bool QMakeStep::init(const QString &name) QString program = qtVersion->qmakeCommand(); // Check wheter we need to run qmake - bool needToRunQMake = true; + m_needToRunQMake = true; if (QDir(workingDirectory).exists(QLatin1String("Makefile"))) { QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(workingDirectory); if (qtVersion->qmakeCommand() == qmakePath) { - needToRunQMake = !m_pro->compareBuildConfigurationToImportFrom(bc, workingDirectory); + m_needToRunQMake = !m_pro->compareBuildConfigurationToImportFrom(bc, workingDirectory); } } if (m_forced) { m_forced = false; - needToRunQMake = true; + m_needToRunQMake = true; } - setEnabled(name, needToRunQMake); - setWorkingDirectory(name, workingDirectory); - setCommand(name, program); - setArguments(name, args); - setEnvironment(name, m_pro->environment(bc)); + setEnabled(m_needToRunQMake); + setWorkingDirectory(workingDirectory); + setCommand(program); + setArguments(args); + setEnvironment(m_pro->environment(bc)); setBuildParser(ProjectExplorer::Constants::BUILD_PARSER_QMAKE); return AbstractMakeStep::init(name); @@ -151,7 +151,7 @@ void QMakeStep::run(QFutureInterface<bool> &fi) return; } - if (!enabled(m_buildConfiguration)) { + if (!m_needToRunQMake) { emit addToOutputWindow(tr("<font color=\"#0000ff\">Configuration unchanged, skipping QMake step.</font>")); fi.reportResult(true); return; @@ -205,10 +205,42 @@ bool QMakeStep::processFinished(int exitCode, QProcess::ExitStatus status) void QMakeStep::setQMakeArguments(const QString &buildConfiguration, const QStringList &arguments) { - setValue(buildConfiguration, "qmakeArgs", arguments); + m_values[buildConfiguration].qmakeArgs = arguments; emit changed(); } +QStringList QMakeStep::qmakeArguments(const QString &buildConfiguration) +{ + return m_values[buildConfiguration].qmakeArgs; +} + +void QMakeStep::restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map) +{ + m_values[buildConfiguration].qmakeArgs = map.value("qmakeArgs").toStringList(); + AbstractProcessStep::restoreFromMap(buildConfiguration, map); +} + +void QMakeStep::storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map) +{ + map["qmakeArgs"] = m_values.value(buildConfiguration).qmakeArgs; + AbstractProcessStep::storeIntoMap(buildConfiguration, map); +} + +void QMakeStep::addBuildConfiguration(const QString & name) +{ + m_values.insert(name, QMakeStepSettings()); +} + +void QMakeStep::removeBuildConfiguration(const QString & name) +{ + m_values.remove(name); +} + +void QMakeStep::copyBuildConfiguration(const QString &source, const QString &dest) +{ + m_values.insert(dest, m_values.value(source)); +} + QMakeStepConfigWidget::QMakeStepConfigWidget(QMakeStep *step) : BuildStepConfigWidget(), m_step(step) { @@ -261,7 +293,8 @@ void QMakeStepConfigWidget::updateTitleLabel() void QMakeStepConfigWidget::qmakeArgumentsLineEditTextEdited() { Q_ASSERT(!m_buildConfiguration.isNull()); - m_step->setValue(m_buildConfiguration, "qmakeArgs", ProjectExplorer::Environment::parseCombinedArgString(m_ui.qmakeAdditonalArgumentsLineEdit->text())); + m_step->setQMakeArguments(m_buildConfiguration, + ProjectExplorer::Environment::parseCombinedArgString(m_ui.qmakeAdditonalArgumentsLineEdit->text())); static_cast<Qt4Project *>(m_step->project())->invalidateCachedTargetInformation(); updateTitleLabel(); @@ -300,7 +333,7 @@ void QMakeStepConfigWidget::update() void QMakeStepConfigWidget::init(const QString &buildConfiguration) { m_buildConfiguration = buildConfiguration; - QString qmakeArgs = ProjectExplorer::Environment::joinArgumentList(m_step->value(buildConfiguration, "qmakeArgs").toStringList()); + QString qmakeArgs = ProjectExplorer::Environment::joinArgumentList(m_step->qmakeArguments(buildConfiguration)); m_ui.qmakeAdditonalArgumentsLineEdit->setText(qmakeArgs); ProjectExplorer::BuildConfiguration *bc = m_step->project()->buildConfiguration(buildConfiguration); bool debug = QtVersion::QmakeBuildConfig(bc->value("buildConfiguration").toInt()) & QtVersion::DebugBuild; diff --git a/src/plugins/qt4projectmanager/qmakestep.h b/src/plugins/qt4projectmanager/qmakestep.h index f629c6663888bd45b93eb89a2a010549f9cf0626..0428747ff56ea5e1a5144ae81dc694dddd998a82 100644 --- a/src/plugins/qt4projectmanager/qmakestep.h +++ b/src/plugins/qt4projectmanager/qmakestep.h @@ -60,10 +60,16 @@ public: class Qt4Project; +struct QMakeStepSettings +{ + QStringList qmakeArgs; +}; + class QMakeStep : public ProjectExplorer::AbstractMakeStep { Q_OBJECT - + friend class Qt4Project; // TODO remove + // Currently used to access qmakeArgs public: QMakeStep(Qt4Project * project); ~QMakeStep(); @@ -77,8 +83,15 @@ public: void setForced(bool b); bool forced(); + QStringList qmakeArguments(const QString &buildConfiguration); void setQMakeArguments(const QString &buildConfiguraion, const QStringList &arguments); + virtual void restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map); + virtual void storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map); + + virtual void addBuildConfiguration(const QString & name); + virtual void removeBuildConfiguration(const QString & name); + virtual void copyBuildConfiguration(const QString &source, const QString &dest); signals: void changed(); @@ -92,6 +105,8 @@ private: QString m_buildConfiguration; QStringList m_lastEnv; bool m_forced; + bool m_needToRunQMake; // set in init(), read in run() + QMap<QString, QMakeStepSettings> m_values; }; diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index ede6604bcf0d61f30e15d26fa10bbabcd6e259c8..e00ae90be952256cb3d5bc78ab6bad1261b2e6b9 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -359,7 +359,8 @@ bool Qt4Project::restoreSettingsImpl(PersistentSettingsReader &settingsReader) { Project::restoreSettingsImpl(settingsReader); - addDefaultBuild(); + if (buildConfigurations().isEmpty()) + addDefaultBuild(); // Ensure that the qt version and tool chain in each build configuration is valid // or if not, is reset to the default @@ -450,11 +451,11 @@ void Qt4Project::addQt4BuildConfiguration(QString buildConfigurationName, QtVers addBuildConfiguration(bc); const QString &finalBuildConfigurationName = bc->name(); if (!additionalArguments.isEmpty()) - qmake->setValue(finalBuildConfigurationName, "qmakeArgs", additionalArguments); + qmake->m_values[finalBuildConfigurationName].qmakeArgs = additionalArguments; // set some options for qmake and make if (qmakeBuildConfiguration & QtVersion::BuildAll) // debug_and_release => explicit targets - make->setValue(finalBuildConfigurationName, "makeargs", QStringList() << (debug ? "debug" : "release")); + make->setMakeArguments(finalBuildConfigurationName, QStringList() << (debug ? "debug" : "release")); bc->setValue("buildConfiguration", int(qmakeBuildConfiguration)); @@ -817,52 +818,26 @@ QList<ProjectExplorer::Project*> Qt4Project::dependsOn() void Qt4Project::addDefaultBuild() { - if (buildConfigurations().isEmpty()) { - // We don't have any buildconfigurations, so this is a new project - // The Project Load Wizard is a work of art - // It will ask the user what kind of build setup he want - // It will add missing Qt Versions - // And get the project into a buildable state + // We don't have any buildconfigurations, so this is a new project + QMakeStep *qmakeStep = 0; + MakeStep *makeStep = 0; - //TODO have a better check wheter there is already a configuration? - QMakeStep *qmakeStep = 0; - MakeStep *makeStep = 0; + qmakeStep = new QMakeStep(this); + insertBuildStep(1, qmakeStep); - qmakeStep = new QMakeStep(this); - qmakeStep->setValue("mkspec", ""); - insertBuildStep(1, qmakeStep); + makeStep = new MakeStep(this); + insertBuildStep(2, makeStep); - makeStep = new MakeStep(this); - insertBuildStep(2, makeStep); + MakeStep* cleanStep = new MakeStep(this); + cleanStep->setClean(true); + insertCleanStep(1, cleanStep); - MakeStep* cleanStep = new MakeStep(this); - cleanStep->setValue("clean", true); - insertCleanStep(1, cleanStep); - - ProjectLoadWizard wizard(this); - wizard.execDialog(); - } else { - // Migrate settings - QMakeStep *qs = qmakeStep(); - foreach (BuildConfiguration *bc, buildConfigurations()) { - QVariant v = qs ? qs->value(bc->name(), "buildConfiguration") : QVariant(); - if (v.isValid()) { - qs->setValue(bc->name(), "buildConfiguration", QVariant()); - bc->setValue("buildConfiguration", v); - } else if (!bc->value("buildConfiguration").isValid()) { - if (QtVersion *version = qtVersion(bc)) - bc->setValue("buildConfiguration", int(version->defaultBuildConfig())); - else - bc->setValue("buildConfiguration", int(QtVersion::BuildAll & QtVersion::DebugBuild)); - } - } - - - // Restoring configuration - foreach(BuildConfiguration *bc, buildConfigurations()) { - bc->setValue("addQDumper", QVariant()); - } - } + // TODO this could probably refactored + // That is the ProjectLoadWizard divided into useful bits + // and this code then called here, instead of that strange forwarding + // to a wizard, which doesn't even show up + ProjectLoadWizard wizard(this); + wizard.execDialog(); } void Qt4Project::proFileParseError(const QString &errorMessage) @@ -1306,14 +1281,15 @@ bool Qt4Project::compareBuildConfigurationToImportFrom(BuildConfiguration *confi // now compare arguments lists // we have to compare without the spec/platform cmd argument // and compare that on its own - QString actualSpec = extractSpecFromArgumentList(qs->value(configuration->name(), "qmakeArgs").toStringList(), workingDirectory, version); + QString actualSpec = extractSpecFromArgumentList(qs->m_values.value(configuration->name()).qmakeArgs, workingDirectory, version); if (actualSpec.isEmpty()) { // Easy one the user has choosen not to override the settings actualSpec = version->mkspec(); } + QString parsedSpec = extractSpecFromArgumentList(result.second, workingDirectory, version); - QStringList actualArgs = removeSpecFromArgumentList(qs->value(configuration->name(), "qmakeArgs").toStringList()); + QStringList actualArgs = removeSpecFromArgumentList(qs->m_values.value(configuration->name()).qmakeArgs); QStringList parsedArgs = removeSpecFromArgumentList(result.second); if (debug) { diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp index 4c87287958c287a63ddd0362278ed8833e8648a2..e24e3fdb0571e193f7e9abc64f79e707813e4110 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp @@ -311,7 +311,7 @@ void Qt4ProjectConfigWidget::importLabelClicked() // If we are switching to BuildAll we want "release" in there and no "debug" // or "debug" in there and no "release" // If we are switching to not BuildAl we want neither "release" nor "debug" in there - QStringList makeCmdArguments = makeStep->value(m_buildConfiguration, "makeargs").toStringList(); + QStringList makeCmdArguments = makeStep->makeArguments(m_buildConfiguration); bool debug = qmakeBuildConfig & QtVersion::DebugBuild; if (qmakeBuildConfig & QtVersion::BuildAll) { makeCmdArguments.removeAll(debug ? "release" : "debug");