Revert "ProjectExplorer: Remove toolchain settings compatibility with <= 4.3"

This reverts commit 6baf09bf91.

sdktool still writes the toolchains with the old settings key.
This should be changed in a follow-up commit, but since we missed
updating the key used in sdktool, we have to stay compatible with that
for a longer while still, or we break lots of existing Qt installations
out there (specifically Boot2Qt, which is the main user of the sdktool
operation).

Fixes: QTCREATORBUG-25647
Change-Id: Ie665c9db5fd5bb808f510c53fd4173b8a318bb7c
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Eike Ziller
2021-04-30 10:11:16 +02:00
parent 0bcb5953ed
commit ed6b3f2bcd
3 changed files with 119 additions and 1 deletions

View File

@@ -58,6 +58,8 @@
namespace ProjectExplorer {
const char KITINFORMATION_ID_V1[] = "PE.Profile.ToolChain";
const char KITINFORMATION_ID_V2[] = "PE.Profile.ToolChains";
const char KITINFORMATION_ID_V3[] = "PE.Profile.ToolChainsV3";
// --------------------------------------------------------------------------
@@ -387,6 +389,65 @@ Tasks ToolChainKitAspect::validate(const Kit *k) const
void ToolChainKitAspect::upgrade(Kit *k)
{
QTC_ASSERT(k, return);
const Utils::Id oldIdV1 = KITINFORMATION_ID_V1;
const Utils::Id oldIdV2 = KITINFORMATION_ID_V2;
// upgrade <=4.1 to 4.2 (keep old settings around for now)
{
const QVariant oldValue = k->value(oldIdV1);
const QVariant value = k->value(oldIdV2);
if (value.isNull() && !oldValue.isNull()) {
QVariantMap newValue;
if (oldValue.type() == QVariant::Map) {
// Used between 4.1 and 4.2:
newValue = oldValue.toMap();
} else {
// Used up to 4.1:
newValue.insert(Deprecated::Toolchain::languageId(Deprecated::Toolchain::Cxx), oldValue.toString());
const Utils::Id typeId = DeviceTypeKitAspect::deviceTypeId(k);
if (typeId == Constants::DESKTOP_DEVICE_TYPE) {
// insert default C compiler which did not exist before
newValue.insert(Deprecated::Toolchain::languageId(Deprecated::Toolchain::C),
defaultToolChainIds().value(Utils::Id(Constants::C_LANGUAGE_ID)));
}
}
k->setValue(oldIdV2, newValue);
k->setSticky(oldIdV2, k->isSticky(oldIdV1));
}
}
// upgrade 4.2 to 4.3 (keep old settings around for now)
{
const QVariant oldValue = k->value(oldIdV2);
const QVariant value = k->value(ToolChainKitAspect::id());
if (value.isNull() && !oldValue.isNull()) {
QVariantMap newValue = oldValue.toMap();
QVariantMap::iterator it = newValue.find(Deprecated::Toolchain::languageId(Deprecated::Toolchain::C));
if (it != newValue.end())
newValue.insert(Utils::Id(Constants::C_LANGUAGE_ID).toString(), it.value());
it = newValue.find(Deprecated::Toolchain::languageId(Deprecated::Toolchain::Cxx));
if (it != newValue.end())
newValue.insert(Utils::Id(Constants::CXX_LANGUAGE_ID).toString(), it.value());
k->setValue(ToolChainKitAspect::id(), newValue);
k->setSticky(ToolChainKitAspect::id(), k->isSticky(oldIdV2));
}
}
// upgrade 4.3-temporary-master-state to 4.3:
{
const QVariantMap valueMap = k->value(ToolChainKitAspect::id()).toMap();
QVariantMap result;
for (const QString &key : valueMap.keys()) {
const int pos = key.lastIndexOf('.');
if (pos >= 0)
result.insert(key.mid(pos + 1), valueMap.value(key));
else
result.insert(key, valueMap.value(key));
}
k->setValue(ToolChainKitAspect::id(), result);
}
}
void ToolChainKitAspect::fix(Kit *k)

View File

@@ -44,6 +44,7 @@ using namespace Utils;
static const char ID_KEY[] = "ProjectExplorer.ToolChain.Id";
static const char DISPLAY_NAME_KEY[] = "ProjectExplorer.ToolChain.DisplayName";
static const char AUTODETECT_KEY[] = "ProjectExplorer.ToolChain.Autodetect";
static const char LANGUAGE_KEY_V1[] = "ProjectExplorer.ToolChain.Language"; // For QtCreator <= 4.2
static const char LANGUAGE_KEY_V2[] = "ProjectExplorer.ToolChain.LanguageV2"; // For QtCreator > 4.2
namespace ProjectExplorer {
@@ -86,8 +87,41 @@ public:
ToolChain::HeaderPathsCache m_headerPathsCache;
};
} // Internal
// Deprecated used from QtCreator <= 4.2
Utils::Id fromLanguageV1(int language)
{
switch (language)
{
case Deprecated::Toolchain::C :
return Utils::Id(Constants::C_LANGUAGE_ID);
case Deprecated::Toolchain::Cxx:
return Utils::Id(Constants::CXX_LANGUAGE_ID);
case Deprecated::Toolchain::None:
default:
return Utils::Id();
}
}
} // namespace Internal
namespace Deprecated {
namespace Toolchain {
QString languageId(Language l)
{
switch (l) {
case Language::None:
return QStringLiteral("None");
case Language::C:
return QStringLiteral("C");
case Language::Cxx:
return QStringLiteral("Cxx");
};
return QString();
}
} // namespace Toolchain
} // namespace Deprecated
/*!
\class ProjectExplorer::ToolChain
@@ -219,6 +253,15 @@ QVariantMap ToolChain::toMap() const
result.insert(QLatin1String(ID_KEY), idToSave);
result.insert(QLatin1String(DISPLAY_NAME_KEY), displayName());
result.insert(QLatin1String(AUTODETECT_KEY), isAutoDetected());
// <Compatibility with QtC 4.2>
int oldLanguageId = -1;
if (language() == ProjectExplorer::Constants::C_LANGUAGE_ID)
oldLanguageId = 1;
else if (language() == ProjectExplorer::Constants::CXX_LANGUAGE_ID)
oldLanguageId = 2;
if (oldLanguageId >= 0)
result.insert(LANGUAGE_KEY_V1, oldLanguageId);
// </Compatibility>
result.insert(QLatin1String(LANGUAGE_KEY_V2), language().toSetting());
if (!d->m_targetAbiKey.isEmpty())
result.insert(d->m_targetAbiKey, d->m_targetAbi.toString());
@@ -328,6 +371,8 @@ bool ToolChain::fromMap(const QVariantMap &data)
d->m_language = Utils::Id::fromString(langId.mid(pos + 1));
else
d->m_language = Utils::Id::fromString(langId);
} else if (data.contains(LANGUAGE_KEY_V1)) { // Import from old settings
d->m_language = Internal::fromLanguageV1(data.value(QLatin1String(LANGUAGE_KEY_V1)).toInt());
}
if (!d->m_language.isValid())

View File

@@ -51,6 +51,18 @@ namespace ProjectExplorer {
namespace Internal { class ToolChainPrivate; }
namespace Deprecated {
// Deprecated in 4.3:
namespace Toolchain {
enum Language {
None = 0,
C,
Cxx
};
QString languageId(Language l);
} // namespace Toolchain
} // namespace Deprecated
class ToolChainConfigWidget;
class ToolChainFactory;
class Kit;