61
63
static const char ANDROID_QT_VERSION_KEY[] = "Qt4ProjectManager.Android.QtVersion";
62
64
static const char ANDROID_NDK_TC_VERION[] = "Qt4ProjectManager.Android.NDK_TC_VERION";
64
AndroidToolChain::AndroidToolChain(Abi::Architecture arch, const QString &ndkToolChainVersion, bool autodetected)
65
: GccToolChain(QLatin1String(Constants::ANDROID_TOOLCHAIN_ID), autodetected),
66
m_ndkToolChainVersion(ndkToolChainVersion)
66
QMap<ProjectExplorer::Abi::Architecture, QList<int> > AndroidToolChainFactory::m_newestVersionForArch;
67
Utils::FileName AndroidToolChainFactory::m_ndkLocation;
69
AndroidToolChain::AndroidToolChain(Abi::Architecture arch, const QString &ndkToolChainVersion, Detection d)
70
: GccToolChain(QLatin1String(Constants::ANDROID_TOOLCHAIN_ID), d),
71
m_ndkToolChainVersion(ndkToolChainVersion), m_secondaryToolChain(false)
68
73
ProjectExplorer::Abi abi = ProjectExplorer::Abi(arch, ProjectExplorer::Abi::LinuxOS,
69
74
ProjectExplorer::Abi::AndroidLinuxFlavor, ProjectExplorer::Abi::ElfFormat,
78
83
AndroidToolChain::AndroidToolChain()
79
: GccToolChain(QLatin1String(Constants::ANDROID_TOOLCHAIN_ID), false)
84
: GccToolChain(QLatin1String(Constants::ANDROID_TOOLCHAIN_ID), ToolChain::ManualDetection),
85
m_secondaryToolChain(false)
83
89
AndroidToolChain::AndroidToolChain(const AndroidToolChain &tc) :
84
GccToolChain(tc), m_ndkToolChainVersion(tc.m_ndkToolChainVersion)
90
GccToolChain(tc), m_ndkToolChainVersion(tc.m_ndkToolChainVersion),
91
m_secondaryToolChain(tc.m_secondaryToolChain)
87
94
AndroidToolChain::~AndroidToolChain()
117
124
if (!javaHome.isEmpty() && QFileInfo(javaHome).exists())
118
125
env.set(QLatin1String("JAVA_HOME"), javaHome);
119
126
env.set(QLatin1String("ANDROID_HOME"), AndroidConfigurations::instance().config().sdkLocation.toString());
127
env.set(QLatin1String("ANDROID_SDK_ROOT"), AndroidConfigurations::instance().config().sdkLocation.toString());
122
130
bool AndroidToolChain::operator ==(const ToolChain &tc) const
218
229
return tmp.isEmpty() ? make : tmp;
221
QString AndroidToolChain::ndkToolChainVersion()
232
QString AndroidToolChain::ndkToolChainVersion() const
223
234
return m_ndkToolChainVersion;
237
bool AndroidToolChain::isSecondaryToolChain() const
239
return m_secondaryToolChain;
242
void AndroidToolChain::setSecondaryToolChain(bool b)
244
m_secondaryToolChain = b;
226
247
QList<Abi> AndroidToolChain::detectSupportedAbis() const
228
249
return QList<Abi>() << targetAbi();
243
264
// ToolChainFactory
244
265
// --------------------------------------------------------------------------
246
AndroidToolChainFactory::AndroidToolChainFactory() :
250
QString AndroidToolChainFactory::displayName() const
252
return tr("Android GCC");
255
QString AndroidToolChainFactory::id() const
257
return QLatin1String(Constants::ANDROID_TOOLCHAIN_ID);
267
AndroidToolChainFactory::AndroidToolChainFactory()
269
setId(Constants::ANDROID_TOOLCHAIN_ID);
270
setDisplayName(tr("Android GCC"));
260
273
QList<ToolChain *> AndroidToolChainFactory::autoDetect()
321
QList<int> AndroidToolChainFactory::versionNumberFromString(const QString &version)
325
int end = version.length();
326
while (start <= end) {
327
int index = version.indexOf(QLatin1Char('.'), start);
332
int v = version.mid(start, index - start).toInt(&ok);
333
if (!ok) // unparseable, return what we have
342
bool AndroidToolChainFactory::versionCompareLess(const QList<int> &a, const QList<int> &b)
344
int aend = a.length();
345
int bend = b.length();
346
int end = qMax(aend, bend);
347
for (int i = 0; i < end; ++i) {
348
int an = i < aend ? a.at(i) : 0;
349
int bn = i < bend ? b.at(i) : 0;
358
bool AndroidToolChainFactory::versionCompareLess(AndroidToolChain *atc, AndroidToolChain *btc)
360
QList<int> a = versionNumberFromString(atc->ndkToolChainVersion());
361
QList<int> b = versionNumberFromString(btc->ndkToolChainVersion());
363
return versionCompareLess(a, b);
308
366
QList<ToolChain *> AndroidToolChainFactory::createToolChainsForNdk(const Utils::FileName &ndkPath)
310
368
QList<ToolChain *> result;
314
372
FileName path = ndkPath;
315
373
QDirIterator it(path.appendPath(QLatin1String("toolchains")).toString(),
316
374
QStringList() << QLatin1String("*"), QDir::Dirs);
375
QMap<Abi::Architecture, AndroidToolChain *> newestToolChainForArch;
317
377
while (it.hasNext()) {
318
378
const QString &fileName = QFileInfo(it.next()).fileName();
319
379
int idx = versionRegExp.indexIn(fileName);
324
384
Abi::Architecture arch = AndroidConfigurations::architectureForToolChainPrefix(platform);
325
385
if (arch == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported
327
AndroidToolChain *tc = new AndroidToolChain(arch, version, true);
387
AndroidToolChain *tc = new AndroidToolChain(arch, version, ToolChain::AutoDetection);
328
388
FileName compilerPath = AndroidConfigurations::instance().gccPath(arch, version);
329
389
tc->setCompilerCommand(compilerPath);
330
390
result.append(tc);
392
QMap<Abi::Architecture, AndroidToolChain *>::const_iterator it
393
= newestToolChainForArch.constFind(arch);
394
if (it == newestToolChainForArch.constEnd())
395
newestToolChainForArch.insert(arch, tc);
396
else if (versionCompareLess(it.value(), tc))
397
newestToolChainForArch[arch] = tc;
400
foreach (ToolChain *tc, result) {
401
AndroidToolChain *atc = static_cast<AndroidToolChain *>(tc);
402
if (newestToolChainForArch.value(atc->targetAbi().architecture()) != atc)
403
atc->setSecondaryToolChain(true);
409
QList<int> AndroidToolChainFactory::newestToolChainVersionForArch(Abi::Architecture arch)
411
if (m_newestVersionForArch.isEmpty()
412
|| m_ndkLocation != AndroidConfigurations::instance().config().ndkLocation) {
413
QRegExp versionRegExp(NDKGccVersionRegExp);
414
m_ndkLocation = AndroidConfigurations::instance().config().ndkLocation;
415
FileName path = m_ndkLocation;
416
QDirIterator it(path.appendPath(QLatin1String("toolchains")).toString(),
417
QStringList() << QLatin1String("*"), QDir::Dirs);
418
while (it.hasNext()) {
419
const QString &fileName = QFileInfo(it.next()).fileName();
420
int idx = versionRegExp.indexIn(fileName);
423
QList<int> version = versionNumberFromString(fileName.mid(idx + 1));
424
QString platform = fileName.left(idx);
425
Abi::Architecture arch = AndroidConfigurations::architectureForToolChainPrefix(platform);
426
if (arch == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported
428
QMap<Abi::Architecture, QList<int> >::const_iterator it
429
= m_newestVersionForArch.constFind(arch);
430
if (it == m_newestVersionForArch.constEnd())
431
m_newestVersionForArch.insert(arch, version);
432
else if (versionCompareLess(it.value(), version))
433
m_newestVersionForArch[arch] = version;
436
return m_newestVersionForArch.value(arch);
335
439
} // namespace Internal
336
440
} // namespace Android