McuSupport: Check FreeRTOS path for required files

It is easy to pick the wrong directory for FreeRTOS sources when
configuring an MCU device. This commit adds a check that the
supplied path contains tasks.c, which probably means the given
directory is correct.

Task-number: QTCREATORBUG-27180
Change-Id: Iff1242e8970e59bf334d50829dd1d5bdd8164d47
Reviewed-by: Yasser Grimes <yasser.grimes@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Piotr Mućko <piotr.mucko@qt.io>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Sivert Krøvel
2022-08-30 16:28:49 +02:00
parent 0cd61061d0
commit 0a17b29cfb
6 changed files with 23 additions and 7 deletions

View File

@@ -144,7 +144,7 @@ McuPackagePtr createFreeRTOSSourcesPackage(const SettingsHandler::Ptr &settingsH
new McuPackage(settingsHandler, new McuPackage(settingsHandler,
QString::fromLatin1("FreeRTOS Sources (%1)").arg(envVarPrefix), QString::fromLatin1("FreeRTOS Sources (%1)").arg(envVarPrefix),
defaultPath, defaultPath,
{}, // detection path "tasks.c", // detection path
QString{Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(envVarPrefix), QString{Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(envVarPrefix),
"FREERTOS_DIR", // cmake var "FREERTOS_DIR", // cmake var
envVar, // env var envVar, // env var

View File

@@ -80,6 +80,7 @@ constexpr auto armgcc_nxp_1050_json = R"({
"freeRTOS": { "freeRTOS": {
"cmakeVar": "FREERTOS_DIR", "cmakeVar": "FREERTOS_DIR",
"defaultValue": "%{QUL_BOARD_SDK_DIR}/rtos/freertos/freertos_kernel", "defaultValue": "%{QUL_BOARD_SDK_DIR}/rtos/freertos/freertos_kernel",
"validation": "tasks.c",
"envVar": "IMXRT1050_FREERTOS_DIR", "envVar": "IMXRT1050_FREERTOS_DIR",
"label": "FreeRTOS SDK for MIMXRT1050-EVK", "label": "FreeRTOS SDK for MIMXRT1050-EVK",
"optional": false, "optional": false,

View File

@@ -18,6 +18,7 @@ constexpr auto armgcc_nxp_1064_json = R"(
"freeRTOS": { "freeRTOS": {
"cmakeVar": "FREERTOS_DIR", "cmakeVar": "FREERTOS_DIR",
"defaultValue": "%{QUL_BOARD_SDK_DIR}/rtos/freertos/freertos_kernel", "defaultValue": "%{QUL_BOARD_SDK_DIR}/rtos/freertos/freertos_kernel",
"validation": "tasks.c",
"envVar": "IMXRT1064_FREERTOS_DIR", "envVar": "IMXRT1064_FREERTOS_DIR",
"label": "FreeRTOS SDK for MIMXRT1064-EVK", "label": "FreeRTOS SDK for MIMXRT1064-EVK",
"optional": false, "optional": false,

View File

@@ -86,6 +86,7 @@ constexpr auto armgcc_stm32f769i_freertos_json = R"({
"label": "FreeRTOS SDK for STM32F769I-Discovery", "label": "FreeRTOS SDK for STM32F769I-Discovery",
"cmakeVar": "FREERTOS_DIR", "cmakeVar": "FREERTOS_DIR",
"defaultValue": "%{QUL_BOARD_SDK_DIR}/Middlewares/Third_Party/FreeRTOS/Source", "defaultValue": "%{QUL_BOARD_SDK_DIR}/Middlewares/Third_Party/FreeRTOS/Source",
"validation": "tasks.c",
"type": "path", "type": "path",
"setting": "FreeRTOSSourcePackage_STM32F7", "setting": "FreeRTOSSourcePackage_STM32F7",
"optional": false "optional": false

View File

@@ -25,6 +25,7 @@ constexpr auto iar_nxp_1064_json = R"({
"freeRTOS": { "freeRTOS": {
"cmakeVar": "FREERTOS_DIR", "cmakeVar": "FREERTOS_DIR",
"defaultValue": "%{QUL_BOARD_SDK_DIR}/rtos/freertos/freertos_kernel", "defaultValue": "%{QUL_BOARD_SDK_DIR}/rtos/freertos/freertos_kernel",
"validation": "tasks.c",
"envVar": "IMXRT1064_FREERTOS_DIR", "envVar": "IMXRT1064_FREERTOS_DIR",
"id": "NXP_FREERTOS_DIR", "id": "NXP_FREERTOS_DIR",
"label": "FreeRTOS SDK for MIMXRT1064-EVK", "label": "FreeRTOS SDK for MIMXRT1064-EVK",

View File

@@ -97,6 +97,7 @@ const char freeRtosCMakeVar[]{"FREERTOS_DIR"};
const char freeRtosEnvVar[]{"EVK_MIMXRT1170_FREERTOS_PATH"}; const char freeRtosEnvVar[]{"EVK_MIMXRT1170_FREERTOS_PATH"};
const char freeRtosLabel[]{"FreeRTOS directory"}; const char freeRtosLabel[]{"FreeRTOS directory"};
const char freeRtosPath[]{"/opt/freertos/default"}; const char freeRtosPath[]{"/opt/freertos/default"};
const char freeRtosDetectionPath[]{"tasks.c"};
const char freeRtosNxpPathSuffix[]{"rtos/freertos/freertos_kernel"}; const char freeRtosNxpPathSuffix[]{"rtos/freertos/freertos_kernel"};
const char freeRtosStmPathSuffix[]{"/Middlewares/Third_Party/FreeRTOS/Source"}; const char freeRtosStmPathSuffix[]{"/Middlewares/Third_Party/FreeRTOS/Source"};
const char freeRtosSetting[]{"Freertos"}; const char freeRtosSetting[]{"Freertos"};
@@ -273,6 +274,7 @@ void verifyFreeRtosPackage(const McuPackagePtr &freeRtos,
const QString &envVar, const QString &envVar,
const FilePath &boardSdkDir, const FilePath &boardSdkDir,
const QString &freeRtosPath, const QString &freeRtosPath,
const QString &freeRtosDetectionPath,
const QString &expectedSettingsKey) const QString &expectedSettingsKey)
{ {
QVERIFY(freeRtos); QVERIFY(freeRtos);
@@ -280,6 +282,7 @@ void verifyFreeRtosPackage(const McuPackagePtr &freeRtos,
QCOMPARE(freeRtos->cmakeVariableName(), freeRtosCMakeVar); QCOMPARE(freeRtos->cmakeVariableName(), freeRtosCMakeVar);
QCOMPARE(freeRtos->settingsKey(), expectedSettingsKey); QCOMPARE(freeRtos->settingsKey(), expectedSettingsKey);
QCOMPARE(freeRtos->path().cleanPath().toString(), freeRtosPath); QCOMPARE(freeRtos->path().cleanPath().toString(), freeRtosPath);
QCOMPARE(freeRtos->detectionPath().cleanPath().toString(), freeRtosDetectionPath);
QVERIFY(freeRtos->path().toString().startsWith(boardSdkDir.cleanPath().toString())); QVERIFY(freeRtos->path().toString().startsWith(boardSdkDir.cleanPath().toString()));
} }
@@ -613,7 +616,7 @@ void McuSupportTest::test_createTargets()
freeRtosSetting, freeRtosSetting,
freeRtosLabel, freeRtosLabel,
freeRtosPath, freeRtosPath,
"", freeRtosDetectionPath,
{}, {},
VersionDetection{}, VersionDetection{},
true}; true};
@@ -665,7 +668,7 @@ void McuSupportTest::test_createPackages()
freeRtosLabel, freeRtosLabel,
freeRtosSetting, freeRtosSetting,
freeRtosPath, freeRtosPath,
"", freeRtosDetectionPath,
{}, {},
VersionDetection{}, VersionDetection{},
true}; true};
@@ -962,23 +965,28 @@ void McuSupportTest::test_legacy_createFreeRtosPackage_data()
QTest::addColumn<QStringList>("versions"); QTest::addColumn<QStringList>("versions");
QTest::addColumn<QString>("expectedSettingsKey"); QTest::addColumn<QString>("expectedSettingsKey");
QTest::addColumn<FilePath>("expectedPath"); QTest::addColumn<FilePath>("expectedPath");
QTest::addColumn<FilePath>("expectedDetectionPath");
QTest::newRow("armgcc_nxp_1050_json") QTest::newRow("armgcc_nxp_1050_json")
<< armgcc_nxp_1050_json << QStringList{boardSdkVersion} << armgcc_nxp_1050_json << QStringList{boardSdkVersion}
<< QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1050) << QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1050)
<< FilePath::fromUserInput(boardSdkDir) / freeRtosNxpPathSuffix; << FilePath::fromUserInput(boardSdkDir) / freeRtosNxpPathSuffix
<< FilePath::fromUserInput(freeRtosDetectionPath);
QTest::newRow("armgcc_nxp_1064_json") QTest::newRow("armgcc_nxp_1064_json")
<< armgcc_nxp_1064_json << QStringList{boardSdkVersion} << armgcc_nxp_1064_json << QStringList{boardSdkVersion}
<< QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1064) << QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1064)
<< FilePath::fromUserInput(boardSdkDir) / freeRtosNxpPathSuffix; << FilePath::fromUserInput(boardSdkDir) / freeRtosNxpPathSuffix
<< FilePath::fromUserInput(freeRtosDetectionPath);
QTest::newRow("iar_nxp_1064_json") QTest::newRow("iar_nxp_1064_json")
<< iar_nxp_1064_json << QStringList{boardSdkVersion} << iar_nxp_1064_json << QStringList{boardSdkVersion}
<< QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1064) << QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1064)
<< FilePath::fromUserInput(boardSdkDir) / freeRtosNxpPathSuffix; << FilePath::fromUserInput(boardSdkDir) / freeRtosNxpPathSuffix
<< FilePath::fromUserInput(freeRtosDetectionPath);
QTest::newRow("armgcc_stm32f769i_freertos_json") QTest::newRow("armgcc_stm32f769i_freertos_json")
<< armgcc_stm32f769i_freertos_json << QStringList{"1.16.0"} << armgcc_stm32f769i_freertos_json << QStringList{"1.16.0"}
<< QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(stm32f7) << QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(stm32f7)
<< FilePath::fromUserInput(boardSdkDir) / freeRtosStmPathSuffix; << FilePath::fromUserInput(boardSdkDir) / freeRtosStmPathSuffix
<< FilePath::fromUserInput(freeRtosDetectionPath);
} }
void McuSupportTest::test_legacy_createFreeRtosPackage() void McuSupportTest::test_legacy_createFreeRtosPackage()
@@ -987,6 +995,7 @@ void McuSupportTest::test_legacy_createFreeRtosPackage()
QFETCH(QStringList, versions); QFETCH(QStringList, versions);
QFETCH(QString, expectedSettingsKey); QFETCH(QString, expectedSettingsKey);
QFETCH(FilePath, expectedPath); QFETCH(FilePath, expectedPath);
QFETCH(FilePath, expectedDetectionPath);
McuTargetDescription targetDescription{parseDescriptionJson(json.toLocal8Bit())}; McuTargetDescription targetDescription{parseDescriptionJson(json.toLocal8Bit())};
@@ -1000,6 +1009,7 @@ void McuSupportTest::test_legacy_createFreeRtosPackage()
targetDescription.freeRTOS.envVar, targetDescription.freeRTOS.envVar,
boardSdkDir, boardSdkDir,
expectedPath.toUserOutput(), expectedPath.toUserOutput(),
expectedDetectionPath.toUserOutput(),
expectedSettingsKey); expectedSettingsKey);
} }
@@ -1014,6 +1024,7 @@ void McuSupportTest::test_createFreeRtosPackage()
QFETCH(QStringList, versions); QFETCH(QStringList, versions);
QFETCH(QString, expectedSettingsKey); QFETCH(QString, expectedSettingsKey);
QFETCH(FilePath, expectedPath); QFETCH(FilePath, expectedPath);
QFETCH(FilePath, expectedDetectionPath);
McuTargetDescription targetDescription{parseDescriptionJson(json.toLocal8Bit())}; McuTargetDescription targetDescription{parseDescriptionJson(json.toLocal8Bit())};
@@ -1030,6 +1041,7 @@ void McuSupportTest::test_createFreeRtosPackage()
targetDescription.freeRTOS.envVar, targetDescription.freeRTOS.envVar,
boardSdkDir, boardSdkDir,
expectedPath.toUserOutput(), expectedPath.toUserOutput(),
expectedDetectionPath.toUserOutput(),
expectedSettingsKey); expectedSettingsKey);
} }