1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (info@qt.nokia.com)
10 ** GNU Lesser General Public License Usage
12 ** This file may be used under the terms of the GNU Lesser General Public
13 ** License version 2.1 as published by the Free Software Foundation and
14 ** appearing in the file LICENSE.LGPL included in the packaging of this file.
15 ** Please review the following information to ensure the GNU Lesser General
16 ** Public License version 2.1 requirements will be met:
17 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
19 ** In addition, as a special exception, Nokia gives you certain additional
20 ** rights. These rights are described in the Nokia Qt LGPL Exception
21 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
25 ** Alternatively, this file may be used in accordance with the terms and
26 ** conditions contained in a signed written agreement between you and Nokia.
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
31 **************************************************************************/
33 #include "qt4symbiantargetfactory.h"
34 #include "qt4projectmanagerconstants.h"
35 #include "qt4project.h"
36 #include "buildconfigurationinfo.h"
38 #include "qt-s60/s60deployconfiguration.h"
39 #include "qt-s60/s60devicerunconfiguration.h"
40 #include "qt-s60/s60emulatorrunconfiguration.h"
41 #include "qt-s60/s60createpackagestep.h"
42 #include "qt-s60/s60deploystep.h"
43 #include "qt-s60/qt4symbiantarget.h"
45 #include <projectexplorer/projectexplorerconstants.h>
46 #include <projectexplorer/customexecutablerunconfiguration.h>
47 #include <projectexplorer/toolchainmanager.h>
49 using ProjectExplorer::idFromMap;
50 using ProjectExplorer::Task;
51 using namespace Qt4ProjectManager;
52 using namespace Qt4ProjectManager::Internal;
54 // -------------------------------------------------------------------------
55 // Qt4SymbianTargetFactory
56 // -------------------------------------------------------------------------
58 Qt4SymbianTargetFactory::Qt4SymbianTargetFactory(QObject *parent) :
59 Qt4BaseTargetFactory(parent)
61 connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
62 this, SIGNAL(supportedTargetIdsChanged()));
65 Qt4SymbianTargetFactory::~Qt4SymbianTargetFactory()
69 bool Qt4SymbianTargetFactory::supportsTargetId(const QString &id) const
71 return id == QLatin1String(Constants::S60_DEVICE_TARGET_ID)
72 || id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID);
75 QStringList Qt4SymbianTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const
77 if (parent && !qobject_cast<Qt4Project *>(parent))
81 if (QtVersionManager::instance()->supportsTargetId(Constants::S60_DEVICE_TARGET_ID))
82 ids << QLatin1String(Constants::S60_DEVICE_TARGET_ID);
83 if (QtVersionManager::instance()->supportsTargetId(Constants::S60_EMULATOR_TARGET_ID))
84 ids << QLatin1String(Constants::S60_EMULATOR_TARGET_ID);
89 QString Qt4SymbianTargetFactory::displayNameForId(const QString &id) const
91 return Qt4SymbianTarget::defaultDisplayName(id);
94 QIcon Qt4SymbianTargetFactory::iconForId(const QString &id) const
96 if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID))
97 return QIcon(":/projectexplorer/images/SymbianEmulator.png");
98 if (id == QLatin1String(Constants::S60_DEVICE_TARGET_ID))
99 return QIcon(":/projectexplorer/images/SymbianDevice.png");
103 bool Qt4SymbianTargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const
105 if (!qobject_cast<Qt4Project *>(parent))
107 return supportsTargetId(id);
110 bool Qt4SymbianTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const
112 return canCreate(parent, idFromMap(map));
115 ProjectExplorer::Target *Qt4SymbianTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map)
117 if (!canRestore(parent, map))
120 Qt4Project *qt4project = static_cast<Qt4Project *>(parent);
121 Qt4SymbianTarget *target = new Qt4SymbianTarget(qt4project, idFromMap(map));
123 if (target->fromMap(map))
129 QString Qt4SymbianTargetFactory::defaultShadowBuildDirectory(const QString &projectLocation, const QString &id)
131 Q_UNUSED(projectLocation);
133 // should not be called from anywhere, since we override Qt4BaseTarget::defaultBuldDirectory()
137 QList<ProjectExplorer::Task> Qt4SymbianTargetFactory::reportIssues(const QString &proFile)
139 QList<ProjectExplorer::Task> results;
140 // Warn of strange characters in project name and path:
141 const QString projectName = proFile.mid(proFile.lastIndexOf(QLatin1Char('/')) + 1);
142 QString projectPath = proFile.left(proFile.lastIndexOf(QLatin1Char('/')));
143 #if defined (Q_OS_WIN)
144 if (projectPath.at(1) == QChar(':') && projectPath.at(0).toUpper() >= QChar('A') && projectPath.at(0).toUpper() <= QChar('Z'))
145 projectPath = projectPath.mid(2);
147 if (projectPath.contains(QLatin1Char(' '))) {
148 results.append(Task(Task::Warning,
149 QCoreApplication::translate("ProjectExplorer::Internal::S60ProjectChecker",
150 "The Symbian tool chain does not handle spaces "
151 "in the project path '%1'.").arg(projectPath),
152 QString(), -1, ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
154 if (projectName.contains(QRegExp("[^a-zA-Z0-9.-]"))) {
155 results.append(Task(Task::Warning,
156 QCoreApplication::translate("ProjectExplorer::Internal::S60ProjectChecker",
157 "The Symbian tool chain does not handle special "
158 "characters in the project name '%1' well.")
160 QString(), -1, ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
165 QList<BuildConfigurationInfo> Qt4SymbianTargetFactory::availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtVersionNumber &minimumQtVersion)
167 QList<BuildConfigurationInfo> infos;
168 QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id, minimumQtVersion);
170 foreach (QtVersion *version, knownVersions) {
171 if (!version->isValid() || !version->toolChainAvailable())
174 bool buildAll = version->defaultBuildConfig() & QtVersion::BuildAll;
175 QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0);
176 QString dir = QFileInfo(proFilePath).absolutePath(), id;
177 if (id == Constants::S60_EMULATOR_TARGET_ID) {
178 infos.append(BuildConfigurationInfo(version, config | QtVersion::DebugBuild, QString(), dir));
180 infos.append(BuildConfigurationInfo(version, config, QString(), dir));
181 infos.append(BuildConfigurationInfo(version, config ^ QtVersion::DebugBuild, QString(), dir));
188 bool Qt4SymbianTargetFactory::isMobileTarget(const QString &id)
194 bool Qt4SymbianTargetFactory::supportsShadowBuilds(const QString &id)
200 ProjectExplorer::Target *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id)
202 if (!canCreate(parent, id))
205 QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id);
206 if (knownVersions.isEmpty())
209 QtVersion *qtVersion = knownVersions.first();
210 QtVersion::QmakeBuildConfigs config = qtVersion->defaultBuildConfig();
212 QList<BuildConfigurationInfo> infos;
213 if (id != Constants::S60_EMULATOR_TARGET_ID) {
214 infos.append(BuildConfigurationInfo(qtVersion, config, QString(), QString()));
215 infos.append(BuildConfigurationInfo(qtVersion, config ^ QtVersion::DebugBuild, QString(), QString()));
217 if(config & QtVersion::DebugBuild)
218 infos.append(BuildConfigurationInfo(qtVersion, config, QString(), QString()));
220 infos.append(BuildConfigurationInfo(qtVersion, config ^ QtVersion::DebugBuild, QString(), QString()));
223 return create(parent, id, infos);
226 ProjectExplorer::Target *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos)
228 if (!canCreate(parent, id))
230 Qt4SymbianTarget *t = new Qt4SymbianTarget(static_cast<Qt4Project *>(parent), id);
231 foreach (const BuildConfigurationInfo &info, infos)
232 t->addQt4BuildConfiguration(msgBuildConfigurationName(info),
233 info.version, info.buildConfig,
234 info.additionalArguments, info.directory);
236 t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, QLatin1String(Qt4ProjectManager::Constants::S60_DEVICE_TARGET_ID)));
238 t->createApplicationProFiles();
240 if (t->runConfigurations().isEmpty())
241 t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t));
245 ProjectExplorer::Target *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, Qt4TargetSetupWidget *widget)
247 if (!widget->isTargetSelected())
249 Qt4DefaultTargetSetupWidget *w = static_cast<Qt4DefaultTargetSetupWidget *>(widget);
250 return create(parent, id, w->buildConfigurationInfos());