McuSupport: Create freeRTOS package from JSON

Adjust test JSONs.
Write unit tests.
Adjust existing package creation to support freeRTOS package.

Example JSON:
"freeRTOS": {
    "cmakeVar": "FREERTOS_DIR",
    "defaultValue": "$QUL_BOARD_SDK_DIR/rtos/freertos/freertos_kernel",
    "envVar": "IMXRT1064_FREERTOS_DIR",
    "id": "NXP_FREERTOS_DIR",
    "label": "FreeRTOS SDK for MIMXRT1064-EVK",
    "optional": false,
    "setting": "FreeRTOSSourcePackage_IMXRT1064",
    "type": "path"
}

Change-Id: I25ca9f732cd3a54eebb23b73b7950e11976c0f68
Reviewed-by: Dawid Śliwa <dawid.sliwa@qt.io>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Piotr Mućko
2022-08-12 17:32:59 +02:00
parent b2b6577d5c
commit 6a8a6d937c
9 changed files with 312 additions and 131 deletions

View File

@@ -26,6 +26,7 @@
#include "unittest.h"
#include "armgcc_nxp_1050_json.h"
#include "armgcc_nxp_1064_json.h"
#include "armgcc_nxp_mimxrt1170_evk_freertos_json.h"
#include "armgcc_stm32f769i_freertos_json.h"
#include "armgcc_stm32h750b_metal_json.h"
@@ -107,14 +108,17 @@ const char armGccToolchainFilePathWithVariable[]{"$Qul_ROOT/lib/cmake/Qul/toolch
const char armGccVersion[]{"9.3.1"};
const char armGccNewVersion[]{"10.3.1"};
const char msvcVersion[]{"14.29"};
const QStringList boardSdkVersions{{"2.11.0"}};
const char boardSdkVersion[]{"2.11.0"};
const QString boardSdkCmakeVar{Legacy::Constants::BOARD_SDK_CMAKE_VAR};
const char boardSdkDir[]{"/opt/Qul/2.3.0/boardDir/"};
const char cmakeToolchainLabel[]{"CMake Toolchain File"};
const char fallbackDir[]{"/abc/def/fallback"};
const char freeRtosCMakeVar[]{"FREERTOS_DIR"};
const char freeRtosDescription[]{"Freertos directory"};
const char freeRtosEnvVar[]{"EVK_MIMXRT1170_FREERTOS_PATH"};
const char freeRtosLabel[]{"FreeRTOS directory"};
const char freeRtosPath[]{"/opt/freertos/default"};
const char freeRtosNxpPathSuffix[]{"rtos/freertos/freertos_kernel"};
const char freeRtosStmPathSuffix[]{"/Middlewares/Third_Party/FreeRTOS/Source"};
const char freeRtosSetting[]{"Freertos"};
const char greenhillToolchainFilePath[]{"/opt/toolchain/ghs.cmake"};
const char greenhillToolchainFileDefaultPath[]{
@@ -273,17 +277,32 @@ void verifyTargetToolchains(const Targets &targets,
}
void verifyBoardSdk(const McuPackagePtr &boardSdk,
const QString &cmakeVariable,
const QString &environmentVariable,
const QStringList &versions)
{
QVERIFY(boardSdk);
QCOMPARE(boardSdk->cmakeVariableName(), Legacy::Constants::BOARD_SDK_CMAKE_VAR);
QCOMPARE(boardSdk->cmakeVariableName(), cmakeVariable);
QCOMPARE(boardSdk->environmentVariableName(), environmentVariable);
QCOMPARE(boardSdk->settingsKey(), environmentVariable);
QCOMPARE(boardSdk->detectionPath().toString(), empty);
QCOMPARE(boardSdk->versions(), versions);
}
void verifyFreeRtosPackage(const McuPackagePtr &freeRtos,
const QString &envVar,
const FilePath &boardSdkDir,
const QString &freeRtosPath,
const QString &expectedSettingsKey)
{
QVERIFY(freeRtos);
QCOMPARE(freeRtos->environmentVariableName(), envVar);
QCOMPARE(freeRtos->cmakeVariableName(), freeRtosCMakeVar);
QCOMPARE(freeRtos->settingsKey(), expectedSettingsKey);
QCOMPARE(freeRtos->path().cleanPath().toString(), freeRtosPath);
QVERIFY(freeRtos->path().toString().startsWith(boardSdkDir.cleanPath().toString()));
}
McuSupportTest::McuSupportTest()
: targetFactory{settingsMockPtr}
, compilerDescription{armGccLabel, armGccEnvVar, Legacy::Constants::TOOLCHAIN_DIR_CMAKE_VARIABLE, armGccLabel, armGccDirectorySetting, {}, {}, {}, {}, false}
@@ -398,8 +417,7 @@ void McuSupportTest::test_parseCmakeEntries()
{
const auto description{parseDescriptionJson(iar_nxp_1064_json)};
QVERIFY(!description.freeRTOS.packages.isEmpty());
auto &freeRtos = description.freeRTOS.packages[0];
auto &freeRtos = description.freeRTOS.package;
QCOMPARE(freeRtos.envVar, nxp1064FreeRtosEnvVar);
}
@@ -607,50 +625,18 @@ void McuSupportTest::test_legacy_createPackagesWithCorrespondingSettings()
QVERIFY(settings.contains(expectedSettings));
}
void McuSupportTest::test_createFreeRtosPackageWithCorrectSetting_data()
{
QTest::addColumn<QString>("freeRtosEnvVar");
QTest::addColumn<QString>("expectedSettingsKey");
QTest::newRow("nxp1050") << nxp1050FreeRtosEnvVar
<< QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(
nxp1050);
QTest::newRow("nxp1064") << nxp1064FreeRtosEnvVar
<< QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(
nxp1064);
QTest::newRow("nxp1170") << nxp1170FreeRtosEnvVar
<< QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(
nxp1170);
QTest::newRow("stm32f7") << stm32f7FreeRtosEnvVar
<< QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(
stm32f7);
}
void McuSupportTest::test_createFreeRtosPackageWithCorrectSetting()
{
QFETCH(QString, freeRtosEnvVar);
QFETCH(QString, expectedSettingsKey);
McuPackagePtr package{
Legacy::createFreeRTOSSourcesPackage(settingsMockPtr, freeRtosEnvVar, FilePath{})};
QVERIFY(package != nullptr);
QCOMPARE(package->settingsKey(), expectedSettingsKey);
}
void McuSupportTest::test_createTargets()
{
PackageDescription packageDescription{id,
targetDescription.freeRTOS.package = {id,
nxp1064FreeRtosEnvVar,
freeRtosCMakeVar,
freeRtosSetting,
freeRtosDescription,
freeRtosLabel,
freeRtosPath,
"",
{},
VersionDetection{},
true};
targetDescription.freeRTOS.packages.append(packageDescription);
targetDescription.toolchain.id = armGcc;
const auto [targets, packages]{targetFactory.createTargets(targetDescription, qtForMcuSdkPath)};
@@ -693,7 +679,7 @@ void McuSupportTest::test_createTargets()
void McuSupportTest::test_createPackages()
{
PackageDescription packageDescription{id,
targetDescription.freeRTOS.package = {id,
nxp1064FreeRtosEnvVar,
freeRtosCMakeVar,
freeRtosLabel,
@@ -703,7 +689,6 @@ void McuSupportTest::test_createPackages()
{},
VersionDetection{},
true};
targetDescription.freeRTOS.packages.append(packageDescription);
const auto packages{targetFactory.createPackages(targetDescription)};
QVERIFY(!packages.empty());
@@ -937,32 +922,39 @@ void McuSupportTest::test_addToolchainFileInfoToKit()
void McuSupportTest::test_legacy_createBoardSdk_data()
{
QTest::addColumn<QString>("json");
QTest::addColumn<QString>("cmakeVariable");
QTest::addColumn<QString>("environmentVariable");
QTest::addColumn<QStringList>("versions");
QTest::newRow("armgcc_nxp_1050_json")
<< armgcc_nxp_1050_json << "EVKB_IMXRT1050_SDK_PATH" << boardSdkVersions;
QTest::newRow("stm32h750b") << armgcc_stm32h750b_metal_json << "STM32Cube_FW_H7_SDK_PATH"
<< QStringList{"1.5.0"};
QTest::newRow("stm32f769i") << armgcc_stm32f769i_freertos_json << "STM32Cube_FW_F7_SDK_PATH"
<< QStringList{"1.16.0"};
QTest::newRow("stm32f469i") << iar_stm32f469i_metal_json << "STM32Cube_FW_F4_SDK_PATH"
<< QStringList{"1.25.0"};
QTest::newRow("nxp1064") << iar_nxp_1064_json << "EVK_MIMXRT1064_SDK_PATH" << boardSdkVersions;
<< armgcc_nxp_1050_json << boardSdkCmakeVar << "EVKB_IMXRT1050_SDK_PATH"
<< QStringList{boardSdkVersion};
QTest::newRow("armgcc_nxp_1064_json") << armgcc_nxp_1064_json << boardSdkCmakeVar
<< "EVK_MIMXRT1064_SDK_PATH" << QStringList{"2.11.1"};
QTest::newRow("stm32h750b") << armgcc_stm32h750b_metal_json << boardSdkCmakeVar
<< "STM32Cube_FW_H7_SDK_PATH" << QStringList{"1.5.0"};
QTest::newRow("stm32f769i") << armgcc_stm32f769i_freertos_json << boardSdkCmakeVar
<< "STM32Cube_FW_F7_SDK_PATH" << QStringList{"1.16.0"};
QTest::newRow("stm32f469i") << iar_stm32f469i_metal_json << boardSdkCmakeVar
<< "STM32Cube_FW_F4_SDK_PATH" << QStringList{"1.25.0"};
QTest::newRow("nxp1064") << iar_nxp_1064_json << boardSdkCmakeVar << "EVK_MIMXRT1064_SDK_PATH"
<< QStringList{boardSdkVersion};
QTest::newRow("ghs_rh850_d1m1a_baremetal_json")
<< ghs_rh850_d1m1a_baremetal_json << "RGL_DIR" << QStringList{"2.0.0a"};
<< ghs_rh850_d1m1a_baremetal_json << boardSdkCmakeVar << "RGL_DIR" << QStringList{"2.0.0a"};
}
void McuSupportTest::test_legacy_createBoardSdk()
{
QFETCH(QString, json);
QFETCH(QString, cmakeVariable);
QFETCH(QString, environmentVariable);
QFETCH(QStringList, versions);
McuTargetDescription target{parseDescriptionJson(json.toLocal8Bit())};
McuPackagePtr boardSdk{Legacy::createBoardSdkPackage(settingsMockPtr, target)};
verifyBoardSdk(boardSdk, environmentVariable, versions);
verifyBoardSdk(boardSdk, cmakeVariable, environmentVariable, versions);
}
void McuSupportTest::test_createBoardSdk_data()
@@ -973,6 +965,7 @@ void McuSupportTest::test_createBoardSdk_data()
void McuSupportTest::test_createBoardSdk()
{
QFETCH(QString, json);
QFETCH(QString, cmakeVariable);
QFETCH(QString, environmentVariable);
QFETCH(QStringList, versions);
@@ -980,7 +973,109 @@ void McuSupportTest::test_createBoardSdk()
McuPackagePtr boardSdk{targetFactory.createPackage(target.boardSdk)};
verifyBoardSdk(boardSdk, environmentVariable, versions);
verifyBoardSdk(boardSdk, cmakeVariable, environmentVariable, versions);
}
void McuSupportTest::test_legacy_createFreeRtosPackage_data()
{
QTest::addColumn<QString>("json");
QTest::addColumn<QStringList>("versions");
QTest::addColumn<QString>("expectedSettingsKey");
QTest::addColumn<FilePath>("expectedPath");
QTest::newRow("armgcc_nxp_1050_json")
<< armgcc_nxp_1050_json << QStringList{boardSdkVersion}
<< QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1050)
<< FilePath::fromUserInput(boardSdkDir) / freeRtosNxpPathSuffix;
QTest::newRow("armgcc_nxp_1064_json")
<< armgcc_nxp_1064_json << QStringList{boardSdkVersion}
<< QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1064)
<< FilePath::fromUserInput(boardSdkDir) / freeRtosNxpPathSuffix;
QTest::newRow("iar_nxp_1064_json")
<< iar_nxp_1064_json << QStringList{boardSdkVersion}
<< QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1064)
<< FilePath::fromUserInput(boardSdkDir) / freeRtosNxpPathSuffix;
QTest::newRow("armgcc_stm32f769i_freertos_json")
<< armgcc_stm32f769i_freertos_json << QStringList{"1.16.0"}
<< QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(stm32f7)
<< FilePath::fromUserInput(boardSdkDir) / freeRtosStmPathSuffix;
}
void McuSupportTest::test_legacy_createFreeRtosPackage()
{
QFETCH(QString, json);
QFETCH(QStringList, versions);
QFETCH(QString, expectedSettingsKey);
QFETCH(FilePath, expectedPath);
McuTargetDescription targetDescription{parseDescriptionJson(json.toLocal8Bit())};
EXPECT_CALL(*settingsMockPtr, getPath(expectedSettingsKey, _, _))
.WillRepeatedly(Return(FilePath::fromString(expectedPath.toUserOutput())));
McuPackagePtr freeRtos{Legacy::createFreeRTOSSourcesPackage(settingsMockPtr,
targetDescription.freeRTOS.envVar,
FilePath{})};
verifyFreeRtosPackage(freeRtos,
targetDescription.freeRTOS.envVar,
boardSdkDir,
expectedPath.toUserOutput(),
expectedSettingsKey);
}
void McuSupportTest::test_createFreeRtosPackage_data()
{
test_legacy_createFreeRtosPackage_data();
}
void McuSupportTest::test_createFreeRtosPackage()
{
QFETCH(QString, json);
QFETCH(QStringList, versions);
QFETCH(QString, expectedSettingsKey);
QFETCH(FilePath, expectedPath);
McuTargetDescription targetDescription{parseDescriptionJson(json.toLocal8Bit())};
EXPECT_CALL(*settingsMockPtr, getPath(targetDescription.boardSdk.envVar, _, _))
.WillRepeatedly(Return(FilePath::fromString(boardSdkDir)));
auto [targets, packages] = targetFactory.createTargets(targetDescription, qtForMcuSdkPath);
auto freeRtos = findOrDefault(packages, [](const McuPackagePtr &pkg) {
return (pkg->cmakeVariableName() == freeRtosCMakeVar);
});
verifyFreeRtosPackage(freeRtos,
targetDescription.freeRTOS.envVar,
boardSdkDir,
expectedPath.toUserOutput(),
expectedSettingsKey);
}
void McuSupportTest::test_legacy_doNOTcreateFreeRtosPackageForMetalVariants_data()
{
QTest::addColumn<QString>("json");
QTest::newRow("iar_stm32f469i_metal_json") << iar_stm32f469i_metal_json;
QTest::newRow("armgcc_stm32h750b_metal_json") << armgcc_stm32h750b_metal_json;
QTest::newRow("ghs_rh850_d1m1a_baremetal_json") << ghs_rh850_d1m1a_baremetal_json;
QTest::newRow("gcc_desktop_json") << gcc_desktop_json;
}
void McuSupportTest::test_legacy_doNOTcreateFreeRtosPackageForMetalVariants()
{
QFETCH(QString, json);
McuTargetDescription targetDescription{parseDescriptionJson(json.toLocal8Bit())};
QCOMPARE(targetDescription.freeRTOS.package.cmakeVar, "");
auto [targets, packages] = targetFactory.createTargets(targetDescription, qtForMcuSdkPath);
auto freeRtos = findOrDefault(packages, [](const McuPackagePtr &pkg) {
return (pkg->cmakeVariableName() == freeRtosCMakeVar);
});
QCOMPARE(freeRtos, nullptr);
}
void McuSupportTest::test_legacy_createQtMCUsPackage()