Make McuToolChainPackage::Type an enum class

And make more use of switch statements without a default case, so each
type is handled explicitly. (Ok, there is a default, but that is
Q_UNREACHABLE).

Change-Id: I30ccc447e55a5aeebebe1a9879ea3136545f5e68
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
Reviewed-by: <piotr.mucko@qt.io>
This commit is contained in:
Erik Verbruggen
2022-02-01 16:29:11 +01:00
committed by piotr.mucko
parent 32f8ed7b66
commit 34345f8b7e
4 changed files with 111 additions and 76 deletions

View File

@@ -302,7 +302,7 @@ McuToolChainPackage::Type McuToolChainPackage::type() const
bool McuToolChainPackage::isDesktopToolchain() const
{
return m_type == TypeMSVC || m_type == TypeGCC;
return m_type == Type::MSVC || m_type == Type::GCC;
}
} // namespace Internal

View File

@@ -122,15 +122,15 @@ private:
class McuToolChainPackage : public McuPackage
{
public:
enum Type {
TypeArmGcc,
TypeIAR,
TypeKEIL,
TypeGHS,
TypeMSVC,
TypeGCC,
TypeGHSArm,
TypeUnsupported
enum class Type {
IAR,
KEIL,
MSVC,
GCC,
ArmGcc,
GHS,
GHSArm,
Unsupported
};
McuToolChainPackage(const QString &label,

View File

@@ -178,35 +178,42 @@ static ToolChain *iarToolChain(const FilePath &path, Id language)
ToolChain *McuToolChainPackage::toolChain(Id language) const
{
ToolChain *tc = nullptr;
if (m_type == TypeMSVC)
tc = msvcToolChain(language);
else if (m_type == TypeGCC)
tc = gccToolChain(language);
else if (m_type == TypeIAR) {
switch (m_type) {
case Type::MSVC:
return msvcToolChain(language);
case Type::GCC:
return gccToolChain(language);
case Type::IAR: {
const FilePath compiler = path().pathAppended("/bin/iccarm").withExecutableSuffix();
tc = iarToolChain(compiler, language);
return iarToolChain(compiler, language);
}
else {
case Type::ArmGcc:
case Type::KEIL:
case Type::GHS:
case Type::GHSArm:
case Type::Unsupported: {
const QLatin1String compilerName(
language == ProjectExplorer::Constants::C_LANGUAGE_ID ? "gcc" : "g++");
const QString comp = QLatin1String(m_type == TypeArmGcc ? "/bin/arm-none-eabi-%1" : "/bar/foo-keil-%1")
.arg(compilerName);
language == ProjectExplorer::Constants::C_LANGUAGE_ID ? "gcc" : "g++");
const QString comp = QLatin1String(m_type == Type::ArmGcc ? "/bin/arm-none-eabi-%1"
: "/bar/foo-keil-%1")
.arg(compilerName);
const FilePath compiler = path().pathAppended(comp).withExecutableSuffix();
tc = armGccToolChain(compiler, language);
return armGccToolChain(compiler, language);
}
default:
Q_UNREACHABLE();
}
return tc;
}
QString McuToolChainPackage::toolChainName() const
{
switch (m_type) {
case TypeArmGcc: return QLatin1String("armgcc");
case TypeIAR: return QLatin1String("iar");
case TypeKEIL: return QLatin1String("keil");
case TypeGHS: return QLatin1String("ghs");
case TypeGHSArm: return QLatin1String("ghs-arm");
case Type::ArmGcc: return QLatin1String("armgcc");
case Type::IAR: return QLatin1String("iar");
case Type::KEIL: return QLatin1String("keil");
case Type::GHS: return QLatin1String("ghs");
case Type::GHSArm: return QLatin1String("ghs-arm");
default: return QLatin1String("unsupported");
}
}
@@ -224,37 +231,38 @@ QVariant McuToolChainPackage::debuggerId() const
DebuggerEngineType engineType;
switch (m_type) {
case TypeArmGcc: {
case Type::ArmGcc: {
sub = QString::fromLatin1("bin/arm-none-eabi-gdb-py");
displayName = McuPackage::tr("Arm GDB at %1");
engineType = Debugger::GdbEngineType;
break; }
case TypeIAR: {
break;
}
case Type::IAR: {
sub = QString::fromLatin1("../common/bin/CSpyBat");
displayName = QLatin1String("CSpy");
engineType = Debugger::NoEngineType; // support for IAR missing
break; }
case TypeKEIL: {
break;
}
case Type::KEIL: {
sub = QString::fromLatin1("UV4/UV4");
displayName = QLatin1String("KEIL uVision Debugger");
engineType = Debugger::UvscEngineType;
break; }
default: return QVariant();
break;
}
default:
return QVariant();
}
const FilePath command = path().pathAppended(sub).withExecutableSuffix();
const DebuggerItem *debugger = DebuggerItemManager::findByCommand(command);
QVariant debuggerId;
if (!debugger) {
DebuggerItem newDebugger;
newDebugger.setCommand(command);
newDebugger.setUnexpandedDisplayName(displayName.arg(command.toUserOutput()));
newDebugger.setEngineType(engineType);
debuggerId = DebuggerItemManager::registerDebugger(newDebugger);
} else {
debuggerId = debugger->id();
if (const DebuggerItem *debugger = DebuggerItemManager::findByCommand(command)) {
return debugger->id();
}
return debuggerId;
DebuggerItem newDebugger;
newDebugger.setCommand(command);
newDebugger.setUnexpandedDisplayName(displayName.arg(command.toUserOutput()));
newDebugger.setEngineType(engineType);
return DebuggerItemManager::registerDebugger(newDebugger);
}
McuTarget::McuTarget(const QVersionNumber &qulVersion,
@@ -458,33 +466,60 @@ static void setKitProperties(const QString &kitName, Kit *k, const McuTarget *mc
static void setKitToolchains(Kit *k, const McuToolChainPackage *tcPackage)
{
// No Green Hills toolchain, because support for it is missing.
if (tcPackage->type() == McuToolChainPackage::TypeUnsupported
|| tcPackage->type() == McuToolChainPackage::TypeGHS
|| tcPackage->type() == McuToolChainPackage::TypeGHSArm)
switch (tcPackage->type()) {
case McuToolChainPackage::Type::Unsupported:
return;
ToolChainKitAspect::setToolChain(k, tcPackage->toolChain(
ProjectExplorer::Constants::C_LANGUAGE_ID));
ToolChainKitAspect::setToolChain(k, tcPackage->toolChain(
ProjectExplorer::Constants::CXX_LANGUAGE_ID));
case McuToolChainPackage::Type::GHS:
case McuToolChainPackage::Type::GHSArm:
return; // No Green Hills toolchain, because support for it is missing.
case McuToolChainPackage::Type::IAR:
case McuToolChainPackage::Type::KEIL:
case McuToolChainPackage::Type::MSVC:
case McuToolChainPackage::Type::GCC:
case McuToolChainPackage::Type::ArmGcc:
ToolChainKitAspect::setToolChain(k,
tcPackage->toolChain(
ProjectExplorer::Constants::C_LANGUAGE_ID));
ToolChainKitAspect::setToolChain(k,
tcPackage->toolChain(
ProjectExplorer::Constants::CXX_LANGUAGE_ID));
return;
default:
Q_UNREACHABLE();
}
}
static void setKitDebugger(Kit *k, const McuToolChainPackage *tcPackage)
{
// Qt Creator seems to be smart enough to deduce the right Kit debugger from the ToolChain
// We rely on that at least in the Desktop case.
if (tcPackage->isDesktopToolchain()
// No Green Hills and IAR debugger, because support for it is missing.
|| tcPackage->type() == McuToolChainPackage::TypeUnsupported
|| tcPackage->type() == McuToolChainPackage::TypeGHS
|| tcPackage->type() == McuToolChainPackage::TypeGHSArm
|| tcPackage->type() == McuToolChainPackage::TypeIAR)
if (tcPackage->isDesktopToolchain()) {
// Qt Creator seems to be smart enough to deduce the right Kit debugger from the ToolChain
return;
}
const QVariant debuggerId = tcPackage->debuggerId();
if (debuggerId.isValid())
Debugger::DebuggerKitAspect::setDebugger(k, debuggerId);
switch (tcPackage->type()) {
case McuToolChainPackage::Type::Unsupported:
case McuToolChainPackage::Type::GHS:
case McuToolChainPackage::Type::GHSArm:
case McuToolChainPackage::Type::IAR:
return; // No Green Hills and IAR debugger, because support for it is missing.
case McuToolChainPackage::Type::KEIL:
case McuToolChainPackage::Type::MSVC:
case McuToolChainPackage::Type::GCC:
case McuToolChainPackage::Type::ArmGcc: {
const QVariant debuggerId = tcPackage->debuggerId();
if (debuggerId.isValid()) {
Debugger::DebuggerKitAspect::setDebugger(k, debuggerId);
}
return;
}
default:
Q_UNREACHABLE();
}
}
static void setKitDevice(Kit *k, const McuTarget* mcuTarget)
@@ -596,8 +631,8 @@ static void setKitCMakeOptions(Kit *k, const McuTarget* mcuTarget, const FilePat
CMakeConfig config = CMakeConfigurationKitAspect::configuration(k);
// CMake ToolChain file for ghs handles CMAKE_*_COMPILER autonomously
if (mcuTarget->toolChainPackage()->type() != McuToolChainPackage::TypeGHS &&
mcuTarget->toolChainPackage()->type() != McuToolChainPackage::TypeGHSArm) {
if (mcuTarget->toolChainPackage()->type() != McuToolChainPackage::Type::GHS &&
mcuTarget->toolChainPackage()->type() != McuToolChainPackage::Type::GHSArm) {
config.append(CMakeConfigItem("CMAKE_CXX_COMPILER", "%{Compiler:Executable:Cxx}"));
config.append(CMakeConfigItem("CMAKE_C_COMPILER", "%{Compiler:Executable:C}"));
}
@@ -638,7 +673,7 @@ static void setKitCMakeOptions(Kit *k, const McuTarget* mcuTarget, const FilePat
if (HostOsInfo::isWindowsHost()) {
auto type = mcuTarget->toolChainPackage()->type();
if (type == McuToolChainPackage::TypeGHS || type == McuToolChainPackage::TypeGHSArm) {
if (type == McuToolChainPackage::Type::GHS || type == McuToolChainPackage::Type::GHSArm) {
// See https://bugreports.qt.io/browse/UL-4247?focusedCommentId=565802&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-565802
// and https://bugreports.qt.io/browse/UL-4247?focusedCommentId=565803&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-565803
CMakeGeneratorKitAspect::setGenerator(k, "NMake Makefiles JOM");

View File

@@ -74,17 +74,17 @@ McuPackage *createQtForMCUsPackage()
static McuToolChainPackage *createMsvcToolChainPackage()
{
return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::TypeMSVC);
return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::Type::MSVC);
}
static McuToolChainPackage *createGccToolChainPackage()
{
return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::TypeGCC);
return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::Type::GCC);
}
static McuToolChainPackage *createUnsupportedToolChainPackage()
{
return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::TypeUnsupported);
return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::Type::Unsupported);
}
static McuToolChainPackage *createArmGccPackage()
@@ -116,7 +116,7 @@ static McuToolChainPackage *createArmGccPackage()
defaultPath,
detectionPath,
"GNUArmEmbeddedToolchain", // settingsKey
McuToolChainPackage::TypeArmGcc,
McuToolChainPackage::Type::ArmGcc,
envVar,
versionDetector);
}
@@ -138,7 +138,7 @@ static McuToolChainPackage *createGhsToolchainPackage()
Utils::HostOsInfo::withExecutableSuffix(
"ccv850"), // detectionPath
"GHSToolchain", // settingsKey
McuToolChainPackage::TypeGHS,
McuToolChainPackage::Type::GHS,
envVar,
versionDetector);
}
@@ -159,7 +159,7 @@ static McuToolChainPackage *createGhsArmToolchainPackage()
defaultPath,
Utils::HostOsInfo::withExecutableSuffix("cxarm"), // detectionPath
"GHSArmToolchain", // settingsKey
McuToolChainPackage::TypeGHSArm,
McuToolChainPackage::Type::GHSArm,
envVar,
versionDetector);
}
@@ -193,7 +193,7 @@ static McuToolChainPackage *createIarToolChainPackage()
defaultPath,
detectionPath,
"IARToolchain", // settings key
McuToolChainPackage::TypeIAR,
McuToolChainPackage::Type::IAR,
envVar,
versionDetector);
}
@@ -555,7 +555,7 @@ protected:
// Desktop toolchains don't need any additional settings
if (tcPkg
&& !tcPkg->isDesktopToolchain()
&& tcPkg->type() != McuToolChainPackage::TypeUnsupported)
&& tcPkg->type() != McuToolChainPackage::Type::Unsupported)
required3rdPartyPkgs.append(tcPkg);
// Add setting specific to platform IDE