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>
40 #include <utils/qtcprocess.h>
42 #include <projectexplorer/buildsteplist.h>
43 #include <projectexplorer/projectexplorerconstants.h>
45 #include <QtCore/QDebug>
47 #include <QtGui/QInputDialog>
49 using namespace Qt4ProjectManager;
50 using namespace Qt4ProjectManager::Internal;
51 using namespace ProjectExplorer;
54 const char * const QT4_BC_ID_PREFIX("Qt4ProjectManager.Qt4BuildConfiguration.");
55 const char * const QT4_BC_ID("Qt4ProjectManager.Qt4BuildConfiguration");
57 const char * const USE_SHADOW_BUILD_KEY("Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild");
58 const char * const BUILD_DIRECTORY_KEY("Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory");
59 const char * const TOOLCHAIN_KEY("Qt4ProjectManager.Qt4BuildConfiguration.ToolChain");
60 const char * const BUILD_CONFIGURATION_KEY("Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration");
61 const char * const QT_VERSION_ID_KEY("Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId");
66 Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target) :
67 BuildConfiguration(target, QLatin1String(QT4_BC_ID)),
70 m_toolChainType(-1), // toolChainType() makes sure to return the default toolchainType
71 m_qmakeBuildConfiguration(0),
77 Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target, const QString &id) :
78 BuildConfiguration(target, id),
81 m_toolChainType(-1), // toolChainType() makes sure to return the default toolchainType
82 m_qmakeBuildConfiguration(0),
88 Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target, Qt4BuildConfiguration *source) :
89 BuildConfiguration(target, source),
90 m_shadowBuild(source->m_shadowBuild),
91 m_buildDirectory(source->m_buildDirectory),
92 m_qtVersionId(source->m_qtVersionId),
93 m_toolChainType(source->m_toolChainType),
94 m_qmakeBuildConfiguration(source->m_qmakeBuildConfiguration),
95 m_subNodeBuild(0) // temporary value, so not copied
101 Qt4BuildConfiguration::~Qt4BuildConfiguration()
105 QVariantMap Qt4BuildConfiguration::toMap() const
107 QVariantMap map(BuildConfiguration::toMap());
108 map.insert(QLatin1String(USE_SHADOW_BUILD_KEY), m_shadowBuild);
109 map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory);
110 map.insert(QLatin1String(QT_VERSION_ID_KEY), m_qtVersionId);
111 map.insert(QLatin1String(TOOLCHAIN_KEY), m_toolChainType);
112 map.insert(QLatin1String(BUILD_CONFIGURATION_KEY), int(m_qmakeBuildConfiguration));
117 bool Qt4BuildConfiguration::fromMap(const QVariantMap &map)
119 if (!BuildConfiguration::fromMap(map))
122 int fileVersion = map.value(ProjectExplorer::Constants::USERFILE_PREVIOUS_VERSION_KEY,
123 std::numeric_limits<int>::max()).toInt();
124 m_shadowBuild = map.value(QLatin1String(USE_SHADOW_BUILD_KEY), true).toBool();
125 m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY), qt4Target()->defaultBuildDirectory()).toString();
126 m_qtVersionId = map.value(QLatin1String(QT_VERSION_ID_KEY)).toInt();
127 m_toolChainType = map.value(QLatin1String(TOOLCHAIN_KEY)).toInt();
128 m_qmakeBuildConfiguration = QtVersion::QmakeBuildConfigs(map.value(QLatin1String(BUILD_CONFIGURATION_KEY)).toInt());
130 // Pick a Qt version if the default version is used:
131 // We assume that the default Qt version was used in earlier versions of Qt creator.
132 // Pick a Qt version that is supporting a desktop.
133 if (m_qtVersionId == 0) {
134 QList<QtVersion *> versions = QtVersionManager::instance()->versions();
135 foreach (QtVersion *v, versions) {
136 if (v->isValid() && v->supportsTargetId(QLatin1String(Constants::DESKTOP_TARGET_ID))) {
137 m_qtVersionId = v->uniqueId();
141 if (m_qtVersionId == 0)
142 m_qtVersionId = versions.at(0)->uniqueId();
145 QtVersion *version = qtVersion();
146 if (fileVersion >= 1) { // we are not upgrading from pre-targets!
147 if (version->isValid() && !version->supportedTargetIds().contains(target()->id())) {
148 qWarning() << "Buildconfiguration" << displayName() << ": Qt" << version->displayName() << "not supported by target" << target()->id();
152 if (!version->isValid() || !version->supportedTargetIds().contains(target()->id())) {
153 qWarning() << "Buildconfiguration" << displayName() << ": Qt" << version->displayName() << "not supported by target" << target()->id();
158 if (version->isValid())
159 m_shadowBuild = (m_shadowBuild && version->supportsShadowBuilds());
161 QList<ProjectExplorer::ToolChainType> possibleTcs(qt4Target()->filterToolChainTypes(qtVersion()->possibleToolChainTypes()));
162 if (!possibleTcs.contains(toolChainType()))
163 setToolChainType(qt4Target()->preferredToolChainType(possibleTcs));
165 if (toolChainType() == ProjectExplorer::ToolChain_INVALID) {
166 qWarning() << "No toolchain available for" << qtVersion()->displayName() << "used in" << target()->id() << "!";
173 void Qt4BuildConfiguration::ctor()
175 m_buildDirectory = qt4Target()->defaultBuildDirectory();
176 if (m_buildDirectory == target()->project()->projectDirectory())
177 m_shadowBuild = false;
179 m_lastEmmitedBuildDirectory = buildDirectory();
181 connect(this, SIGNAL(environmentChanged()),
182 this, SLOT(emitBuildDirectoryChanged()));
184 QtVersionManager *vm = QtVersionManager::instance();
185 connect(vm, SIGNAL(qtVersionsChanged(QList<int>)),
186 this, SLOT(qtVersionsChanged(QList<int>)));
189 void Qt4BuildConfiguration::emitBuildDirectoryChanged()
191 if (buildDirectory() != m_lastEmmitedBuildDirectory) {
192 m_lastEmmitedBuildDirectory = buildDirectory();
193 emit buildDirectoryChanged();
197 void Qt4BuildConfiguration::pickValidQtVersion()
199 QList<QtVersion *> versions = QtVersionManager::instance()->versionsForTargetId(qt4Target()->id());
200 if (!versions.isEmpty())
201 setQtVersion(versions.at(0));
203 setQtVersion(QtVersionManager::instance()->emptyVersion());
206 Qt4Target *Qt4BuildConfiguration::qt4Target() const
208 return static_cast<Qt4Target *>(target());
211 Utils::Environment Qt4BuildConfiguration::baseEnvironment() const
213 Utils::Environment env = BuildConfiguration::baseEnvironment();
214 qtVersion()->addToEnvironment(env);
216 ToolChain *tc = toolChain();
218 tc->addToEnvironment(env);
222 /// returns the unexpanded build directory
223 QString Qt4BuildConfiguration::rawBuildDirectory() const
225 QString workingDirectory;
227 if (!m_buildDirectory.isEmpty())
228 workingDirectory = m_buildDirectory;
230 workingDirectory = qt4Target()->defaultBuildDirectory();
232 if (workingDirectory.isEmpty())
233 workingDirectory = target()->project()->projectDirectory();
234 return workingDirectory;
237 /// returns the build directory
238 QString Qt4BuildConfiguration::buildDirectory() const
240 return QDir::cleanPath(environment().expandVariables(rawBuildDirectory()));
243 /// If only a sub tree should be build this function returns which sub node
245 /// \see Qt4BuildConfiguration::setSubNodeBuild
246 Qt4ProjectManager::Internal::Qt4ProFileNode *Qt4BuildConfiguration::subNodeBuild() const
248 return m_subNodeBuild;
251 /// A sub node build on builds a sub node of the project
252 /// That is triggered by a right click in the project explorer tree
253 /// The sub node to be build is set via this function immediately before
254 /// calling BuildManager::buildProject( BuildConfiguration * )
255 /// and reset immediately afterwards
256 /// That is m_subNodesBuild is set only temporarly
257 void Qt4BuildConfiguration::setSubNodeBuild(Qt4ProjectManager::Internal::Qt4ProFileNode *node)
259 m_subNodeBuild = node;
262 /// returns whether this is a shadow build configuration or not
263 /// note, even if shadowBuild() returns true, it might be using the
264 /// source directory as the shadow build directory, thus it
265 /// still is a in-source build
266 bool Qt4BuildConfiguration::shadowBuild() const
268 return m_shadowBuild;
271 /// returns the shadow build directory if set
272 /// \note buildDirectory() is probably the function you want to call
273 QString Qt4BuildConfiguration::shadowBuildDirectory() const
275 if (m_buildDirectory.isEmpty())
276 return qt4Target()->defaultBuildDirectory();
277 return m_buildDirectory;
280 void Qt4BuildConfiguration::setShadowBuildAndDirectory(bool shadowBuild, const QString &buildDirectory)
282 QtVersion *version = qtVersion();
283 QString directoryToSet = buildDirectory;
284 bool toSet = (shadowBuild && version->isValid() && version->supportsShadowBuilds());
285 if (m_shadowBuild == toSet && m_buildDirectory == directoryToSet)
288 m_shadowBuild = toSet;
289 m_buildDirectory = directoryToSet;
291 emit environmentChanged();
292 emitBuildDirectoryChanged();
293 emit proFileEvaluateNeeded(this);
296 ProjectExplorer::ToolChain *Qt4BuildConfiguration::toolChain() const
298 const ProjectExplorer::ToolChainType tct = toolChainType();
299 return qtVersion()->toolChain(tct);
302 QString Qt4BuildConfiguration::makeCommand() const
304 ToolChain *tc = toolChain();
305 return tc ? tc->makeCommand() : "make";
308 static inline QString symbianMakeTarget(QtVersion::QmakeBuildConfigs buildConfig,
311 QString rc = (buildConfig & QtVersion::DebugBuild) ?
312 QLatin1String("debug-") : QLatin1String("release-");
317 QString Qt4BuildConfiguration::defaultMakeTarget() const
319 ToolChain *tc = toolChain();
322 const QtVersion::QmakeBuildConfigs buildConfig = qmakeBuildConfiguration();
324 switch (tc->type()) {
325 case ProjectExplorer::ToolChain_GCCE:
326 return symbianMakeTarget(buildConfig, QLatin1String("gcce"));
327 case ProjectExplorer::ToolChain_RVCT_ARMV5:
328 return symbianMakeTarget(buildConfig, QLatin1String("armv5"));
329 case ProjectExplorer::ToolChain_RVCT_ARMV6:
330 return symbianMakeTarget(buildConfig, QLatin1String("armv6"));
331 case ProjectExplorer::ToolChain_RVCT_ARMV5_GNUPOC:
332 case ProjectExplorer::ToolChain_GCCE_GNUPOC:
339 QString Qt4BuildConfiguration::makefile() const
341 if (qt4Target()->id() == Constants::S60_DEVICE_TARGET_ID)
343 return qt4Target()->qt4Project()->rootProjectNode()->makefile();
346 QtVersion *Qt4BuildConfiguration::qtVersion() const
348 QtVersionManager *vm = QtVersionManager::instance();
349 return vm->version(m_qtVersionId);
352 void Qt4BuildConfiguration::setQtVersion(QtVersion *version)
356 if (m_qtVersionId == version->uniqueId())
359 m_qtVersionId = version->uniqueId();
361 if (!version->possibleToolChainTypes().contains(ProjectExplorer::ToolChainType(m_toolChainType))) {
362 QList<ProjectExplorer::ToolChainType> candidates =
363 qt4Target()->filterToolChainTypes(qtVersion()->possibleToolChainTypes());
364 if (candidates.isEmpty())
365 m_toolChainType = ProjectExplorer::ToolChain_INVALID;
367 m_toolChainType = candidates.first();
370 m_shadowBuild = m_shadowBuild && qtVersion()->supportsShadowBuilds();
372 emit proFileEvaluateNeeded(this);
373 emit qtVersionChanged();
374 emit environmentChanged();
375 emitBuildDirectoryChanged();
378 void Qt4BuildConfiguration::setToolChainType(ProjectExplorer::ToolChainType type)
380 if (!qt4Target()->filterToolChainTypes(qtVersion()->possibleToolChainTypes()).contains(type)
381 || m_toolChainType == type)
384 m_toolChainType = type;
386 emit proFileEvaluateNeeded(this);
387 emit toolChainTypeChanged();
388 emit environmentChanged();
389 emitBuildDirectoryChanged();
392 ProjectExplorer::ToolChainType Qt4BuildConfiguration::toolChainType() const
394 return ProjectExplorer::ToolChainType(m_toolChainType);
397 QtVersion::QmakeBuildConfigs Qt4BuildConfiguration::qmakeBuildConfiguration() const
399 return m_qmakeBuildConfiguration;
402 void Qt4BuildConfiguration::setQMakeBuildConfiguration(QtVersion::QmakeBuildConfigs config)
404 if (m_qmakeBuildConfiguration == config)
406 m_qmakeBuildConfiguration = config;
408 emit proFileEvaluateNeeded(this);
409 emit qmakeBuildConfigurationChanged();
412 void Qt4BuildConfiguration::emitProFileEvaluteNeeded()
414 emit proFileEvaluateNeeded(this);
417 void Qt4BuildConfiguration::emitQMakeBuildConfigurationChanged()
419 emit qmakeBuildConfigurationChanged();
422 void Qt4BuildConfiguration::emitBuildDirectoryInitialized()
424 emit buildDirectoryInitialized();
427 void Qt4BuildConfiguration::emitS60CreatesSmartInstallerChanged()
429 emit s60CreatesSmartInstallerChanged();
433 QStringList Qt4BuildConfiguration::configCommandLineArguments() const
436 QtVersion::QmakeBuildConfigs defaultBuildConfiguration = qtVersion()->defaultBuildConfig();
437 QtVersion::QmakeBuildConfigs userBuildConfiguration = m_qmakeBuildConfiguration;
438 if ((defaultBuildConfiguration & QtVersion::BuildAll) && !(userBuildConfiguration & QtVersion::BuildAll))
439 result << "CONFIG-=debug_and_release";
441 if (!(defaultBuildConfiguration & QtVersion::BuildAll) && (userBuildConfiguration & QtVersion::BuildAll))
442 result << "CONFIG+=debug_and_release";
443 if ((defaultBuildConfiguration & QtVersion::DebugBuild)
444 && !(userBuildConfiguration & QtVersion::DebugBuild)
445 && !(userBuildConfiguration & QtVersion::BuildAll))
446 result << "CONFIG+=release";
447 if (!(defaultBuildConfiguration & QtVersion::DebugBuild)
448 && (userBuildConfiguration & QtVersion::DebugBuild)
449 && !(userBuildConfiguration & QtVersion::BuildAll))
450 result << "CONFIG+=debug";
454 QMakeStep *Qt4BuildConfiguration::qmakeStep() const
457 BuildStepList *bsl = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
459 for (int i = 0; i < bsl->count(); ++i)
460 if ((qs = qobject_cast<QMakeStep *>(bsl->at(i))) != 0)
465 MakeStep *Qt4BuildConfiguration::makeStep() const
468 BuildStepList *bsl = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
470 for (int i = 0; i < bsl->count(); ++i)
471 if ((ms = qobject_cast<MakeStep *>(bsl->at(i))) != 0)
476 void Qt4BuildConfiguration::qtVersionsChanged(const QList<int> &changedVersions)
478 if (!changedVersions.contains(m_qtVersionId) ||
479 qtVersion()->isValid())
482 pickValidQtVersion();
485 // returns true if both are equal
486 bool Qt4BuildConfiguration::compareToImportFrom(const QString &makefile)
488 QMakeStep *qs = qmakeStep();
489 if (QFileInfo(makefile).exists() && qs) {
490 QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(makefile);
491 QtVersion *version = qtVersion();
492 if (version->qmakeCommand() == qmakePath) {
494 QPair<QtVersion::QmakeBuildConfigs, QString> result =
495 QtVersionManager::scanMakeFile(makefile, version->defaultBuildConfig());
496 if (qmakeBuildConfiguration() == result.first) {
497 // The qmake Build Configuration are the same,
498 // now compare arguments lists
499 // we have to compare without the spec/platform cmd argument
500 // and compare that on its own
501 QString workingDirectory = QFileInfo(makefile).absolutePath();
502 QString userArgs = qs->userArguments();
503 QStringList actualArgs;
504 QString actualSpec = extractSpecFromArguments(&userArgs, workingDirectory, version, &actualArgs);
505 if (actualSpec.isEmpty()) {
506 // Easy one: the user has chosen not to override the settings
507 actualSpec = version->mkspec();
509 actualArgs += qs->moreArguments();
511 QString qmakeArgs = result.second;
512 QStringList parsedArgs;
513 QString parsedSpec = extractSpecFromArguments(&qmakeArgs, workingDirectory, version, &parsedArgs);
516 qDebug()<<"Actual args:"<<actualArgs;
517 qDebug()<<"Parsed args:"<<parsedArgs;
518 qDebug()<<"Actual spec:"<<actualSpec;
519 qDebug()<<"Parsed spec:"<<parsedSpec;
522 // Comparing the sorted list is obviously wrong
523 // Though haven written a more complete version
524 // that managed had around 200 lines and yet faild
525 // to be actually foolproof at all, I think it's
526 // not feasible without actually taking the qmake
527 // command line parsing code
529 // Things, sorting gets wrong:
530 // parameters to positional parameters matter
531 // e.g. -o -spec is different from -spec -o
532 // -o 1 -spec 2 is diffrent from -spec 1 -o 2
533 // variable assignment order matters
534 // variable assignment vs -after
535 // -norecursive vs. recursive
538 if (actualArgs == parsedArgs) {
539 // Specs match exactly
540 if (actualSpec == parsedSpec)
542 // Actual spec is the default one
543 // qDebug()<<"AS vs VS"<<actualSpec<<version->mkspec();
544 if ((actualSpec == version->mkspec() || actualSpec == "default")
545 && (parsedSpec == version->mkspec() || parsedSpec == "default" || parsedSpec.isEmpty()))
549 qDebug()<<"different qmake buildconfigurations buildconfiguration:"<<qmakeBuildConfiguration()<<" Makefile:"<<result.first;
552 qDebug()<<"diffrent qt versions, buildconfiguration:"<<version->qmakeCommand()<<" Makefile:"<<qmakePath;
558 void Qt4BuildConfiguration::removeQMLInspectorFromArguments(QString *args)
560 for (Utils::QtcProcess::ArgIterator ait(args); ait.next(); )
561 if (ait.value().startsWith(QLatin1String(Constants::QMAKEVAR_QMLJSDEBUGGER_PATH)))
565 QString Qt4BuildConfiguration::extractSpecFromArguments(QString *args,
566 const QString &directory, const QtVersion *version,
567 QStringList *outArgs)
571 bool ignoreNext = false;
572 bool nextIsSpec = false;
573 for (Utils::QtcProcess::ArgIterator ait(args); ait.next(); ) {
577 } else if (nextIsSpec) {
579 parsedSpec = QDir::cleanPath(ait.value());
581 } else if (ait.value() == QLatin1String("-spec") || ait.value() == QLatin1String("-platform")) {
584 } else if (ait.value() == QLatin1String("-cache")) {
585 // We ignore -cache, because qmake contained a bug that it didn't
586 // mention the -cache in the Makefile.
587 // That means changing the -cache option in the additional arguments
588 // does not automatically rerun qmake. Alas, we could try more
589 // intelligent matching for -cache, but i guess people rarely
593 } else if (outArgs && ait.isSimple()) {
594 outArgs->append(ait.value());
598 if (parsedSpec.isEmpty())
601 QString baseMkspecDir = version->versionInfo().value("QMAKE_MKSPECS");
602 if (baseMkspecDir.isEmpty())
603 baseMkspecDir = version->versionInfo().value("QT_INSTALL_DATA") + "/mkspecs";
606 baseMkspecDir = baseMkspecDir.toLower();
607 parsedSpec = parsedSpec.toLower();
609 // if the path is relative it can be
610 // relative to the working directory (as found in the Makefiles)
611 // or relatively to the mkspec directory
612 // if it is the former we need to get the canonical form
613 // for the other one we don't need to do anything
614 if (QFileInfo(parsedSpec).isRelative()) {
615 if(QFileInfo(directory + QLatin1Char('/') + parsedSpec).exists()) {
616 parsedSpec = QDir::cleanPath(directory + QLatin1Char('/') + parsedSpec);
618 parsedSpec = parsedSpec.toLower();
621 parsedSpec = baseMkspecDir + QLatin1Char('/') + parsedSpec;
625 QFileInfo f2(parsedSpec);
626 while (f2.isSymLink()) {
627 parsedSpec = f2.symLinkTarget();
628 f2.setFile(parsedSpec);
631 if (parsedSpec.startsWith(baseMkspecDir)) {
632 parsedSpec = parsedSpec.mid(baseMkspecDir.length() + 1);
634 QString sourceMkSpecPath = version->sourcePath() + "/mkspecs";
635 if (parsedSpec.startsWith(sourceMkSpecPath)) {
636 parsedSpec = parsedSpec.mid(sourceMkSpecPath.length() + 1);
640 parsedSpec = parsedSpec.toLower();
645 ProjectExplorer::IOutputParser *Qt4BuildConfiguration::createOutputParser() const
647 ToolChain *tc = toolChain();
649 return toolChain()->outputParser();
654 \class Qt4BuildConfigurationFactory
657 Qt4BuildConfigurationFactory::Qt4BuildConfigurationFactory(QObject *parent) :
658 ProjectExplorer::IBuildConfigurationFactory(parent)
662 QtVersionManager *vm = QtVersionManager::instance();
663 connect(vm, SIGNAL(qtVersionsChanged(QList<int>)),
664 this, SLOT(update()));
667 Qt4BuildConfigurationFactory::~Qt4BuildConfigurationFactory()
671 void Qt4BuildConfigurationFactory::update()
674 QtVersionManager *vm = QtVersionManager::instance();
675 foreach (const QtVersion *version, vm->versions()) {
676 if (version->isValid()) {
677 QString key = QString::fromLatin1(QT4_BC_ID_PREFIX)
678 + QString::fromLatin1("Qt%1").arg(version->uniqueId());
679 VersionInfo info(tr("Using Qt Version \"%1\"").arg(version->displayName()), version->uniqueId());
680 m_versions.insert(key, info);
683 emit availableCreationIdsChanged();
686 QStringList Qt4BuildConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const
688 if (!qobject_cast<Qt4Target *>(parent))
689 return QStringList();
692 QtVersionManager *vm = QtVersionManager::instance();
693 for (QMap<QString, VersionInfo>::const_iterator i = m_versions.constBegin();
694 i != m_versions.constEnd(); ++i) {
695 if (vm->version(i.value().versionId)->supportsTargetId(parent->id()))
696 results.append(i.key());
701 QString Qt4BuildConfigurationFactory::displayNameForId(const QString &id) const
703 if (!m_versions.contains(id))
705 return m_versions.value(id).displayName;
708 bool Qt4BuildConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const QString &id) const
710 if (!qobject_cast<Qt4Target *>(parent))
712 if (!m_versions.contains(id))
714 const VersionInfo &info = m_versions.value(id);
715 QtVersion *version = QtVersionManager::instance()->version(info.versionId);
717 !version->supportsTargetId(parent->id()))
722 BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id)
724 if (!canCreate(parent, id))
727 const VersionInfo &info = m_versions.value(id);
728 QtVersion *version = QtVersionManager::instance()->version(info.versionId);
731 Qt4Target *qt4Target(static_cast<Qt4Target *>(parent));
734 QString buildConfigurationName = QInputDialog::getText(0,
735 tr("New Configuration"),
736 tr("New configuration name:"),
738 version->displayName(),
740 buildConfigurationName = buildConfigurationName.trimmed();
741 if (!ok || buildConfigurationName.isEmpty())
744 qt4Target->addQt4BuildConfiguration(tr("%1 Debug").arg(buildConfigurationName),
746 (version->defaultBuildConfig() | QtVersion::DebugBuild),
747 QString(), QString());
748 BuildConfiguration *bc =
749 qt4Target->addQt4BuildConfiguration(tr("%1 Release").arg(buildConfigurationName),
751 (version->defaultBuildConfig() & ~QtVersion::DebugBuild),
752 QString(), QString());
756 bool Qt4BuildConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const
758 if (!qobject_cast<Qt4Target *>(parent))
760 Qt4BuildConfiguration *qt4bc(qobject_cast<Qt4BuildConfiguration *>(source));
764 QtVersion *version = qt4bc->qtVersion();
766 !version->supportsTargetId(parent->id()))
771 BuildConfiguration *Qt4BuildConfigurationFactory::clone(Target *parent, BuildConfiguration *source)
773 if (!canClone(parent, source))
775 Qt4Target *target(static_cast<Qt4Target *>(parent));
776 Qt4BuildConfiguration *oldbc(static_cast<Qt4BuildConfiguration *>(source));
777 return new Qt4BuildConfiguration(target, oldbc);
780 bool Qt4BuildConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const
782 QString id(ProjectExplorer::idFromMap(map));
783 if (!qobject_cast<Qt4Target *>(parent))
785 return id.startsWith(QLatin1String(QT4_BC_ID_PREFIX)) ||
786 id == QLatin1String(QT4_BC_ID);
789 BuildConfiguration *Qt4BuildConfigurationFactory::restore(Target *parent, const QVariantMap &map)
791 if (!canRestore(parent, map))
793 Qt4Target *target(static_cast<Qt4Target *>(parent));
794 Qt4BuildConfiguration *bc(new Qt4BuildConfiguration(target));
795 if (bc->fromMap(map))