diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index d0229bd8b11..b66ebb70c6a 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -207,30 +207,30 @@ void CMakeProject::parseCMakeLists() // Create run configurations for m_targets //qDebug()<<"Create run configurations of m_targets"; - QMap > existingRunConfigurations; + QMultiMap > existingRunConfigurations; foreach(QSharedPointer cmakeRunConfiguration, runConfigurations()) { if (QSharedPointer rc = cmakeRunConfiguration.dynamicCast()) { existingRunConfigurations.insert(rc->title(), rc); } } - bool setActive = false; + bool setActive = existingRunConfigurations.isEmpty(); foreach(const CMakeTarget &ct, m_targets) { if (ct.executable.isEmpty()) continue; if (ct.title.endsWith("/fast")) continue; - QMap >::iterator it = - existingRunConfigurations.find(ct.title); - if (it != existingRunConfigurations.end()) { + QList > list = existingRunConfigurations.values(ct.title); + if (!list.isEmpty()) { // Already exists, so override the settings... - QSharedPointer rc = it.value(); - //qDebug()<<"Updating Run Configuration with title"<executable(); - //qDebug()<<" WD new:"<workingDirectory(); - rc->setExecutable(ct.executable); - rc->setWorkingDirectory(ct.workingDirectory); - existingRunConfigurations.erase(it); + foreach (QSharedPointer rc, list) { + //qDebug()<<"Updating Run Configuration with title"<executable(); + //qDebug()<<" WD new:"<workingDirectory(); + rc->setExecutable(ct.executable); + rc->setWorkingDirectory(ct.workingDirectory); + } + existingRunConfigurations.remove(ct.title); } else { // Does not exist yet //qDebug()<<"Adding new run configuration with title"< rc(new CMakeRunConfiguration(this, ct.executable, ct.workingDirectory, ct.title)); addRunConfiguration(rc); // The first one gets the honour of beeing the active one - if (!setActive) { + if (setActive) { setActiveRunConfiguration(rc); - setActive = true; + setActive = false; } } } - QMap >::const_iterator it = + QMultiMap >::const_iterator it = existingRunConfigurations.constBegin(); for( ; it != existingRunConfigurations.constEnd(); ++it) { QSharedPointer rc = it.value(); @@ -282,8 +282,13 @@ QString CMakeProject::buildParser(const QString &buildConfiguration) const QStringList CMakeProject::targets() const { QStringList results; - foreach (const CMakeTarget &ct, m_targets) + foreach (const CMakeTarget &ct, m_targets) { + if (ct.executable.isEmpty()) + continue; + if (ct.title.endsWith("/fast")) + continue; results << ct.title; + } return results; } @@ -526,6 +531,14 @@ void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader parseCMakeLists(); // Gets the directory from the active buildconfiguration } +CMakeTarget CMakeProject::targetForTitle(const QString &title) +{ + foreach(const CMakeTarget &ct, m_targets) + if (ct.title == title) + return ct; + return CMakeTarget(); +} + CMakeFile::CMakeFile(CMakeProject *parent, QString fileName) : Core::IFile(parent), m_project(parent), m_fileName(fileName) { diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index 74b1a2f0eec..90934d1bcbb 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -101,6 +101,7 @@ public: MakeStep *makeStep() const; QStringList targets() const; QString buildParser(const QString &buildConfiguration) const; + CMakeTarget targetForTitle(const QString &title); protected: virtual void saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer); diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index bef4185ba94..817eeb35c3e 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -168,8 +168,11 @@ QStringList CMakeRunConfigurationFactory::canCreate(ProjectExplorer::Project *pr CMakeProject *pro = qobject_cast(project); if (!pro) return QStringList(); - // TODO gather all targets and return them here - return QStringList(); + QStringList allTargets = pro->targets(); + for (int i=0; i CMakeRunConfigurationFactory:: return rc; } else { // Adding new - // TODO extract target from type - QString file = type.mid(QString(Constants::CMAKERUNCONFIGURATION).length()); - QSharedPointer rc(new CMakeRunConfiguration(pro, file, QString::null, QString::null)); + const QString title = type.mid(QString(Constants::CMAKERUNCONFIGURATION).length()); + const CMakeTarget &ct = pro->targetForTitle(title); + QSharedPointer rc(new CMakeRunConfiguration(pro, ct.executable, ct.workingDirectory, ct.title)); return rc; } }