McuSupport: Fix Desktop kit issues

- Use "Desktop" instead of "Qt" in kit name
- Set the right kit toolchain (and debugger)
- Unset Qt Version (and hide it from kit)
- Prepend Qul_DIR/bin to environment PATH (if no CMake fileApi)

This also gets rid of the ugly mcuTargetIsDesktop() function
in favor of the new McuToolChainPackage::TypeDesktop

Task-number: QTCREATORBUG-23820
Change-Id: I5af61d5b0f414b4441239494e99b0b15088eee76
Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Alessandro Portale
2020-04-07 18:19:32 +02:00
parent fc879d196f
commit f0f12fabd6
3 changed files with 85 additions and 38 deletions

View File

@@ -27,18 +27,21 @@
#include "mcusupportoptions.h" #include "mcusupportoptions.h"
#include "mcusupportsdk.h" #include "mcusupportsdk.h"
#include <cmakeprojectmanager/cmaketoolmanager.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/helpmanager.h> #include <coreplugin/helpmanager.h>
#include <cmakeprojectmanager/cmakekitinformation.h> #include <cmakeprojectmanager/cmakekitinformation.h>
#include <debugger/debuggeritem.h> #include <debugger/debuggeritem.h>
#include <debugger/debuggeritemmanager.h> #include <debugger/debuggeritemmanager.h>
#include <debugger/debuggerkitinformation.h> #include <debugger/debuggerkitinformation.h>
#include <projectexplorer/abi.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/toolchain.h> #include <projectexplorer/toolchain.h>
#include <projectexplorer/toolchainmanager.h> #include <projectexplorer/toolchainmanager.h>
#include <projectexplorer/kitmanager.h> #include <projectexplorer/kitmanager.h>
#include <projectexplorer/kitinformation.h> #include <projectexplorer/kitinformation.h>
#include <projectexplorer/devicesupport/devicemanager.h> #include <projectexplorer/devicesupport/devicemanager.h>
#include <qtsupport/qtkitinformation.h>
#include <qtsupport/qtversionmanager.h> #include <qtsupport/qtversionmanager.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/fileutils.h> #include <utils/fileutils.h>
@@ -217,6 +220,22 @@ McuToolChainPackage::Type McuToolChainPackage::type() const
return m_type; return m_type;
} }
static ProjectExplorer::ToolChain *desktopToolChain(Core::Id language)
{
using namespace ProjectExplorer;
ToolChain *toolChain = ToolChainManager::toolChain([language](const ToolChain *t) {
const Abi abi = t->targetAbi();
return (abi.os() != Abi::WindowsOS
|| (abi.osFlavor() == Abi::WindowsMsvc2017Flavor
|| abi.osFlavor() == Abi::WindowsMsvc2019Flavor))
&& abi.architecture() == Abi::X86Architecture
&& abi.wordWidth() == 64
&& t->language() == language;
});
return toolChain;
}
static ProjectExplorer::ToolChain* armGccToolChain(const Utils::FilePath &path, Core::Id language) static ProjectExplorer::ToolChain* armGccToolChain(const Utils::FilePath &path, Core::Id language)
{ {
using namespace ProjectExplorer; using namespace ProjectExplorer;
@@ -245,6 +264,10 @@ static ProjectExplorer::ToolChain* armGccToolChain(const Utils::FilePath &path,
ProjectExplorer::ToolChain *McuToolChainPackage::toolChain(Core::Id language) const ProjectExplorer::ToolChain *McuToolChainPackage::toolChain(Core::Id language) const
{ {
ProjectExplorer::ToolChain *tc = nullptr;
if (m_type == TypeDesktop) {
tc = desktopToolChain(language);
} else {
const QLatin1String compilerName( const QLatin1String compilerName(
language == ProjectExplorer::Constants::C_LANGUAGE_ID ? "gcc" : "g++"); language == ProjectExplorer::Constants::C_LANGUAGE_ID ? "gcc" : "g++");
const Utils::FilePath compiler = Utils::FilePath::fromUserInput( const Utils::FilePath compiler = Utils::FilePath::fromUserInput(
@@ -254,7 +277,8 @@ ProjectExplorer::ToolChain *McuToolChainPackage::toolChain(Core::Id language) co
? "/bin/arm-none-eabi-%1" : m_type == TypeIAR ? "/bin/arm-none-eabi-%1" : m_type == TypeIAR
? "/foo/bar-iar-%1" : "/bar/foo-keil-%1")).arg(compilerName)); ? "/foo/bar-iar-%1" : "/bar/foo-keil-%1")).arg(compilerName));
ProjectExplorer::ToolChain *tc = armGccToolChain(compiler, language); tc = armGccToolChain(compiler, language);
}
return tc; return tc;
} }
@@ -429,11 +453,6 @@ Utils::FilePath McuSupportOptions::qulDirFromSettings()
packagePathFromSettings(Constants::SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK)); packagePathFromSettings(Constants::SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK));
} }
static bool mcuTargetIsDesktop(const McuTarget* mcuTarget)
{
return mcuTarget->qulPlatform() == "Qt";
}
static Utils::FilePath jomExecutablePath() static Utils::FilePath jomExecutablePath()
{ {
return Utils::HostOsInfo::isWindowsHost() ? return Utils::HostOsInfo::isWindowsHost() ?
@@ -453,18 +472,16 @@ static void setKitProperties(const QString &kitName, ProjectExplorer::Kit *k,
McuSupportOptions::supportedQulVersion().toString()); McuSupportOptions::supportedQulVersion().toString());
k->setAutoDetected(true); k->setAutoDetected(true);
k->makeSticky(); k->makeSticky();
if (mcuTargetIsDesktop(mcuTarget)) { if (mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop)
k->setDeviceTypeForIcon(Constants::DEVICE_TYPE); k->setDeviceTypeForIcon(Constants::DEVICE_TYPE);
} else {
QSet<Core::Id> irrelevant = { QSet<Core::Id> irrelevant = {
SysRootKitAspect::id(), SysRootKitAspect::id(),
"QtSupport.QtInformation" // QtKitAspect::id() QtSupport::QtKitAspect::id()
}; };
if (jomExecutablePath().exists()) // TODO: add id() getter to CMakeGeneratorKitAspect if (jomExecutablePath().exists()) // TODO: add id() getter to CMakeGeneratorKitAspect
irrelevant.insert("CMake.GeneratorKitInformation"); irrelevant.insert("CMake.GeneratorKitInformation");
k->setIrrelevantAspects(irrelevant); k->setIrrelevantAspects(irrelevant);
} }
}
static void setKitToolchains(ProjectExplorer::Kit *k, const McuToolChainPackage *tcPackage) static void setKitToolchains(ProjectExplorer::Kit *k, const McuToolChainPackage *tcPackage)
{ {
@@ -476,11 +493,20 @@ static void setKitToolchains(ProjectExplorer::Kit *k, const McuToolChainPackage
static void setKitDebugger(ProjectExplorer::Kit *k, const McuToolChainPackage *tcPackage) static void setKitDebugger(ProjectExplorer::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->type() == McuToolChainPackage::TypeDesktop)
return;
Debugger::DebuggerKitAspect::setDebugger(k, tcPackage->debuggerId()); Debugger::DebuggerKitAspect::setDebugger(k, tcPackage->debuggerId());
} }
static void setKitDevice(ProjectExplorer::Kit *k) static void setKitDevice(ProjectExplorer::Kit *k, const McuTarget* mcuTarget)
{ {
// "Device Type" Desktop is the default. We use that for the Qt for MCUs Desktop Kit
if (mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop)
return;
ProjectExplorer::DeviceTypeKitAspect::setDeviceTypeId(k, Constants::DEVICE_TYPE); ProjectExplorer::DeviceTypeKitAspect::setDeviceTypeId(k, Constants::DEVICE_TYPE);
} }
@@ -492,6 +518,13 @@ static void setKitEnvironment(ProjectExplorer::Kit *k, const McuTarget* mcuTarge
Utils::EnvironmentItems changes; Utils::EnvironmentItems changes;
QStringList pathAdditions; QStringList pathAdditions;
// The Desktop version depends on the Qt shared libs in Qul_DIR/bin.
// If CMake's fileApi is avaialble, we can rely on the "Add library search path to PATH"
// feature of the run configuration. Otherwise, we just prepend the path, here.
if (mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop
&& !CMakeProjectManager::CMakeToolManager::defaultCMakeTool()->hasFileApi())
pathAdditions.append(QDir::toNativeSeparators(qtForMCUsSdkPackage->path() + "/bin"));
QVector<McuPackage *> packagesIncludingSdk; QVector<McuPackage *> packagesIncludingSdk;
packagesIncludingSdk.reserve(mcuTarget->packages().size() + 1); packagesIncludingSdk.reserve(mcuTarget->packages().size() + 1);
packagesIncludingSdk.append(mcuTarget->packages()); packagesIncludingSdk.append(mcuTarget->packages());
@@ -519,7 +552,7 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const McuTarget* mcuTarg
CMakeConfig config = CMakeConfigurationKitAspect::configuration(k); CMakeConfig config = CMakeConfigurationKitAspect::configuration(k);
config.append(CMakeConfigItem("CMAKE_CXX_COMPILER", "%{Compiler:Executable:Cxx}")); config.append(CMakeConfigItem("CMAKE_CXX_COMPILER", "%{Compiler:Executable:Cxx}"));
config.append(CMakeConfigItem("CMAKE_C_COMPILER", "%{Compiler:Executable:C}")); config.append(CMakeConfigItem("CMAKE_C_COMPILER", "%{Compiler:Executable:C}"));
if (mcuTarget->toolChainPackage()) if (mcuTarget->toolChainPackage()->type() != McuToolChainPackage::TypeDesktop)
config.append(CMakeConfigItem( config.append(CMakeConfigItem(
"CMAKE_TOOLCHAIN_FILE", "CMAKE_TOOLCHAIN_FILE",
(qulDir + "/lib/cmake/Qul/toolchain/" (qulDir + "/lib/cmake/Qul/toolchain/"
@@ -528,8 +561,6 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const McuTarget* mcuTarg
(qulDir + "/lib/cmake/Qul/QulGenerators.cmake").toUtf8())); (qulDir + "/lib/cmake/Qul/QulGenerators.cmake").toUtf8()));
config.append(CMakeConfigItem("QUL_PLATFORM", config.append(CMakeConfigItem("QUL_PLATFORM",
mcuTarget->qulPlatform().toUtf8())); mcuTarget->qulPlatform().toUtf8()));
if (mcuTargetIsDesktop(mcuTarget))
config.append(CMakeConfigItem("CMAKE_PREFIX_PATH", "%{Qt:QT_INSTALL_PREFIX}"));
if (mcuTarget->colorDepth() >= 0) if (mcuTarget->colorDepth() >= 0)
config.append(CMakeConfigItem("QUL_COLOR_DEPTH", config.append(CMakeConfigItem("QUL_COLOR_DEPTH",
QString::number(mcuTarget->colorDepth()).toLatin1())); QString::number(mcuTarget->colorDepth()).toLatin1()));
@@ -541,14 +572,24 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const McuTarget* mcuTarg
CMakeConfigurationKitAspect::setConfiguration(k, config); CMakeConfigurationKitAspect::setConfiguration(k, config);
} }
static void setKitQtVersionOptions(ProjectExplorer::Kit *k)
{
QtSupport::QtKitAspect::setQtVersion(k, nullptr);
}
QString McuSupportOptions::kitName(const McuTarget *mcuTarget) const QString McuSupportOptions::kitName(const McuTarget *mcuTarget) const
{ {
// TODO: get version from qulSdkPackage and insert into name // TODO: get version from qulSdkPackage and insert into name
const QString colorDepth = mcuTarget->colorDepth() > 0 const QString colorDepth = mcuTarget->colorDepth() > 0
? QString::fromLatin1(" %1bpp").arg(mcuTarget->colorDepth()) ? QString::fromLatin1(" %1bpp").arg(mcuTarget->colorDepth())
: ""; : "";
// Hack: Use the platform name in the kit name. Exception for the "Qt" platform: use "Desktop"
const QString targetName =
mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop
? "Desktop"
: mcuTarget->qulPlatform();
return QString::fromLatin1("Qt for MCUs %1 - %2%3") return QString::fromLatin1("Qt for MCUs %1 - %2%3")
.arg(supportedQulVersion().toString(), mcuTarget->qulPlatform(), colorDepth); .arg(supportedQulVersion().toString(), targetName, colorDepth);
} }
QList<ProjectExplorer::Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTargt) QList<ProjectExplorer::Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTargt)
@@ -568,13 +609,12 @@ ProjectExplorer::Kit *McuSupportOptions::newKit(const McuTarget *mcuTarget)
KitGuard kitGuard(k); KitGuard kitGuard(k);
setKitProperties(kitName(mcuTarget), k, mcuTarget); setKitProperties(kitName(mcuTarget), k, mcuTarget);
if (!mcuTargetIsDesktop(mcuTarget)) { setKitDevice(k, mcuTarget);
setKitToolchains(k, mcuTarget->toolChainPackage()); setKitToolchains(k, mcuTarget->toolChainPackage());
setKitDebugger(k, mcuTarget->toolChainPackage()); setKitDebugger(k, mcuTarget->toolChainPackage());
setKitDevice(k);
}
setKitEnvironment(k, mcuTarget, qtForMCUsSdkPackage); setKitEnvironment(k, mcuTarget, qtForMCUsSdkPackage);
setKitCMakeOptions(k, mcuTarget, qtForMCUsSdkPackage->path()); setKitCMakeOptions(k, mcuTarget, qtForMCUsSdkPackage->path());
setKitQtVersionOptions(k);
k->setup(); k->setup();
k->fix(); k->fix();

View File

@@ -109,7 +109,8 @@ public:
enum Type { enum Type {
TypeArmGcc, TypeArmGcc,
TypeIAR, TypeIAR,
TypeKEIL TypeKEIL,
TypeDesktop
}; };
McuToolChainPackage(const QString &label, const QString &defaultPath, McuToolChainPackage(const QString &label, const QString &defaultPath,

View File

@@ -60,6 +60,11 @@ McuPackage *createQtForMCUsPackage()
return result; return result;
} }
static McuToolChainPackage *createDesktopToolChainPackage()
{
return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::TypeDesktop);
}
static McuToolChainPackage *createArmGccPackage() static McuToolChainPackage *createArmGccPackage()
{ {
const char envVar[] = "ARMGCC_DIR"; const char envVar[] = "ARMGCC_DIR";
@@ -162,6 +167,7 @@ void hardcodedTargetsAndPackages(const Utils::FilePath &dir, QVector<McuPackage
QVector<McuTarget *> *mcuTargets) QVector<McuTarget *> *mcuTargets)
{ {
McuToolChainPackage* armGccPackage = Sdk::createArmGccPackage(); McuToolChainPackage* armGccPackage = Sdk::createArmGccPackage();
McuToolChainPackage* desktopToolChainPackage = createDesktopToolChainPackage();
McuPackage* stm32CubeFwF7SdkPackage = Sdk::createStm32CubeFwF7SdkPackage(); McuPackage* stm32CubeFwF7SdkPackage = Sdk::createStm32CubeFwF7SdkPackage();
McuPackage* stm32CubeProgrammerPackage = Sdk::createStm32CubeProgrammerPackage(); McuPackage* stm32CubeProgrammerPackage = Sdk::createStm32CubeProgrammerPackage();
McuPackage* evkbImxrt1050SdkPackage = Sdk::createEvkbImxrt1050SdkPackage(); McuPackage* evkbImxrt1050SdkPackage = Sdk::createEvkbImxrt1050SdkPackage();
@@ -175,8 +181,8 @@ void hardcodedTargetsAndPackages(const Utils::FilePath &dir, QVector<McuPackage
armGccPackage, seggerJLinkPackage}; armGccPackage, seggerJLinkPackage};
QVector<McuPackage*> desktopPackages = {}; QVector<McuPackage*> desktopPackages = {};
*packages = { *packages = {
armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, evkbImxrt1050SdkPackage, armGccPackage, desktopToolChainPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage,
seggerJLinkPackage}; evkbImxrt1050SdkPackage, seggerJLinkPackage};
const QString vendorStm = "STM"; const QString vendorStm = "STM";
const QString vendorNxp = "NXP"; const QString vendorNxp = "NXP";
@@ -192,7 +198,7 @@ void hardcodedTargetsAndPackages(const Utils::FilePath &dir, QVector<McuPackage
} targets[] = { } targets[] = {
{vendorNxp, {"MIMXRT1050-EVK"}, nxpEvalPackages, armGccPackage, {16}}, {vendorNxp, {"MIMXRT1050-EVK"}, nxpEvalPackages, armGccPackage, {16}},
{vendorNxp, {"MIMXRT1064-EVK"}, nxpEvalPackages, armGccPackage, {16}}, {vendorNxp, {"MIMXRT1064-EVK"}, nxpEvalPackages, armGccPackage, {16}},
{vendorQt, {"Qt"}, desktopPackages, nullptr, {32}}, {vendorQt, {"Qt"}, desktopPackages, desktopToolChainPackage, {32}},
{vendorRenesas, {"RH850-D1M1A"}, renesasEvalPackages, armGccPackage, {32}}, {vendorRenesas, {"RH850-D1M1A"}, renesasEvalPackages, armGccPackage, {32}},
{vendorStm, {"STM32F469I-DISCOVERY"}, stmEvalPackages, armGccPackage, {24}}, {vendorStm, {"STM32F469I-DISCOVERY"}, stmEvalPackages, armGccPackage, {24}},
{vendorStm, {"STM32F7508-DISCOVERY"}, stmEvalPackages, armGccPackage, {32, 16}}, {vendorStm, {"STM32F7508-DISCOVERY"}, stmEvalPackages, armGccPackage, {32, 16}},