McuSupport: remove legacy support for 1.x SDKs

Task-number: QTCREATORBUG-26891
Change-Id: I011649b051c6c4c9b954b1c782685e404c3796fe
Reviewed-by: Piotr Mućko <piotr.mucko@qt.io>
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Christiaan Janssen
2022-02-15 12:20:44 +01:00
parent 209ecc91a0
commit 6e96480154
4 changed files with 63 additions and 182 deletions

View File

@@ -401,7 +401,7 @@ void McuSupportOptions::registerExamples()
const QVersionNumber &McuSupportOptions::minimalQulVersion() const QVersionNumber &McuSupportOptions::minimalQulVersion()
{ {
static const QVersionNumber v({1, 3}); static const QVersionNumber v({2, 0});
return v; return v;
} }
@@ -420,7 +420,7 @@ void McuSupportOptions::setQulDir(const FilePath &dir)
FilePath McuSupportOptions::qulDirFromSettings() FilePath McuSupportOptions::qulDirFromSettings()
{ {
return Sdk::packagePathFromSettings(Constants::SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK, return Sdk::packagePathFromSettings(Constants::SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK,
QSettings::UserScope); QSettings::UserScope, {});
} }
static void setKitProperties(const QString &kitName, static void setKitProperties(const QString &kitName,
@@ -567,14 +567,6 @@ void McuSupportOptions::setKitEnvironment(Kit *k,
processPackage(package); processPackage(package);
processPackage(qtForMCUsSdkPackage); processPackage(qtForMCUsSdkPackage);
// Clang not needed in version 1.7+
if (mcuTarget->qulVersion() < QVersionNumber{1, 7}) {
const QString path = QLatin1String(HostOsInfo::isWindowsHost() ? "Path" : "PATH");
pathAdditions.append("${" + path + "}");
pathAdditions.append(Core::ICore::libexecPath("clang/bin").toUserOutput());
changes.append({path, pathAdditions.join(HostOsInfo::pathListSeparator())});
}
if (kitNeedsQtVersion()) if (kitNeedsQtVersion())
changes.append({QLatin1String("LD_LIBRARY_PATH"), "%{Qt:QT_INSTALL_LIBS}"}); changes.append({QLatin1String("LD_LIBRARY_PATH"), "%{Qt:QT_INSTALL_LIBS}"});
@@ -671,9 +663,6 @@ static void setKitCMakeOptions(Kit *k, const McuTarget *mcuTarget, const FilePat
config.append(CMakeConfigItem("QUL_PLATFORM", mcuTarget->platform().name.toUtf8())); config.append(CMakeConfigItem("QUL_PLATFORM", mcuTarget->platform().name.toUtf8()));
if (mcuTarget->qulVersion() <= QVersionNumber{1, 3} // OS variable was removed in Qul 1.4
&& mcuTarget->os() == McuTarget::OS::FreeRTOS)
config.append(CMakeConfigItem("OS", "FreeRTOS"));
if (mcuTarget->colorDepth() != McuTarget::UnspecifiedColorDepth) if (mcuTarget->colorDepth() != McuTarget::UnspecifiedColorDepth)
config.append(CMakeConfigItem("QUL_COLOR_DEPTH", config.append(CMakeConfigItem("QUL_COLOR_DEPTH",
QString::number(mcuTarget->colorDepth()).toLatin1())); QString::number(mcuTarget->colorDepth()).toLatin1()));
@@ -700,12 +689,6 @@ static void setKitQtVersionOptions(Kit *k)
QString McuSupportOptions::kitName(const McuTarget *mcuTarget) QString McuSupportOptions::kitName(const McuTarget *mcuTarget)
{ {
QString os;
if (mcuTarget->qulVersion() <= QVersionNumber{1, 3}
&& mcuTarget->os() == McuTarget::OS::FreeRTOS)
// Starting from Qul 1.4 each OS is a separate platform
os = QLatin1String(" FreeRTOS");
const McuToolChainPackage *tcPkg = mcuTarget->toolChainPackage(); const McuToolChainPackage *tcPkg = mcuTarget->toolChainPackage();
const QString compilerName = tcPkg && !tcPkg->isDesktopToolchain() const QString compilerName = tcPkg && !tcPkg->isDesktopToolchain()
? QString::fromLatin1(" (%1)").arg( ? QString::fromLatin1(" (%1)").arg(
@@ -717,11 +700,10 @@ QString McuSupportOptions::kitName(const McuTarget *mcuTarget)
const QString targetName = mcuTarget->platform().displayName.isEmpty() const QString targetName = mcuTarget->platform().displayName.isEmpty()
? mcuTarget->platform().name ? mcuTarget->platform().name
: mcuTarget->platform().displayName; : mcuTarget->platform().displayName;
return QString::fromLatin1("Qt for MCUs %1.%2 - %3%4%5%6") return QString::fromLatin1("Qt for MCUs %1.%2 - %3%4%5")
.arg(QString::number(mcuTarget->qulVersion().majorVersion()), .arg(QString::number(mcuTarget->qulVersion().majorVersion()),
QString::number(mcuTarget->qulVersion().minorVersion()), QString::number(mcuTarget->qulVersion().minorVersion()),
targetName, targetName,
os,
colorDepth, colorDepth,
compilerName); compilerName);
} }

View File

@@ -527,10 +527,9 @@ protected:
QVector<McuTarget *> mcuTargets; QVector<McuTarget *> mcuTargets;
McuToolChainPackage *tcPkg = tcPkgs.value(desc.toolchain.id); McuToolChainPackage *tcPkg = tcPkgs.value(desc.toolchain.id);
if (tcPkg) { if (tcPkg)
if (QVersionNumber::fromString(desc.qulVersion) >= QVersionNumber({1, 8})) tcPkg->setVersions(desc.toolchain.versions);
tcPkg->setVersions(desc.toolchain.versions); else
} else
tcPkg = createUnsupportedToolChainPackage(); tcPkg = createUnsupportedToolChainPackage();
for (int colorDepth : desc.platform.colorDepths) { for (int colorDepth : desc.platform.colorDepths) {
QVector<McuAbstractPackage *> required3rdPartyPkgs; QVector<McuAbstractPackage *> required3rdPartyPkgs;
@@ -551,8 +550,7 @@ protected:
boardSdkPkgs.insert(desc.boardSdk.envVar, boardSdkPkg); boardSdkPkgs.insert(desc.boardSdk.envVar, boardSdkPkg);
} }
auto boardSdkPkg = boardSdkPkgs.value(desc.boardSdk.envVar); auto boardSdkPkg = boardSdkPkgs.value(desc.boardSdk.envVar);
if (QVersionNumber::fromString(desc.qulVersion) >= QVersionNumber({1, 8})) boardSdkPkg->setVersions(desc.boardSdk.versions);
boardSdkPkg->setVersions(desc.boardSdk.versions);
boardSdkDefaultPath = boardSdkPkg->defaultPath(); boardSdkDefaultPath = boardSdkPkg->defaultPath();
required3rdPartyPkgs.append(boardSdkPkg); required3rdPartyPkgs.append(boardSdkPkg);
} }
@@ -641,9 +639,12 @@ static QFileInfoList targetDescriptionFiles(const Utils::FilePath &dir)
return kitsDir.entryInfoList(); return kitsDir.entryInfoList();
} }
static McuTargetDescription parseDescriptionJsonCommon(const QString &qulVersion, McuTargetDescription parseDescriptionJson(const QByteArray &data)
const QJsonObject &target)
{ {
const QJsonDocument document = QJsonDocument::fromJson(data);
const QJsonObject target = document.object();
const QString qulVersion = target.value("qulVersion").toString();
const QJsonObject platform = target.value("platform").toObject();
const QString compatVersion = target.value("compatVersion").toString(); const QString compatVersion = target.value("compatVersion").toString();
const QJsonObject toolchain = target.value("toolchain").toObject(); const QJsonObject toolchain = target.value("toolchain").toObject();
const QJsonObject boardSdk = target.value("boardSdk").toObject(); const QJsonObject boardSdk = target.value("boardSdk").toObject();
@@ -660,105 +661,70 @@ static McuTargetDescription parseDescriptionJsonCommon(const QString &qulVersion
return version.toString(); return version.toString();
}); });
return {qulVersion,
compatVersion,
{},
{
toolchain.value("id").toString(),
toolchainVersionsList,
},
{
boardSdk.value("name").toString(),
boardSdk.value("defaultPath").toString(),
boardSdk.value("envVar").toString(),
boardSdkVersionsList,
},
{
freeRTOS.value("envVar").toString(),
freeRTOS.value("boardSdkSubDir").toString(),
}};
}
static McuTargetDescription parseDescriptionJsonV1x(const QString &qulVersion,
const QJsonObject &target)
{
auto description = parseDescriptionJsonCommon(qulVersion, target);
const QVariantList colorDepths = target.value("colorDepths").toArray().toVariantList();
const auto colorDepthsVector = Utils::transform<QVector<int>>(colorDepths,
[&](const QVariant &colorDepth) {
return colorDepth.toInt();
});
description.platform = {target.value("platform").toString(),
target.value("platformName").toString(),
target.value("platformVendor").toString(),
colorDepthsVector,
description.boardSdk.envVar.isEmpty()
? McuTargetDescription::TargetType::Desktop
: McuTargetDescription::TargetType::MCU};
return description;
}
static McuTargetDescription parseDescriptionJsonV2x(const QString &qulVersion,
const QJsonObject &target)
{
const QJsonObject platform = target.value("platform").toObject();
const QVariantList colorDepths = platform.value("colorDepths").toArray().toVariantList(); const QVariantList colorDepths = platform.value("colorDepths").toArray().toVariantList();
const auto colorDepthsVector = Utils::transform<QVector<int>>(colorDepths, const auto colorDepthsVector = Utils::transform<QVector<int>>(colorDepths,
[&](const QVariant &colorDepth) { [&](const QVariant &colorDepth) {
return colorDepth.toInt(); return colorDepth.toInt();
}); });
const QString platformName = platform.value("platformName").toString(); const QString platformName = platform.value("platformName").toString();
McuTargetDescription description = parseDescriptionJsonCommon(qulVersion, target);
description.platform = { return {
platform.value("id").toString(), qulVersion,
platformName, compatVersion,
platform.value("vendor").toString(), {
colorDepthsVector, platform.value("id").toString(),
platformName == "Desktop" ? McuTargetDescription::TargetType::Desktop platformName,
: McuTargetDescription::TargetType::MCU, platform.value("vendor").toString(),
colorDepthsVector,
platformName == "Desktop" ? McuTargetDescription::TargetType::Desktop : McuTargetDescription::TargetType::MCU,
},
{
toolchain.value("id").toString(),
toolchainVersionsList,
},
{
boardSdk.value("name").toString(),
boardSdk.value("defaultPath").toString(),
boardSdk.value("envVar").toString(),
boardSdkVersionsList,
},
{
freeRTOS.value("envVar").toString(),
freeRTOS.value("boardSdkSubDir").toString(),
}
}; };
return description;
}
McuTargetDescription parseDescriptionJson(const QByteArray &data)
{
const QJsonDocument document = QJsonDocument::fromJson(data);
const QJsonObject target = document.object();
const QString qulVersion = target.value("qulVersion").toString();
switch (QVersionNumber::fromString(qulVersion).majorVersion()) {
case 1:
return parseDescriptionJsonV1x(qulVersion, target);
case 2:
return parseDescriptionJsonV2x(qulVersion, target);
default:
return {qulVersion};
}
} }
// https://doc.qt.io/qtcreator/creator-developing-mcu.html#supported-qt-for-mcus-sdks // https://doc.qt.io/qtcreator/creator-developing-mcu.html#supported-qt-for-mcus-sdks
const QHash<QString, QString> oldSdkQtcRequiredVersion = { static const QString legacySupportVersionFor(const QString &sdkVersion)
{{"1.0"}, {"4.11.x"}}, {
{{"1.1"}, {"4.12.0 or 4.12.1"}}, static const QHash<QString, QString> oldSdkQtcRequiredVersion = {
{{"1.2"}, {"4.12.2 or 4.12.3"}}, {{"1.0"}, {"4.11.x"}},
}; {{"1.1"}, {"4.12.0 or 4.12.1"}},
{{"1.2"}, {"4.12.2 or 4.12.3"}}
};
if (oldSdkQtcRequiredVersion.contains(sdkVersion))
return oldSdkQtcRequiredVersion.value(sdkVersion);
if (QVersionNumber::fromString(sdkVersion).majorVersion() == 1)
return "4.12.4 up to 6.0";
return QString();
}
bool checkDeprecatedSdkError(const Utils::FilePath &qulDir, QString &message) bool checkDeprecatedSdkError(const Utils::FilePath &qulDir, QString &message)
{ {
const McuPackagePathVersionDetector versionDetector("(?<=\\bQtMCUs.)(\\d+\\.\\d+)"); const McuPackagePathVersionDetector versionDetector("(?<=\\bQtMCUs.)(\\d+\\.\\d+)");
const QString sdkDetectedVersion = versionDetector.parseVersion(qulDir.toString()); const QString sdkDetectedVersion = versionDetector.parseVersion(qulDir.toString());
const QString legacyVersion = legacySupportVersionFor(sdkDetectedVersion);
if (oldSdkQtcRequiredVersion.contains(sdkDetectedVersion)) { if (!legacyVersion.isEmpty()) {
message = McuTarget::tr("Qt for MCUs SDK version %1 detected, " message = McuTarget::tr("Qt for MCUs SDK version %1 detected, "
"only supported by Qt Creator version %2. " "only supported by Qt Creator version %2. "
"This version of Qt Creator requires Qt for MCUs %3 or greater.") "This version of Qt Creator requires Qt for MCUs %3 or greater.")
.arg(sdkDetectedVersion, .arg(sdkDetectedVersion,
oldSdkQtcRequiredVersion.value(sdkDetectedVersion), legacyVersion,
McuSupportOptions::minimalQulVersion().toString()); McuSupportOptions::minimalQulVersion().toString());
return true; return true;
} }
@@ -787,10 +753,11 @@ void targetsAndPackages(const Utils::FilePath &dir, McuSdkRepository *repo)
continue; continue;
} }
if (QVersionNumber::fromString(desc.qulVersion) < McuSupportOptions::minimalQulVersion()) { if (QVersionNumber::fromString(desc.qulVersion) < McuSupportOptions::minimalQulVersion()) {
const QString legacyVersion = legacySupportVersionFor(desc.qulVersion);
const QString qtcSupportText const QString qtcSupportText
= oldSdkQtcRequiredVersion.contains(desc.qulVersion) = !legacyVersion.isEmpty()
? McuTarget::tr("Detected version \"%1\", only supported by Qt Creator %2.") ? McuTarget::tr("Detected version \"%1\", only supported by Qt Creator %2.")
.arg(desc.qulVersion, oldSdkQtcRequiredVersion.value(desc.qulVersion)) .arg(desc.qulVersion, legacyVersion)
: McuTarget::tr("Unsupported version \"%1\".").arg(desc.qulVersion); : McuTarget::tr("Unsupported version \"%1\".").arg(desc.qulVersion);
printMessage(McuTarget::tr("Skipped %1. %2 Qt for MCUs version >= %3 required.") printMessage(McuTarget::tr("Skipped %1. %2 Qt for MCUs version >= %3 required.")
.arg(QDir::toNativeSeparators(pth.fileNameWithPathComponents(1)), .arg(QDir::toNativeSeparators(pth.fileNameWithPathComponents(1)),
@@ -818,61 +785,6 @@ void targetsAndPackages(const Utils::FilePath &dir, McuSdkRepository *repo)
} }
} }
// Workaround for missing JSON file for Desktop target.
// Desktop JSON file is shipped starting from Qul 1.5.
// This whole section could be removed when minimalQulVersion will reach 1.5 or above
{
const bool hasDesktopDescription
= contains(descriptions, [](const McuTargetDescription &desc) {
return desc.platform.type == McuTargetDescription::TargetType::Desktop;
});
if (!hasDesktopDescription) {
QVector<FilePath> desktopLibs;
if (HostOsInfo::isWindowsHost()) {
desktopLibs << dir / "lib/QulQuickUltralite_QT_32bpp_Windows_Release.lib"; // older versions of QUL (<1.5?)
desktopLibs
<< dir / "lib/QulQuickUltralitePlatform_QT_32bpp_Windows_msvc_Release.lib"; // newer versions of QUL
} else {
desktopLibs << dir / "lib/libQulQuickUltralite_QT_32bpp_Linux_Debug.a"; // older versions of QUL (<1.5?)
desktopLibs << dir / "lib/libQulQuickUltralitePlatform_QT_32bpp_Linux_gnu_Debug.a"; // newer versions of QUL
}
if (anyOf(desktopLibs, [](const FilePath &desktopLib) { return desktopLib.exists(); })) {
McuTargetDescription desktopDescription;
desktopDescription.qulVersion
= descriptions.empty() ? McuSupportOptions::minimalQulVersion().toString()
: descriptions.first().qulVersion;
desktopDescription.platform.id = "Qt";
desktopDescription.platform.name = "Desktop";
desktopDescription.platform.vendor = "Qt";
desktopDescription.platform.colorDepths = {32};
desktopDescription.toolchain.id = HostOsInfo::isWindowsHost() ? QString("msvc")
: QString("gcc");
desktopDescription.platform.type = McuTargetDescription::TargetType::Desktop;
descriptions.prepend(desktopDescription);
} else {
// show error only on 1.x SDKs, but skip on 2.x
const FilePath desktopLibV2
= HostOsInfo::isWindowsHost()
? dir / "lib/QulPlatform_qt_32bpp_Windows_msvc_Release.lib"
: dir / "lib/libQulPlatform_qt_32bpp_Linux_gnu_Release.a";
if (dir.exists() && !desktopLibV2.exists())
printMessage(
McuTarget::tr(
"Skipped creating fallback desktop kit: Could not find any of %1.")
.arg(transform(desktopLibs,
[](const auto &path) {
return QDir::toNativeSeparators(
path.fileNameWithPathComponents(1));
})
.toList()
.join(" or ")),
false);
}
}
}
repo->mcuTargets.append(targetsFromDescriptions(descriptions, &(repo->packages))); repo->mcuTargets.append(targetsFromDescriptions(descriptions, &(repo->packages)));
// Keep targets sorted lexicographically // Keep targets sorted lexicographically

View File

@@ -57,8 +57,8 @@ QVector<McuTarget *> targetsFromDescriptions(const QList<McuTargetDescription> &
Utils::FilePath kitsPath(const Utils::FilePath &dir); Utils::FilePath kitsPath(const Utils::FilePath &dir);
Utils::FilePath packagePathFromSettings(const QString &settingsKey, Utils::FilePath packagePathFromSettings(const QString &settingsKey,
QSettings::Scope scope = QSettings::UserScope, QSettings::Scope scope,
const Utils::FilePath &defaultPath = {}); const Utils::FilePath &defaultPath);
} // namespace Sdk } // namespace Sdk
} // namespace Internal } // namespace Internal
} // namespace McuSupport } // namespace McuSupport

View File

@@ -4,20 +4,7 @@ project(%{ProjectName} VERSION 0.0.1 LANGUAGES C CXX ASM ASM_MASM)
find_package(Qul) find_package(Qul)
if(Qul_VERSION VERSION_GREATER_EQUAL "1.7") qul_add_target(%{ProjectName})
qul_add_target(%{ProjectName})
else()
add_executable(%{ProjectName})
target_link_libraries(%{ProjectName}
Qul::QuickUltralite
Qul::QuickUltralitePlatform)
endif()
qul_target_qml_sources(%{ProjectName} %{MainQmlFile}) qul_target_qml_sources(%{ProjectName} %{MainQmlFile})
app_target_setup_os(%{ProjectName}) app_target_setup_os(%{ProjectName})
app_target_default_entrypoint(%{ProjectName} %{RootItemName})
if(Qul_VERSION VERSION_GREATER_EQUAL "2.0")
app_target_default_entrypoint(%{ProjectName} %{RootItemName})
else()
app_target_default_main(%{ProjectName} %{RootItemName})
endif()