Merge remote-tracking branch 'origin/4.12'

Conflicts:
	src/plugins/cmakeprojectmanager/tealeafreader.cpp
	src/plugins/cmakeprojectmanager/tealeafreader.h
	src/plugins/projectexplorer/miniprojecttargetselector.cpp

Change-Id: I88d85be3903f57a55fddb7901e771a4822db1b85
This commit is contained in:
Eike Ziller
2020-03-04 08:15:50 +01:00
368 changed files with 8945 additions and 6485 deletions

View File

@@ -93,14 +93,22 @@ AndroidToolChain::~AndroidToolChain() = default;
bool AndroidToolChain::isValid() const
{
if (m_ndkLocation.isEmpty()) {
QStringList ndkParts(compilerCommand().toString().split("toolchains/llvm/prebuilt/"));
if (ndkParts.size() > 1) {
QString ndkLocation(ndkParts.first());
if (ndkLocation.endsWith('/'))
ndkLocation.chop(1);
m_ndkLocation = FilePath::fromString(ndkLocation);
}
}
const bool isChildofNdk = compilerCommand().isChildOf(m_ndkLocation);
// If we're restoring a toolchain we set NDK path ourselves so it's enough to check against SDK
const bool isChildofSdk = compilerCommand().isChildOf(
AndroidConfigurations::currentConfig().sdkLocation());
return ClangToolChain::isValid() && typeId() == Constants::ANDROID_TOOLCHAIN_TYPEID
&& targetAbi().isValid()
&& (isChildofNdk || isChildofSdk)
&& targetAbi().isValid() && (isChildofNdk || isChildofSdk)
&& !originalTargetTriple().isEmpty();
}
@@ -163,7 +171,7 @@ AndroidToolChainFactory::AndroidToolChainFactory()
ToolChainList AndroidToolChainFactory::autoDetect(const ToolChainList &alreadyKnown)
{
return autodetectToolChainsForNdk(alreadyKnown);
return autodetectToolChains(alreadyKnown);
}
static FilePath clangPlusPlusPath(const FilePath &clangPath)
@@ -173,7 +181,7 @@ static FilePath clangPlusPlusPath(const FilePath &clangPath)
QFileInfo(clangPath.toString()).baseName() + "++"));
}
static QList<QtSupport::BaseQtVersion *> androidQtVersionsWithUniqueNdk()
static QList<FilePath> uniqueNdksForCurrentQtVersions()
{
AndroidConfig config = AndroidConfigurations::currentConfig();
@@ -182,36 +190,40 @@ static QList<QtSupport::BaseQtVersion *> androidQtVersionsWithUniqueNdk()
return v->targetDeviceTypes().contains(Android::Constants::ANDROID_DEVICE_TYPE);
});
auto shouldRemove = [config](const QtSupport::BaseQtVersion *first,
const QtSupport::BaseQtVersion *second) {
return config.ndkLocation(first) == config.ndkLocation(second);
};
QList<FilePath> uniqueNdks;
for (const QtSupport::BaseQtVersion *version : androidQtVersions) {
FilePath ndk = config.ndkLocation(version);
if (!uniqueNdks.contains(ndk))
uniqueNdks.append(ndk);
}
QList<QtSupport::BaseQtVersion *>::iterator it = std::unique(androidQtVersions.begin(),
androidQtVersions.end(),
shouldRemove);
androidQtVersions.erase(it, androidQtVersions.end());
return androidQtVersions;
return uniqueNdks;
}
ToolChainList AndroidToolChainFactory::autodetectToolChainsForNdk(const ToolChainList &alreadyKnown)
ToolChainList AndroidToolChainFactory::autodetectToolChains(const ToolChainList &alreadyKnown)
{
const QList<Utils::FilePath> uniqueNdks = uniqueNdksForCurrentQtVersions();
return autodetectToolChainsFromNdks(alreadyKnown, uniqueNdks);
}
ToolChainList AndroidToolChainFactory::autodetectToolChainsFromNdks(
const ToolChainList &alreadyKnown,
const QList<Utils::FilePath> &ndkLocations,
const bool isCustom)
{
QList<ToolChain *> result;
const QList<QtSupport::BaseQtVersion *> androidQtVersions = androidQtVersionsWithUniqueNdk();
const AndroidConfig config = AndroidConfigurations::currentConfig();
for (const QtSupport::BaseQtVersion *qtVersion : androidQtVersions) {
FilePath clangPath = config.clangPath(qtVersion);
for (const Utils::FilePath &ndkLocation : ndkLocations) {
qCDebug(androidTCLog) << "Detecting toolchains from Android NDK:" << ndkLocation;
FilePath clangPath = config.clangPathFromNdk(ndkLocation);
if (!clangPath.exists()) {
qCDebug(androidTCLog) << "Clang toolchains detection fails. Can not find Clang"
<< clangPath;
return result;
continue;
}
qCDebug(androidTCLog) << "Detecting toolchains from Android NDK:"
<< config.ndkLocation(qtVersion);
for (const Core::Id &lang : LanguageIds) {
FilePath compilerCommand = clangPath;
if (lang == ProjectExplorer::Constants::CXX_LANGUAGE_ID)
@@ -229,10 +241,11 @@ ToolChainList AndroidToolChainFactory::autodetectToolChainsForNdk(const ToolChai
const QString target = targetItr.key();
ToolChain *tc = findToolChain(compilerCommand, lang, target, alreadyKnown);
const QString displayName(QString("Android Clang (%1, %2, NDK %3)")
QLatin1String customStr = isCustom ? QLatin1String("Custom ") : QLatin1String();
const QString displayName(customStr + QString("Android Clang (%1, %2, NDK %3)")
.arg(ToolChainManager::displayNameOfLanguageId(lang),
AndroidConfig::displayName(abi),
config.ndkVersion(qtVersion).toString()));
config.ndkVersion(ndkLocation).toString()));
if (tc) {
qCDebug(androidTCLog) << "Tool chain already known" << abi.toString() << lang;
// make sure to update the toolchain with current name format
@@ -241,7 +254,7 @@ ToolChainList AndroidToolChainFactory::autodetectToolChainsForNdk(const ToolChai
} else {
qCDebug(androidTCLog) << "New Clang toolchain found" << abi.toString() << lang;
auto atc = new AndroidToolChain();
atc->setNdkLocation(config.ndkLocation(qtVersion));
atc->setNdkLocation(ndkLocation);
atc->setOriginalTargetTriple(target);
atc->setLanguage(lang);
atc->setTargetAbi(ClangTargets[target]);