McuSupport: Extract settings handling to a class

Change-Id: I671098f14d7bc13255dc130a4de1ab97d5bdab94
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Piotr Mućko
2022-04-22 11:41:33 +02:00
parent e675bb7860
commit 7cef593ec0
24 changed files with 529 additions and 260 deletions

View File

@@ -76,14 +76,16 @@ static FilePath findInProgramFiles(const QString &folder)
return {};
}
McuAbstractPackage *createQtForMCUsPackage()
McuPackagePtr createQtForMCUsPackage(const SettingsHandler::Ptr &settingsHandler)
{
return new McuPackage(McuPackage::tr("Qt for MCUs SDK"),
FileUtils::homePath(), // defaultPath
FilePath("bin/qmltocpp").withExecutableSuffix(), // detectionPath
Constants::SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK, // settingsKey
QStringLiteral("Qul_ROOT"), // cmakeVarName
QStringLiteral("Qul_DIR")); // envVarName
return McuPackagePtr{
new McuPackage(settingsHandler,
McuPackage::tr("Qt for MCUs SDK"),
FileUtils::homePath(), // defaultPath
FilePath("bin/qmltocpp").withExecutableSuffix(), // detectionPath
Constants::SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK, // settingsKey
QStringLiteral("Qul_ROOT"), // cmakeVarName
QStringLiteral("Qul_DIR"))}; // envVarName
}
static McuPackageVersionDetector *generatePackageVersionDetector(const QString &envVar)
@@ -106,7 +108,8 @@ static McuPackageVersionDetector *generatePackageVersionDetector(const QString &
/// Create the McuPackage by checking the "boardSdk" property in the JSON file for the board.
/// The name of the environment variable pointing to the the SDK for the board will be defined in the "envVar" property
/// inside the "boardSdk".
McuAbstractPackage *createBoardSdkPackage(const McuTargetDescription &desc)
McuPackagePtr createBoardSdkPackage(const SettingsHandler::Ptr &settingsHandler,
const McuTargetDescription &desc)
{
const auto generateSdkName = [](const QString &envVar) {
qsizetype postfixPos = envVar.indexOf("_SDK_PATH");
@@ -134,19 +137,21 @@ McuAbstractPackage *createBoardSdkPackage(const McuTargetDescription &desc)
const auto versionDetector = generatePackageVersionDetector(desc.boardSdk.envVar);
return new McuPackage(sdkName,
defaultPath,
{}, // detection path
desc.boardSdk.envVar, // settings key
"QUL_BOARD_SDK_DIR", // cmake var
desc.boardSdk.envVar, // env var
{}, // download URL
versionDetector);
return McuPackagePtr{new McuPackage(settingsHandler,
sdkName,
defaultPath,
{}, // detection path
desc.boardSdk.envVar, // settings key
"QUL_BOARD_SDK_DIR", // cmake var
desc.boardSdk.envVar, // env var
{}, // download URL
versionDetector)};
}
McuAbstractPackage *createFreeRTOSSourcesPackage(const QString &envVar,
const FilePath &boardSdkDir,
const FilePath &freeRTOSBoardSdkSubDir)
McuPackagePtr createFreeRTOSSourcesPackage(const SettingsHandler::Ptr &settingsHandler,
const QString &envVar,
const FilePath &boardSdkDir,
const FilePath &freeRTOSBoardSdkSubDir)
{
const QString envVarPrefix = removeRtosSuffix(envVar);
@@ -156,31 +161,50 @@ McuAbstractPackage *createFreeRTOSSourcesPackage(const QString &envVar,
else if (!boardSdkDir.isEmpty() && !freeRTOSBoardSdkSubDir.isEmpty())
defaultPath = boardSdkDir / freeRTOSBoardSdkSubDir.toString();
return new McuPackage(QString::fromLatin1("FreeRTOS Sources (%1)").arg(envVarPrefix),
defaultPath,
{}, // detection path
QString{Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(envVarPrefix),
"FREERTOS_DIR", // cmake var
envVar, // env var
"https://freertos.org"); // download url
return McuPackagePtr{
new McuPackage(settingsHandler,
QString::fromLatin1("FreeRTOS Sources (%1)").arg(envVarPrefix),
defaultPath,
{}, // detection path
QString{Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(envVarPrefix),
"FREERTOS_DIR", // cmake var
envVar, // env var
"https://freertos.org")}; // download url
}
McuToolChainPackage *createUnsupportedToolChainPackage()
McuPackagePtr createUnsupportedToolChainFilePackage(const SettingsHandler::Ptr &settingsHandler)
{
return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::ToolChainType::Unsupported);
return McuPackagePtr{
new McuPackage(settingsHandler, {}, {}, {}, {}, Constants::TOOLCHAIN_FILE_CMAKE_VARIABLE, {})};
}
McuToolChainPackage *createMsvcToolChainPackage()
McuToolChainPackagePtr createUnsupportedToolChainPackage(const SettingsHandler::Ptr &settingsHandler)
{
return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::ToolChainType::MSVC);
return McuToolChainPackagePtr{new McuToolChainPackage(
settingsHandler, {}, {}, {}, {}, McuToolChainPackage::ToolChainType::Unsupported)};
}
McuToolChainPackage *createGccToolChainPackage()
McuToolChainPackagePtr createMsvcToolChainPackage(const SettingsHandler::Ptr &settingsHandler)
{
return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::ToolChainType::GCC);
return McuToolChainPackagePtr{new McuToolChainPackage(settingsHandler,
{},
{},
{},
{},
McuToolChainPackage::ToolChainType::MSVC)};
}
McuToolChainPackage *createArmGccToolchainPackage()
McuToolChainPackagePtr createGccToolChainPackage(const SettingsHandler::Ptr &settingsHandler)
{
return McuToolChainPackagePtr{new McuToolChainPackage(settingsHandler,
{},
{},
{},
{},
McuToolChainPackage::ToolChainType::GCC)};
}
McuToolChainPackagePtr createArmGccToolchainPackage(const SettingsHandler::Ptr &settingsHandler)
{
const char envVar[] = "ARMGCC_DIR";
@@ -204,17 +228,19 @@ McuToolChainPackage *createArmGccToolchainPackage()
{"--version"},
"\\b(\\d+\\.\\d+\\.\\d+)\\b");
return new McuToolChainPackage(McuPackage::tr("GNU Arm Embedded Toolchain"),
defaultPath,
detectionPath,
"GNUArmEmbeddedToolchain", // settingsKey
McuToolChainPackage::ToolChainType::ArmGcc, // toolchainType
Constants::TOOLCHAIN_DIR_CMAKE_VARIABLE, // cmake var
envVar, // env var
versionDetector);
return McuToolChainPackagePtr{
new McuToolChainPackage(settingsHandler,
McuPackage::tr("GNU Arm Embedded Toolchain"),
defaultPath,
detectionPath,
"GNUArmEmbeddedToolchain", // settingsKey
McuToolChainPackage::ToolChainType::ArmGcc, // toolchainType
Constants::TOOLCHAIN_DIR_CMAKE_VARIABLE, // cmake var
envVar, // env var
versionDetector)};
}
McuToolChainPackage *createGhsToolchainPackage()
McuToolChainPackagePtr createGhsToolchainPackage(const SettingsHandler::Ptr &settingsHandler)
{
const char envVar[] = "GHS_COMPILER_DIR";
@@ -225,17 +251,19 @@ McuToolChainPackage *createGhsToolchainPackage()
{"-V"},
"\\bv(\\d+\\.\\d+\\.\\d+)\\b");
return new McuToolChainPackage("Green Hills Compiler",
defaultPath,
FilePath("ccv850").withExecutableSuffix(), // detectionPath
"GHSToolchain", // settingsKey
McuToolChainPackage::ToolChainType::GHS, // toolchainType
Constants::TOOLCHAIN_DIR_CMAKE_VARIABLE, // cmake var
envVar, // env var
versionDetector);
return McuToolChainPackagePtr{
new McuToolChainPackage(settingsHandler,
"Green Hills Compiler",
defaultPath,
FilePath("ccv850").withExecutableSuffix(), // detectionPath
"GHSToolchain", // settingsKey
McuToolChainPackage::ToolChainType::GHS, // toolchainType
Constants::TOOLCHAIN_DIR_CMAKE_VARIABLE, // cmake var
envVar, // env var
versionDetector)};
}
McuToolChainPackage *createGhsArmToolchainPackage()
McuToolChainPackagePtr createGhsArmToolchainPackage(const SettingsHandler::Ptr &settingsHandler)
{
const char envVar[] = "GHS_ARM_COMPILER_DIR";
@@ -246,17 +274,19 @@ McuToolChainPackage *createGhsArmToolchainPackage()
{"-V"},
"\\bv(\\d+\\.\\d+\\.\\d+)\\b");
return new McuToolChainPackage("Green Hills Compiler for ARM",
defaultPath,
FilePath("cxarm").withExecutableSuffix(), // detectionPath
"GHSArmToolchain", // settingsKey
McuToolChainPackage::ToolChainType::GHSArm, // toolchainType
Constants::TOOLCHAIN_DIR_CMAKE_VARIABLE, // cmake var
envVar, // env var
versionDetector);
return McuToolChainPackagePtr{
new McuToolChainPackage(settingsHandler,
"Green Hills Compiler for ARM",
defaultPath,
FilePath("cxarm").withExecutableSuffix(), // detectionPath
"GHSArmToolchain", // settingsKey
McuToolChainPackage::ToolChainType::GHSArm, // toolchainType
Constants::TOOLCHAIN_DIR_CMAKE_VARIABLE, // cmake var
envVar, // env var
versionDetector)};
}
McuToolChainPackage *createIarToolChainPackage()
McuToolChainPackagePtr createIarToolChainPackage(const SettingsHandler::Ptr &settingsHandler)
{
const char envVar[] = "IAR_ARM_COMPILER_DIR";
@@ -280,17 +310,19 @@ McuToolChainPackage *createIarToolChainPackage()
{"--version"},
"\\bV(\\d+\\.\\d+\\.\\d+)\\.\\d+\\b");
return new McuToolChainPackage("IAR ARM Compiler",
defaultPath,
detectionPath,
"IARToolchain", // settings key
McuToolChainPackage::ToolChainType::IAR, // toolchainType
Constants::TOOLCHAIN_DIR_CMAKE_VARIABLE, // cmake var
envVar, // env var
versionDetector);
return McuToolChainPackagePtr{
new McuToolChainPackage(settingsHandler,
"IAR ARM Compiler",
defaultPath,
detectionPath,
"IARToolchain", // settings key
McuToolChainPackage::ToolChainType::IAR, // toolchainType
Constants::TOOLCHAIN_DIR_CMAKE_VARIABLE, // cmake var
envVar, // env var
versionDetector)};
}
static McuPackage *createStm32CubeProgrammerPackage()
static McuPackagePtr createStm32CubeProgrammerPackage(const SettingsHandler::Ptr &settingsHandler)
{
FilePath defaultPath;
const QString cubePath = "STMicroelectronics/STM32Cube/STM32CubeProgrammer";
@@ -308,22 +340,22 @@ static McuPackage *createStm32CubeProgrammerPackage()
QLatin1String(Utils::HostOsInfo::isWindowsHost() ? "/bin/STM32_Programmer_CLI.exe"
: "/bin/STM32_Programmer.sh"));
auto result
= new McuPackage(McuPackage::tr("STM32CubeProgrammer"),
defaultPath,
detectionPath,
"Stm32CubeProgrammer",
{}, // cmake var
{}, // env var
"https://www.st.com/en/development-tools/stm32cubeprog.html", // download url
nullptr, // version detector
true, // add to path
"/bin" // relative path modifier
);
return result;
return McuPackagePtr{
new McuPackage(settingsHandler,
McuPackage::tr("STM32CubeProgrammer"),
defaultPath,
detectionPath,
"Stm32CubeProgrammer",
{}, // cmake var
{}, // env var
"https://www.st.com/en/development-tools/stm32cubeprog.html", // download url
nullptr, // version detector
true, // add to path
"/bin" // relative path modifier
)};
}
static McuPackage *createMcuXpressoIdePackage()
static McuPackagePtr createMcuXpressoIdePackage(const SettingsHandler::Ptr &settingsHandler)
{
const char envVar[] = "MCUXpressoIDE_PATH";
@@ -346,17 +378,18 @@ static McuPackage *createMcuXpressoIdePackage()
defaultPath = programPath;
}
return new McuPackage("MCUXpresso IDE",
defaultPath,
FilePath("ide/binaries/crt_emu_cm_redlink")
.withExecutableSuffix(), // detection path
"MCUXpressoIDE", // settings key
"MCUXPRESSO_IDE_PATH", // cmake var
envVar,
"https://www.nxp.com/mcuxpresso/ide"); // download url
return McuPackagePtr{new McuPackage(settingsHandler,
"MCUXpresso IDE",
defaultPath,
FilePath("ide/binaries/crt_emu_cm_redlink")
.withExecutableSuffix(), // detection path
"MCUXpressoIDE", // settings key
"MCUXPRESSO_IDE_PATH", // cmake var
envVar,
"https://www.nxp.com/mcuxpresso/ide")}; // download url
}
static McuPackage *createCypressProgrammerPackage()
static McuPackagePtr createCypressProgrammerPackage(const SettingsHandler::Ptr &settingsHandler)
{
const char envVar[] = "CYPRESS_AUTO_FLASH_UTILITY_DIR";
@@ -374,16 +407,16 @@ static McuPackage *createCypressProgrammerPackage()
}
}
auto result = new McuPackage("Cypress Auto Flash Utility",
defaultPath,
FilePath("/bin/openocd").withExecutableSuffix(),
"CypressAutoFlashUtil", // settings key
"INFINEON_AUTO_FLASH_UTILITY_DIR", // cmake var
envVar); // env var
return result;
return McuPackagePtr{new McuPackage(settingsHandler,
"Cypress Auto Flash Utility",
defaultPath,
FilePath("/bin/openocd").withExecutableSuffix(),
"CypressAutoFlashUtil", // settings key
"INFINEON_AUTO_FLASH_UTILITY_DIR", // cmake var
envVar)}; // env var
}
static McuPackage *createRenesasProgrammerPackage()
static McuPackagePtr createRenesasProgrammerPackage(const SettingsHandler::Ptr &settingsHandler)
{
const char envVar[] = "RenesasFlashProgrammer_PATH";
@@ -401,51 +434,56 @@ static McuPackage *createRenesasProgrammerPackage()
}
}
auto result = new McuPackage("Renesas Flash Programmer",
defaultPath,
FilePath("rfp-cli").withExecutableSuffix(),
"RenesasFlashProgrammer", // settings key
"RENESAS_FLASH_PROGRAMMER_PATH", // cmake var
envVar); // env var
return result;
return McuPackagePtr{new McuPackage(settingsHandler,
"Renesas Flash Programmer",
defaultPath,
FilePath("rfp-cli").withExecutableSuffix(),
"RenesasFlashProgrammer", // settings key
"RENESAS_FLASH_PROGRAMMER_PATH", // cmake var
envVar)}; // env var
}
static McuAbstractTargetFactory::Ptr createFactory(bool isLegacy)
static McuAbstractTargetFactory::Ptr createFactory(bool isLegacy,
const SettingsHandler::Ptr &settingsHandler)
{
McuAbstractTargetFactory::Ptr result;
if (isLegacy) {
static const QHash<QString, McuToolChainPackagePtr> tcPkgs = {
{{"armgcc"}, McuToolChainPackagePtr{createArmGccToolchainPackage()}},
{{"greenhills"}, McuToolChainPackagePtr{createGhsToolchainPackage()}},
{{"iar"}, McuToolChainPackagePtr{createIarToolChainPackage()}},
{{"msvc"}, McuToolChainPackagePtr{createMsvcToolChainPackage()}},
{{"gcc"}, McuToolChainPackagePtr{createGccToolChainPackage()}},
{{"arm-greenhills"}, McuToolChainPackagePtr{createGhsArmToolchainPackage()}},
static const QHash<QString, McuToolChainPackagePtr> toolchainCompilers = {
{{"armgcc"}, McuToolChainPackagePtr{createArmGccToolchainPackage(settingsHandler)}},
{{"greenhills"}, McuToolChainPackagePtr{createGhsToolchainPackage(settingsHandler)}},
{{"iar"}, McuToolChainPackagePtr{createIarToolChainPackage(settingsHandler)}},
{{"msvc"}, McuToolChainPackagePtr{createMsvcToolChainPackage(settingsHandler)}},
{{"gcc"}, McuToolChainPackagePtr{createGccToolChainPackage(settingsHandler)}},
{{"arm-greenhills"},
McuToolChainPackagePtr{createGhsArmToolchainPackage(settingsHandler)}},
};
// Note: the vendor name (the key of the hash) is case-sensitive. It has to match the "platformVendor" key in the
// json file.
static const QHash<QString, McuPackagePtr> vendorPkgs = {
{{"ST"}, McuPackagePtr{createStm32CubeProgrammerPackage()}},
{{"NXP"}, McuPackagePtr{createMcuXpressoIdePackage()}},
{{"CYPRESS"}, McuPackagePtr{createCypressProgrammerPackage()}},
{{"RENESAS"}, McuPackagePtr{createRenesasProgrammerPackage()}},
{{"ST"}, McuPackagePtr{createStm32CubeProgrammerPackage(settingsHandler)}},
{{"NXP"}, McuPackagePtr{createMcuXpressoIdePackage(settingsHandler)}},
{{"CYPRESS"}, McuPackagePtr{createCypressProgrammerPackage(settingsHandler)}},
{{"RENESAS"}, McuPackagePtr{createRenesasProgrammerPackage(settingsHandler)}},
};
result = std::make_unique<McuTargetFactoryLegacy>(tcPkgs, vendorPkgs);
result = std::make_unique<McuTargetFactoryLegacy>(toolchainCompilers,
vendorPkgs,
settingsHandler);
} else {
result = std::make_unique<McuTargetFactory>();
result = std::make_unique<McuTargetFactory>(settingsHandler);
}
return result;
}
McuSdkRepository targetsFromDescriptions(const QList<McuTargetDescription> &descriptions,
const SettingsHandler::Ptr &settingsHandler,
bool isLegacy)
{
Targets mcuTargets;
Packages mcuPackages;
McuAbstractTargetFactory::Ptr targetFactory = createFactory(isLegacy);
McuAbstractTargetFactory::Ptr targetFactory = createFactory(isLegacy, settingsHandler);
for (const McuTargetDescription &desc : descriptions) {
auto [targets, packages] = targetFactory->createTargets(desc);
mcuTargets.append(targets);
@@ -587,12 +625,13 @@ bool checkDeprecatedSdkError(const Utils::FilePath &qulDir, QString &message)
return false;
}
McuSdkRepository targetsAndPackages(const Utils::FilePath &dir)
McuSdkRepository targetsAndPackages(const Utils::FilePath &qtForMCUSdkPath,
const SettingsHandler::Ptr &settingsHandler)
{
QList<McuTargetDescription> descriptions;
bool isLegacy{false};
auto descriptionFiles = targetDescriptionFiles(dir);
auto descriptionFiles = targetDescriptionFiles(qtForMCUSdkPath);
for (const QFileInfo &fileInfo : descriptionFiles) {
QFile file(fileInfo.absoluteFilePath());
if (!file.open(QFile::ReadOnly))
@@ -631,20 +670,20 @@ McuSdkRepository targetsAndPackages(const Utils::FilePath &dir)
// No valid description means invalid or old SDK installation.
if (descriptions.empty()) {
if (kitsPath(dir).exists()) {
if (kitsPath(qtForMCUSdkPath).exists()) {
printMessage(McuTarget::tr("No valid kit descriptions found at %1.")
.arg(kitsPath(dir).toUserOutput()),
.arg(kitsPath(qtForMCUSdkPath).toUserOutput()),
true);
return McuSdkRepository{};
} else {
QString deprecationMessage;
if (checkDeprecatedSdkError(dir, deprecationMessage)) {
if (checkDeprecatedSdkError(qtForMCUSdkPath, deprecationMessage)) {
printMessage(deprecationMessage, true);
return McuSdkRepository{};
}
}
}
McuSdkRepository repo = targetsFromDescriptions(descriptions, isLegacy);
McuSdkRepository repo = targetsFromDescriptions(descriptions, settingsHandler, isLegacy);
// Keep targets sorted lexicographically
Utils::sort(repo.mcuTargets, [](const McuTargetPtr &lhs, const McuTargetPtr &rhs) {
@@ -654,17 +693,6 @@ McuSdkRepository targetsAndPackages(const Utils::FilePath &dir)
return repo;
}
FilePath packagePathFromSettings(const QString &settingsKey,
QSettings::Scope scope,
const FilePath &defaultPath)
{
QSettings *settings = Core::ICore::settings(scope);
const QString key = QLatin1String(Constants::SETTINGS_GROUP) + '/'
+ QLatin1String(Constants::SETTINGS_KEY_PACKAGE_PREFIX) + settingsKey;
const QString path = settings->value(key, defaultPath.toString()).toString();
return FilePath::fromUserInput(path);
}
} // namespace Sdk
} // namespace Internal
} // namespace McuSupport