Android: avoid scanning mkspecs to detect android abi

Use the abi information from the modules/*.json files instead. Those
json files are part of a Qt installation since Qt 6.0. Fallback to the
old mkspec parsing for older Qt Versions.

Fixes: QTCREATORBUG-31068
Change-Id: I18fcea17233eaf2bdc562b9b36718c29eddd1dbe
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
David Schulz
2024-11-05 14:37:54 +01:00
parent 1b9636c8d9
commit 2099f5bb98
6 changed files with 35 additions and 22 deletions

View File

@@ -82,8 +82,12 @@ bool AndroidQtVersion::supportsMultipleQtAbis() const
Abis AndroidQtVersion::detectQtAbis() const
{
const bool conf = AndroidConfig::sdkFullyConfigured();
return conf ? Utils::transform<Abis>(androidAbis(), &androidAbi2Abi) : Abis();
Abis result = qtAbisFromJson();
if (result.isEmpty() && AndroidConfig::sdkFullyConfigured()) {
ensureMkSpecParsed();
result = Utils::transform<Abis>(m_androidAbis, &androidAbi2Abi);
}
return result;
}
void AndroidQtVersion::addToBuildEnvironment(const Kit *k, Utils::Environment &env) const
@@ -109,10 +113,9 @@ QString AndroidQtVersion::description() const
return Tr::tr("Android");
}
const QStringList &AndroidQtVersion::androidAbis() const
const QStringList AndroidQtVersion::androidAbis() const
{
ensureMkSpecParsed();
return m_androidAbis;
return Utils::transform(detectQtAbis(), &Abi::toAndroidAbi);
}
int AndroidQtVersion::minimumNDK() const

View File

@@ -25,7 +25,7 @@ public:
QSet<Utils::Id> targetDeviceTypes() const override;
QString description() const override;
const QStringList &androidAbis() const;
const QStringList androidAbis() const;
int minimumNDK() const;
static QString androidDeploymentSettingsFileName(const ProjectExplorer::Target *target);

View File

@@ -443,18 +443,6 @@ static Abis abiOf(const QByteArray &data)
return result;
}
static QString androidAbiFromAbi(const Abi &abi)
{
QString androidAbi;
if (abi.architecture() == Abi::Architecture::ArmArchitecture)
androidAbi = QLatin1String(abi.wordWidth() == 64 ? Constants::ANDROID_ABI_ARM64_V8A
: Constants::ANDROID_ABI_ARMEABI_V7A);
else
androidAbi = QLatin1String(abi.wordWidth() == 64 ? Constants::ANDROID_ABI_X86_64
: Constants::ANDROID_ABI_X86);
return androidAbi;
}
// --------------------------------------------------------------------------
// Abi
// --------------------------------------------------------------------------
@@ -689,6 +677,22 @@ QString Abi::param() const
return m_param;
}
QString Abi::toAndroidAbi() const
{
if (architecture() == Abi::Architecture::ArmArchitecture) {
if (wordWidth() == 32)
return Constants::ANDROID_ABI_ARMEABI_V7A;
if (wordWidth() == 64)
return Constants::ANDROID_ABI_ARM64_V8A;
} else if (architecture() == Abi::Architecture::X86Architecture) {
if (wordWidth() == 32)
return Constants::ANDROID_ABI_X86;
if (wordWidth() == 64)
return Constants::ANDROID_ABI_X86_64;
}
return {};
}
bool Abi::operator != (const Abi &other) const
{
return !operator ==(other);
@@ -936,7 +940,7 @@ Abi Abi::fromString(const QString &abiString)
Abi abi(architecture, os, flavor, format, wordWidth);
if (abi.os() == LinuxOS && abi.osFlavor() == AndroidLinuxFlavor)
abi.m_param = androidAbiFromAbi(abi);
abi.m_param = abi.toAndroidAbi();
return abi;
}

View File

@@ -144,6 +144,8 @@ public:
QString toString() const;
QString param() const;
QString toAndroidAbi() const;
static QString toString(const Architecture &a);
static QString toString(const OS &o);
static QString toString(const OSFlavor &of);

View File

@@ -751,14 +751,17 @@ void QtVersion::setQtAbis(const Abis &abis)
Abis QtVersion::detectQtAbis() const
{
qCDebug(abiDetect) << "Detecting ABIs for" << qmakeFilePath();
if (const Abis abis = qtAbisFromJson(*this, {d->data().archDataPath, d->data().dataPath});
!abis.isEmpty()) {
if (const Abis abis = qtAbisFromJson(); !abis.isEmpty())
return abis;
}
qCDebug(abiDetect) << "Got no ABI from JSON file, falling back to inspecting binaries";
return d->qtAbisFromLibrary();
}
Abis QtVersion::qtAbisFromJson() const
{
return QtSupport::Internal::qtAbisFromJson(*this, {d->data().archDataPath, d->data().dataPath});
}
bool QtVersion::hasAbi(ProjectExplorer::Abi::OS os, ProjectExplorer::Abi::OSFlavor flavor) const
{
const Abis abis = qtAbis();

View File

@@ -203,6 +203,7 @@ protected:
const Utils::FilePath &buildDir) const;
virtual ProjectExplorer::Abis detectQtAbis() const;
ProjectExplorer::Abis qtAbisFromJson() const;
void resetCache() const;