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 "maemotoolchain.h"
35 #include "maemoglobal.h"
36 #include "maemomanager.h"
37 #include "qt4projectmanagerconstants.h"
38 #include "qtversionmanager.h"
40 #include <projectexplorer/gccparser.h>
41 #include <projectexplorer/headerpath.h>
42 #include <projectexplorer/toolchainmanager.h>
43 #include <utils/environment.h>
45 #include <QtCore/QDir>
46 #include <QtCore/QFileInfo>
47 #include <QtGui/QLabel>
48 #include <QtGui/QVBoxLayout>
50 namespace Qt4ProjectManager {
53 static const char *const MAEMO_QT_VERSION_KEY = "Qt4ProjectManager.Maemo.QtVersion";
55 // --------------------------------------------------------------------------
57 // --------------------------------------------------------------------------
59 MaemoToolChain::MaemoToolChain(bool autodetected) :
60 ProjectExplorer::GccToolChain(QLatin1String(Constants::MAEMO_TOOLCHAIN_ID), autodetected),
66 MaemoToolChain::MaemoToolChain(const MaemoToolChain &tc) :
67 ProjectExplorer::GccToolChain(tc),
68 m_qtVersionId(tc.m_qtVersionId)
71 MaemoToolChain::~MaemoToolChain()
74 QString MaemoToolChain::typeName() const
76 return MaemoToolChainFactory::tr("Maemo GCC");
79 ProjectExplorer::Abi MaemoToolChain::targetAbi() const
84 bool MaemoToolChain::isValid() const
86 return GccToolChain::isValid() && m_qtVersionId >= 0 && m_targetAbi.isValid();
89 bool MaemoToolChain::canClone() const
94 void MaemoToolChain::addToEnvironment(Utils::Environment &env) const
96 QtVersion *v = QtVersionManager::instance()->version(m_qtVersionId);
97 const QString maddeRoot = MaemoGlobal::maddeRoot(v);
99 // put this into environment to make pkg-config stuff work
100 env.prependOrSet(QLatin1String("SYSROOT_DIR"), QDir::toNativeSeparators(sysroot()));
101 env.prependOrSetPath(QDir::toNativeSeparators(QString("%1/madbin")
103 env.prependOrSetPath(QDir::toNativeSeparators(QString("%1/madlib")
105 env.prependOrSet(QLatin1String("PERL5LIB"),
106 QDir::toNativeSeparators(QString("%1/madlib/perl5").arg(maddeRoot)));
108 env.prependOrSetPath(QDir::toNativeSeparators(QString("%1/bin").arg(maddeRoot)));
109 env.prependOrSetPath(QDir::toNativeSeparators(QString("%1/bin")
110 .arg(MaemoGlobal::targetRoot(v))));
112 const QString manglePathsKey = QLatin1String("GCCWRAPPER_PATHMANGLE");
113 if (!env.hasKey(manglePathsKey)) {
114 const QStringList pathsToMangle = QStringList() << QLatin1String("/lib")
115 << QLatin1String("/opt") << QLatin1String("/usr");
116 env.set(manglePathsKey, QString());
117 foreach (const QString &path, pathsToMangle)
118 env.appendOrSet(manglePathsKey, path, QLatin1String(":"));
122 QString MaemoToolChain::sysroot() const
124 QtVersion *v = QtVersionManager::instance()->version(m_qtVersionId);
128 if (m_sysroot.isEmpty()) {
129 QFile file(QDir::cleanPath(MaemoGlobal::targetRoot(v)) + QLatin1String("/information"));
130 if (file.exists() && file.open(QIODevice::ReadOnly | QIODevice::Text)) {
131 QTextStream stream(&file);
132 while (!stream.atEnd()) {
133 const QString &line = stream.readLine().trimmed();
134 const QStringList &list = line.split(QLatin1Char(' '));
135 if (list.count() > 1 && list.at(0) == QLatin1String("sysroot"))
136 m_sysroot = MaemoGlobal::maddeRoot(v) + QLatin1String("/sysroots/") + list.at(1);
143 bool MaemoToolChain::operator ==(const ProjectExplorer::ToolChain &tc) const
145 if (!ToolChain::operator ==(tc))
148 const MaemoToolChain *tcPtr = static_cast<const MaemoToolChain *>(&tc);
149 return m_qtVersionId == tcPtr->m_qtVersionId;
152 ProjectExplorer::ToolChainConfigWidget *MaemoToolChain::configurationWidget()
154 return new MaemoToolChainConfigWidget(this);
157 QVariantMap MaemoToolChain::toMap() const
159 QVariantMap result = GccToolChain::toMap();
160 result.insert(QLatin1String(MAEMO_QT_VERSION_KEY), m_qtVersionId);
164 bool MaemoToolChain::fromMap(const QVariantMap &data)
166 if (!GccToolChain::fromMap(data))
169 m_qtVersionId = data.value(QLatin1String(MAEMO_QT_VERSION_KEY), -1).toInt();
174 void MaemoToolChain::setQtVersionId(int id)
177 m_targetAbi = ProjectExplorer::Abi();
179 updateId(); // Will trigger toolChainUpdated()!
183 QtVersion *version = QtVersionManager::instance()->version(id);
185 ProjectExplorer::Abi::OSFlavor flavour = ProjectExplorer::Abi::HarmattanLinuxFlavor;
186 if (MaemoGlobal::isValidMaemo5QtVersion(version))
187 flavour = ProjectExplorer::Abi::MaemoLinuxFlavor;
188 else if (MaemoGlobal::isValidHarmattanQtVersion(version))
189 flavour = ProjectExplorer::Abi::HarmattanLinuxFlavor;
190 else if (MaemoGlobal::isValidMeegoQtVersion(version))
191 flavour = ProjectExplorer::Abi::MeegoLinuxFlavor;
197 Q_ASSERT(version->qtAbis().count() == 1);
198 m_targetAbi = version->qtAbis().at(0);
200 updateId(); // Will trigger toolChainUpdated()!
201 setDisplayName(MaemoToolChainFactory::tr("Maemo GCC for %1").arg(version->displayName()));
204 int MaemoToolChain::qtVersionId() const
206 return m_qtVersionId;
209 void MaemoToolChain::updateId()
211 setId(QString::fromLatin1("%1:%2.%3").arg(Constants::MAEMO_TOOLCHAIN_ID)
212 .arg(m_qtVersionId).arg(debuggerCommand()));
215 // --------------------------------------------------------------------------
216 // ToolChainConfigWidget
217 // --------------------------------------------------------------------------
219 MaemoToolChainConfigWidget::MaemoToolChainConfigWidget(MaemoToolChain *tc) :
220 ProjectExplorer::ToolChainConfigWidget(tc)
222 QVBoxLayout *layout = new QVBoxLayout(this);
223 QLabel *label = new QLabel;
224 QtVersion *v = QtVersionManager::instance()->version(tc->qtVersionId());
226 label->setText(tr("<html><head/><body><table>"
227 "<tr><td>Path to MADDE:</td><td>%1</td></tr>"
228 "<tr><td>Path to MADDE target:</td><td>%2</td></tr>"
229 "<tr><td>Debugger:</td/><td>%3</td></tr></body></html>")
230 .arg(QDir::toNativeSeparators(MaemoGlobal::maddeRoot(v)),
231 QDir::toNativeSeparators(MaemoGlobal::targetRoot(v)),
232 QDir::toNativeSeparators(tc->debuggerCommand())));
233 layout->addWidget(label);
236 void MaemoToolChainConfigWidget::apply()
241 void MaemoToolChainConfigWidget::discard()
246 bool MaemoToolChainConfigWidget::isDirty() const
251 // --------------------------------------------------------------------------
253 // --------------------------------------------------------------------------
255 MaemoToolChainFactory::MaemoToolChainFactory() :
256 ProjectExplorer::ToolChainFactory()
259 QString MaemoToolChainFactory::displayName() const
261 return tr("Maemo GCC");
264 QString MaemoToolChainFactory::id() const
266 return QLatin1String(Constants::MAEMO_TOOLCHAIN_ID);
269 QList<ProjectExplorer::ToolChain *> MaemoToolChainFactory::autoDetect()
271 QList<ProjectExplorer::ToolChain *> result;
273 QtVersionManager *vm = QtVersionManager::instance();
274 connect(vm, SIGNAL(qtVersionsChanged(QList<int>)),
275 this, SLOT(handleQtVersionChanges(QList<int>)));
277 QList<int> versionList;
278 foreach (QtVersion *v, vm->versions())
279 versionList.append(v->uniqueId());
281 return createToolChainList(versionList);
284 void MaemoToolChainFactory::handleQtVersionChanges(const QList<int> &changes)
286 ProjectExplorer::ToolChainManager *tcm = ProjectExplorer::ToolChainManager::instance();
287 QList<ProjectExplorer::ToolChain *> tcList = createToolChainList(changes);
288 foreach (ProjectExplorer::ToolChain *tc, tcList)
289 tcm->registerToolChain(tc);
292 QList<ProjectExplorer::ToolChain *> MaemoToolChainFactory::createToolChainList(const QList<int> &changes)
294 ProjectExplorer::ToolChainManager *tcm = ProjectExplorer::ToolChainManager::instance();
295 QtVersionManager *vm = QtVersionManager::instance();
296 QList<ProjectExplorer::ToolChain *> result;
298 foreach (int i, changes) {
299 QtVersion *v = vm->version(i);
301 // remove tool chain:
302 QList<ProjectExplorer::ToolChain *> toRemove;
303 foreach (ProjectExplorer::ToolChain *tc, tcm->toolChains()) {
304 if (!tc->id().startsWith(QLatin1String(Constants::MAEMO_TOOLCHAIN_ID)))
306 MaemoToolChain *mTc = static_cast<MaemoToolChain *>(tc);
307 if (mTc->qtVersionId() == i)
308 toRemove.append(mTc);
310 foreach (ProjectExplorer::ToolChain *tc, toRemove)
311 tcm->deregisterToolChain(tc);
312 } else if (v->supportsTargetId(Constants::MAEMO5_DEVICE_TARGET_ID)
313 || v->supportsTargetId(Constants::HARMATTAN_DEVICE_TARGET_ID)
314 || v->supportsTargetId(Constants::MEEGO_DEVICE_TARGET_ID)) {
316 MaemoToolChain *mTc = new MaemoToolChain(true);
317 mTc->setQtVersionId(i);
318 QString target = "Maemo 5";
319 if (v->supportsTargetId(Constants::HARMATTAN_DEVICE_TARGET_ID))
321 else if (v->supportsTargetId(Constants::MEEGO_DEVICE_TARGET_ID))
323 mTc->setDisplayName(tr("%1 GCC (%2)").arg(target).arg(MaemoGlobal::maddeRoot(v)));
324 mTc->setCompilerPath(MaemoGlobal::targetRoot(v) + QLatin1String("/bin/gcc"));
325 mTc->setDebuggerCommand(ProjectExplorer::ToolChainManager::instance()->defaultDebugger(v->qtAbis().at(0)));
326 if (mTc->debuggerCommand().isEmpty())
327 mTc->setDebuggerCommand(MaemoGlobal::targetRoot(v) + QLatin1String("/bin/gdb"));
334 } // namespace Internal
335 } // namespace Qt4ProjectManager