1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
11 ** Licensees holding valid Qt Commercial licenses may use this file in
12 ** accordance with the Qt Commercial License Agreement provided with the
13 ** Software or, alternatively, in accordance with the terms contained in
14 ** a written agreement between you and Nokia.
16 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 ** If you are unsure which license is appropriate for your use, please
26 ** contact the sales department at http://qt.nokia.com/contact.
28 **************************************************************************/
30 #include "qt4buildconfiguration.h"
32 #include "qt4project.h"
33 #include "qt4target.h"
34 #include "qt4projectmanagerconstants.h"
36 #include "qmakestep.h"
39 #include <utils/qtcassert.h>
41 #include <projectexplorer/buildsteplist.h>
42 #include <projectexplorer/projectexplorerconstants.h>
44 #include <QtCore/QDebug>
46 #include <QtGui/QInputDialog>
48 using namespace Qt4ProjectManager;
49 using namespace Qt4ProjectManager::Internal;
50 using namespace ProjectExplorer;
53 const char * const QT4_BC_ID_PREFIX("Qt4ProjectManager.Qt4BuildConfiguration.");
54 const char * const QT4_BC_ID("Qt4ProjectManager.Qt4BuildConfiguration");
56 const char * const USE_SHADOW_BUILD_KEY("Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild");
57 const char * const BUILD_DIRECTORY_KEY("Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory");
58 const char * const TOOLCHAIN_KEY("Qt4ProjectManager.Qt4BuildConfiguration.ToolChain");
59 const char * const BUILD_CONFIGURATION_KEY("Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration");
60 const char * const QT_VERSION_ID_KEY("Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId");
65 Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target) :
66 BuildConfiguration(target, QLatin1String(QT4_BC_ID)),
69 m_toolChainType(-1), // toolChainType() makes sure to return the default toolchainType
70 m_qmakeBuildConfiguration(0),
76 Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target, const QString &id) :
77 BuildConfiguration(target, id),
80 m_toolChainType(-1), // toolChainType() makes sure to return the default toolchainType
81 m_qmakeBuildConfiguration(0),
87 Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target, Qt4BuildConfiguration *source) :
88 BuildConfiguration(target, source),
89 m_shadowBuild(source->m_shadowBuild),
90 m_buildDirectory(source->m_buildDirectory),
91 m_qtVersionId(source->m_qtVersionId),
92 m_toolChainType(source->m_toolChainType),
93 m_qmakeBuildConfiguration(source->m_qmakeBuildConfiguration),
94 m_subNodeBuild(0) // temporary value, so not copied
100 Qt4BuildConfiguration::~Qt4BuildConfiguration()
104 QVariantMap Qt4BuildConfiguration::toMap() const
106 QVariantMap map(BuildConfiguration::toMap());
107 map.insert(QLatin1String(USE_SHADOW_BUILD_KEY), m_shadowBuild);
108 map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory);
109 map.insert(QLatin1String(QT_VERSION_ID_KEY), m_qtVersionId);
110 map.insert(QLatin1String(TOOLCHAIN_KEY), m_toolChainType);
111 map.insert(QLatin1String(BUILD_CONFIGURATION_KEY), int(m_qmakeBuildConfiguration));
116 bool Qt4BuildConfiguration::fromMap(const QVariantMap &map)
118 if (!BuildConfiguration::fromMap(map))
121 int fileVersion = map.value(ProjectExplorer::Constants::USERFILE_PREVIOUS_VERSION_KEY,
122 std::numeric_limits<int>::max()).toInt();
123 m_shadowBuild = map.value(QLatin1String(USE_SHADOW_BUILD_KEY), true).toBool();
124 m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY), qt4Target()->defaultBuildDirectory()).toString();
125 m_qtVersionId = map.value(QLatin1String(QT_VERSION_ID_KEY)).toInt();
126 m_toolChainType = map.value(QLatin1String(TOOLCHAIN_KEY)).toInt();
127 m_qmakeBuildConfiguration = QtVersion::QmakeBuildConfigs(map.value(QLatin1String(BUILD_CONFIGURATION_KEY)).toInt());
129 // Pick a Qt version if the default version is used:
130 // We assume that the default Qt version was used in earlier versions of Qt creator.
131 // Pick a Qt version that is supporting a desktop.
132 if (m_qtVersionId == 0) {
133 QList<QtVersion *> versions = QtVersionManager::instance()->versions();
134 foreach (QtVersion *v, versions) {
135 if (v->isValid() && v->supportsTargetId(QLatin1String(Constants::DESKTOP_TARGET_ID))) {
136 m_qtVersionId = v->uniqueId();
140 if (m_qtVersionId == 0)
141 m_qtVersionId = versions.at(0)->uniqueId();
144 QtVersion *version = qtVersion();
145 if (fileVersion >= 1) { // we are not upgrading from pre-targets!
146 if (version->isValid() && !version->supportedTargetIds().contains(target()->id())) {
147 qWarning() << "Buildconfiguration" << displayName() << ": Qt" << version->displayName() << "not supported by target" << target()->id();
151 if (!version->isValid() || !version->supportedTargetIds().contains(target()->id())) {
152 qWarning() << "Buildconfiguration" << displayName() << ": Qt" << version->displayName() << "not supported by target" << target()->id();
157 if (version->isValid())
158 m_shadowBuild = (m_shadowBuild && version->supportsShadowBuilds());
160 QList<ToolChain::ToolChainType> possibleTcs(qt4Target()->filterToolChainTypes(qtVersion()->possibleToolChainTypes()));
161 if (!possibleTcs.contains(toolChainType()))
162 setToolChainType(qt4Target()->preferredToolChainType(possibleTcs));
164 if (toolChainType() == ToolChain::INVALID) {
165 qWarning() << "No toolchain available for" << qtVersion()->displayName() << "used in" << target()->id() << "!";
172 void Qt4BuildConfiguration::ctor()
174 m_buildDirectory = qt4Target()->defaultBuildDirectory();
175 if (m_buildDirectory == target()->project()->projectDirectory())
176 m_shadowBuild = false;
178 m_lastEmmitedBuildDirectory = buildDirectory();
180 connect(this, SIGNAL(environmentChanged()),
181 this, SLOT(emitBuildDirectoryChanged()));
183 QtVersionManager *vm = QtVersionManager::instance();
184 connect(vm, SIGNAL(qtVersionsChanged(QList<int>)),
185 this, SLOT(qtVersionsChanged(QList<int>)));
188 void Qt4BuildConfiguration::emitBuildDirectoryChanged()
190 if (buildDirectory() != m_lastEmmitedBuildDirectory) {
191 m_lastEmmitedBuildDirectory = buildDirectory();
192 emit buildDirectoryChanged();
196 void Qt4BuildConfiguration::pickValidQtVersion()
198 QList<QtVersion *> versions = QtVersionManager::instance()->versionsForTargetId(qt4Target()->id());
199 if (!versions.isEmpty())
200 setQtVersion(versions.at(0));
202 setQtVersion(QtVersionManager::instance()->emptyVersion());
205 Qt4Target *Qt4BuildConfiguration::qt4Target() const
207 return static_cast<Qt4Target *>(target());
210 Utils::Environment Qt4BuildConfiguration::baseEnvironment() const
212 Utils::Environment env = BuildConfiguration::baseEnvironment();
213 qtVersion()->addToEnvironment(env);
215 // We can't call buildDirectory() since that uses environment() to expand,
216 // thus calling baseEnvironment() again
217 env.set(QLatin1String("BUILDDIR"), QDir::toNativeSeparators(env.expandVariables(rawBuildDirectory())));
219 ToolChain *tc = toolChain();
221 tc->addToEnvironment(env);
225 /// returns the unexpanded build directory
226 QString Qt4BuildConfiguration::rawBuildDirectory() const
228 QString workingDirectory;
230 if (!m_buildDirectory.isEmpty())
231 workingDirectory = m_buildDirectory;
233 workingDirectory = qt4Target()->defaultBuildDirectory();
235 if (workingDirectory.isEmpty())
236 workingDirectory = target()->project()->projectDirectory();
237 return workingDirectory;
240 /// returns the build directory
241 QString Qt4BuildConfiguration::buildDirectory() const
243 return QDir::cleanPath(environment().expandVariables(rawBuildDirectory()));
246 /// If only a sub tree should be build this function returns which sub node
248 /// \see Qt4BuildConfiguration::setSubNodeBuild
249 Qt4ProjectManager::Internal::Qt4ProFileNode *Qt4BuildConfiguration::subNodeBuild() const
251 return m_subNodeBuild;
254 /// A sub node build on builds a sub node of the project
255 /// That is triggered by a right click in the project explorer tree
256 /// The sub node to be build is set via this function immediately before
257 /// calling BuildManager::buildProject( BuildConfiguration * )
258 /// and reset immediately afterwards
259 /// That is m_subNodesBuild is set only temporarly
260 void Qt4BuildConfiguration::setSubNodeBuild(Qt4ProjectManager::Internal::Qt4ProFileNode *node)
262 m_subNodeBuild = node;
265 /// returns whether this is a shadow build configuration or not
266 /// note, even if shadowBuild() returns true, it might be using the
267 /// source directory as the shadow build directory, thus it
268 /// still is a in-source build
269 bool Qt4BuildConfiguration::shadowBuild() const
271 return m_shadowBuild;
274 /// returns the shadow build directory if set
275 /// \note buildDirectory() is probably the function you want to call
276 QString Qt4BuildConfiguration::shadowBuildDirectory() const
278 if (m_buildDirectory.isEmpty())
279 return qt4Target()->defaultBuildDirectory();
280 return m_buildDirectory;
283 void Qt4BuildConfiguration::setShadowBuildAndDirectory(bool shadowBuild, const QString &buildDirectory)
285 QtVersion *version = qtVersion();
286 QString directoryToSet = buildDirectory;
287 bool toSet = (shadowBuild && version->isValid() && version->supportsShadowBuilds());
288 if (m_shadowBuild == toSet && m_buildDirectory == directoryToSet)
291 m_shadowBuild = toSet;
292 m_buildDirectory = directoryToSet;
294 emit environmentChanged();
295 emitBuildDirectoryChanged();
296 emit proFileEvaluateNeeded(this);
299 ProjectExplorer::ToolChain *Qt4BuildConfiguration::toolChain() const
301 ToolChain::ToolChainType tct = toolChainType();
302 return qtVersion()->toolChain(tct);
305 QString Qt4BuildConfiguration::makeCommand() const
307 ToolChain *tc = toolChain();
308 return tc ? tc->makeCommand() : "make";
311 static inline QString symbianMakeTarget(QtVersion::QmakeBuildConfigs buildConfig,
314 QString rc = (buildConfig & QtVersion::DebugBuild) ?
315 QLatin1String("debug-") : QLatin1String("release-");
320 QString Qt4BuildConfiguration::defaultMakeTarget() const
322 ToolChain *tc = toolChain();
325 const QtVersion::QmakeBuildConfigs buildConfig = qmakeBuildConfiguration();
327 switch (tc->type()) {
328 case ToolChain::GCCE:
329 return symbianMakeTarget(buildConfig, QLatin1String("gcce"));
330 case ToolChain::RVCT_ARMV5:
331 return symbianMakeTarget(buildConfig, QLatin1String("armv5"));
332 case ToolChain::RVCT_ARMV6:
333 return symbianMakeTarget(buildConfig, QLatin1String("armv6"));
334 case ToolChain::RVCT_ARMV5_GNUPOC:
335 case ToolChain::GCCE_GNUPOC:
342 QString Qt4BuildConfiguration::makefile() const
344 if (qt4Target()->id() == Constants::S60_DEVICE_TARGET_ID)
346 return qt4Target()->qt4Project()->rootProjectNode()->makefile();
349 QtVersion *Qt4BuildConfiguration::qtVersion() const
351 QtVersionManager *vm = QtVersionManager::instance();
352 return vm->version(m_qtVersionId);
355 void Qt4BuildConfiguration::setQtVersion(QtVersion *version)
359 if (m_qtVersionId == version->uniqueId())
362 m_qtVersionId = version->uniqueId();
364 if (!version->possibleToolChainTypes().contains(ProjectExplorer::ToolChain::ToolChainType(m_toolChainType))) {
365 QList<ToolChain::ToolChainType> candidates =
366 qt4Target()->filterToolChainTypes(qtVersion()->possibleToolChainTypes());
367 if (candidates.isEmpty())
368 m_toolChainType = ToolChain::INVALID;
370 m_toolChainType = candidates.first();
373 m_shadowBuild = m_shadowBuild && qtVersion()->supportsShadowBuilds();
375 emit proFileEvaluateNeeded(this);
376 emit qtVersionChanged();
377 emit environmentChanged();
378 emitBuildDirectoryChanged();
381 void Qt4BuildConfiguration::setToolChainType(ProjectExplorer::ToolChain::ToolChainType type)
383 if (!qt4Target()->filterToolChainTypes(qtVersion()->possibleToolChainTypes()).contains(type)
384 || m_toolChainType == type)
387 m_toolChainType = type;
389 emit proFileEvaluateNeeded(this);
390 emit toolChainTypeChanged();
391 emit environmentChanged();
392 emitBuildDirectoryChanged();
395 ProjectExplorer::ToolChain::ToolChainType Qt4BuildConfiguration::toolChainType() const
397 return ToolChain::ToolChainType(m_toolChainType);
400 QtVersion::QmakeBuildConfigs Qt4BuildConfiguration::qmakeBuildConfiguration() const
402 return m_qmakeBuildConfiguration;
405 void Qt4BuildConfiguration::setQMakeBuildConfiguration(QtVersion::QmakeBuildConfigs config)
407 if (m_qmakeBuildConfiguration == config)
409 m_qmakeBuildConfiguration = config;
411 emit proFileEvaluateNeeded(this);
412 emit qmakeBuildConfigurationChanged();
415 void Qt4BuildConfiguration::emitProFileEvaluteNeeded()
417 emit proFileEvaluateNeeded(this);
420 void Qt4BuildConfiguration::emitQMakeBuildConfigurationChanged()
422 emit qmakeBuildConfigurationChanged();
425 void Qt4BuildConfiguration::emitBuildDirectoryInitialized()
427 emit buildDirectoryInitialized();
430 void Qt4BuildConfiguration::emitS60CreatesSmartInstallerChanged()
432 emit s60CreatesSmartInstallerChanged();
436 QStringList Qt4BuildConfiguration::configCommandLineArguments() const
439 QtVersion::QmakeBuildConfigs defaultBuildConfiguration = qtVersion()->defaultBuildConfig();
440 QtVersion::QmakeBuildConfigs userBuildConfiguration = m_qmakeBuildConfiguration;
441 if ((defaultBuildConfiguration & QtVersion::BuildAll) && !(userBuildConfiguration & QtVersion::BuildAll))
442 result << "CONFIG-=debug_and_release";
444 if (!(defaultBuildConfiguration & QtVersion::BuildAll) && (userBuildConfiguration & QtVersion::BuildAll))
445 result << "CONFIG+=debug_and_release";
446 if ((defaultBuildConfiguration & QtVersion::DebugBuild)
447 && !(userBuildConfiguration & QtVersion::DebugBuild)
448 && !(userBuildConfiguration & QtVersion::BuildAll))
449 result << "CONFIG+=release";
450 if (!(defaultBuildConfiguration & QtVersion::DebugBuild)
451 && (userBuildConfiguration & QtVersion::DebugBuild)
452 && !(userBuildConfiguration & QtVersion::BuildAll))
453 result << "CONFIG+=debug";
457 QMakeStep *Qt4BuildConfiguration::qmakeStep() const
460 BuildStepList *bsl = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
462 for (int i = 0; i < bsl->count(); ++i)
463 if ((qs = qobject_cast<QMakeStep *>(bsl->at(i))) != 0)
468 MakeStep *Qt4BuildConfiguration::makeStep() const
471 BuildStepList *bsl = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
473 for (int i = 0; i < bsl->count(); ++i)
474 if ((ms = qobject_cast<MakeStep *>(bsl->at(i))) != 0)
479 void Qt4BuildConfiguration::qtVersionsChanged(const QList<int> &changedVersions)
481 if (!changedVersions.contains(m_qtVersionId) ||
482 qtVersion()->isValid())
485 pickValidQtVersion();
488 // returns true if both are equal
489 bool Qt4BuildConfiguration::compareToImportFrom(const QString &makefile)
491 QMakeStep *qs = qmakeStep();
492 if (QFileInfo(makefile).exists() && qs) {
493 QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(makefile);
494 QtVersion *version = qtVersion();
495 if (version->qmakeCommand() == qmakePath) {
497 QPair<QtVersion::QmakeBuildConfigs, QStringList> result =
498 QtVersionManager::scanMakeFile(makefile, version->defaultBuildConfig());
499 if (qmakeBuildConfiguration() == result.first) {
500 // The qmake Build Configuration are the same,
501 // now compare arguments lists
502 // we have to compare without the spec/platform cmd argument
503 // and compare that on its own
504 QString workingDirectory = QFileInfo(makefile).absolutePath();
505 QString actualSpec = extractSpecFromArgumentList(qs->userArguments(), workingDirectory, version);
506 if (actualSpec.isEmpty()) {
507 // Easy one: the user has chosen not to override the settings
508 actualSpec = version->mkspec();
512 QString parsedSpec = extractSpecFromArgumentList(result.second, workingDirectory, version);
513 QStringList actualArgs = qs->moreArguments();
514 actualArgs << qs->userArguments();
515 actualArgs = removeSpecFromArgumentList(actualArgs);
516 QStringList parsedArgs = removeSpecFromArgumentList(result.second);
519 qDebug()<<"Actual args:"<<actualArgs;
520 qDebug()<<"Parsed args:"<<parsedArgs;
521 qDebug()<<"Actual spec:"<<actualSpec;
522 qDebug()<<"Parsed spec:"<<parsedSpec;
525 // Comparing the sorted list is obviously wrong
526 // Though haven written a more complete version
527 // that managed had around 200 lines and yet faild
528 // to be actually foolproof at all, I think it's
529 // not feasible without actually taking the qmake
530 // command line parsing code
532 // Things, sorting gets wrong:
533 // parameters to positional parameters matter
534 // e.g. -o -spec is different from -spec -o
535 // -o 1 -spec 2 is diffrent from -spec 1 -o 2
536 // variable assignment order matters
537 // variable assignment vs -after
538 // -norecursive vs. recursive
541 if (actualArgs == parsedArgs) {
542 // Specs match exactly
543 if (actualSpec == parsedSpec)
545 // Actual spec is the default one
546 // qDebug()<<"AS vs VS"<<actualSpec<<version->mkspec();
547 if ((actualSpec == version->mkspec() || actualSpec == "default")
548 && (parsedSpec == version->mkspec() || parsedSpec == "default" || parsedSpec.isEmpty()))
552 qDebug()<<"different qmake buildconfigurations buildconfiguration:"<<qmakeBuildConfiguration()<<" Makefile:"<<result.first;
555 qDebug()<<"diffrent qt versions, buildconfiguration:"<<version->qmakeCommand()<<" Makefile:"<<qmakePath;
561 QStringList Qt4BuildConfiguration::removeQMLInspectorFromArgumentList(const QStringList &old)
564 foreach (const QString &str, old)
565 if (!str.startsWith(QLatin1String(Constants::QMAKEVAR_QMLJSDEBUGGER_PATH)))
570 // We match -spec and -platfrom separetly
571 // We ignore -cache, because qmake contained a bug that it didn't
572 // mention the -cache in the Makefile
573 // That means changing the -cache option in the additional arguments
574 // does not automatically rerun qmake. Alas, we could try more
575 // intelligent matching for -cache, but i guess people rarely
578 QStringList Qt4BuildConfiguration::removeSpecFromArgumentList(const QStringList &old)
580 if (!old.contains("-spec") && !old.contains("-platform") && !old.contains("-cache"))
583 bool ignoreNext = false;
584 foreach(const QString &item, old) {
587 } else if (item == "-spec" || item == "-platform" || item == "-cache") {
596 QString Qt4BuildConfiguration::extractSpecFromArgumentList(const QStringList &list, QString directory, QtVersion *version)
598 int index = list.indexOf("-spec");
600 index = list.indexOf("-platform");
606 if (index >= list.length())
609 QString baseMkspecDir = version->versionInfo().value("QMAKE_MKSPECS");
610 if (baseMkspecDir.isEmpty())
611 baseMkspecDir = version->versionInfo().value("QT_INSTALL_DATA") + "/mkspecs";
613 QString parsedSpec = QDir::cleanPath(list.at(index));
615 baseMkspecDir = baseMkspecDir.toLower();
616 parsedSpec = parsedSpec.toLower();
618 // if the path is relative it can be
619 // relative to the working directory (as found in the Makefiles)
620 // or relatively to the mkspec directory
621 // if it is the former we need to get the canonical form
622 // for the other one we don't need to do anything
623 if (QFileInfo(parsedSpec).isRelative()) {
624 if(QFileInfo(directory + QLatin1Char('/') + parsedSpec).exists()) {
625 parsedSpec = QDir::cleanPath(directory + QLatin1Char('/') + parsedSpec);
627 parsedSpec = parsedSpec.toLower();
630 parsedSpec = baseMkspecDir + QLatin1Char('/') + parsedSpec;
634 QFileInfo f2(parsedSpec);
635 while (f2.isSymLink()) {
636 parsedSpec = f2.symLinkTarget();
637 f2.setFile(parsedSpec);
640 if (parsedSpec.startsWith(baseMkspecDir)) {
641 parsedSpec = parsedSpec.mid(baseMkspecDir.length() + 1);
643 QString sourceMkSpecPath = version->sourcePath() + "/mkspecs";
644 if (parsedSpec.startsWith(sourceMkSpecPath)) {
645 parsedSpec = parsedSpec.mid(sourceMkSpecPath.length() + 1);
649 parsedSpec = parsedSpec.toLower();
654 ProjectExplorer::IOutputParser *Qt4BuildConfiguration::createOutputParser() const
656 ToolChain *tc = toolChain();
658 return toolChain()->outputParser();
663 \class Qt4BuildConfigurationFactory
666 Qt4BuildConfigurationFactory::Qt4BuildConfigurationFactory(QObject *parent) :
667 ProjectExplorer::IBuildConfigurationFactory(parent)
671 QtVersionManager *vm = QtVersionManager::instance();
672 connect(vm, SIGNAL(qtVersionsChanged(QList<int>)),
673 this, SLOT(update()));
676 Qt4BuildConfigurationFactory::~Qt4BuildConfigurationFactory()
680 void Qt4BuildConfigurationFactory::update()
683 QtVersionManager *vm = QtVersionManager::instance();
684 foreach (const QtVersion *version, vm->versions()) {
685 if (version->isValid()) {
686 QString key = QString::fromLatin1(QT4_BC_ID_PREFIX)
687 + QString::fromLatin1("Qt%1").arg(version->uniqueId());
688 VersionInfo info(tr("Using Qt Version \"%1\"").arg(version->displayName()), version->uniqueId());
689 m_versions.insert(key, info);
692 emit availableCreationIdsChanged();
695 QStringList Qt4BuildConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const
697 if (!qobject_cast<Qt4Target *>(parent))
698 return QStringList();
701 QtVersionManager *vm = QtVersionManager::instance();
702 for (QMap<QString, VersionInfo>::const_iterator i = m_versions.constBegin();
703 i != m_versions.constEnd(); ++i) {
704 if (vm->version(i.value().versionId)->supportsTargetId(parent->id()))
705 results.append(i.key());
710 QString Qt4BuildConfigurationFactory::displayNameForId(const QString &id) const
712 if (!m_versions.contains(id))
714 return m_versions.value(id).displayName;
717 bool Qt4BuildConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const QString &id) const
719 if (!qobject_cast<Qt4Target *>(parent))
721 if (!m_versions.contains(id))
723 const VersionInfo &info = m_versions.value(id);
724 QtVersion *version = QtVersionManager::instance()->version(info.versionId);
726 !version->supportsTargetId(parent->id()))
731 BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id)
733 if (!canCreate(parent, id))
736 const VersionInfo &info = m_versions.value(id);
737 QtVersion *version = QtVersionManager::instance()->version(info.versionId);
740 Qt4Target *qt4Target(static_cast<Qt4Target *>(parent));
743 QString buildConfigurationName = QInputDialog::getText(0,
744 tr("New Configuration"),
745 tr("New configuration name:"),
747 version->displayName(),
749 buildConfigurationName = buildConfigurationName.trimmed();
750 if (!ok || buildConfigurationName.isEmpty())
753 qt4Target->addQt4BuildConfiguration(tr("%1 Debug").arg(buildConfigurationName),
755 (version->defaultBuildConfig() | QtVersion::DebugBuild),
756 QStringList(), QString());
757 BuildConfiguration *bc =
758 qt4Target->addQt4BuildConfiguration(tr("%1 Release").arg(buildConfigurationName),
760 (version->defaultBuildConfig() & ~QtVersion::DebugBuild),
761 QStringList(), QString());
765 bool Qt4BuildConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const
767 if (!qobject_cast<Qt4Target *>(parent))
769 Qt4BuildConfiguration *qt4bc(qobject_cast<Qt4BuildConfiguration *>(source));
773 QtVersion *version = qt4bc->qtVersion();
775 !version->supportsTargetId(parent->id()))
780 BuildConfiguration *Qt4BuildConfigurationFactory::clone(Target *parent, BuildConfiguration *source)
782 if (!canClone(parent, source))
784 Qt4Target *target(static_cast<Qt4Target *>(parent));
785 Qt4BuildConfiguration *oldbc(static_cast<Qt4BuildConfiguration *>(source));
786 return new Qt4BuildConfiguration(target, oldbc);
789 bool Qt4BuildConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const
791 QString id(ProjectExplorer::idFromMap(map));
792 if (!qobject_cast<Qt4Target *>(parent))
794 return id.startsWith(QLatin1String(QT4_BC_ID_PREFIX)) ||
795 id == QLatin1String(QT4_BC_ID);
798 BuildConfiguration *Qt4BuildConfigurationFactory::restore(Target *parent, const QVariantMap &map)
800 if (!canRestore(parent, map))
802 Qt4Target *target(static_cast<Qt4Target *>(parent));
803 Qt4BuildConfiguration *bc(new Qt4BuildConfiguration(target));
804 if (bc->fromMap(map))