McuSupport: track if kit dependencies go missing

Task-number: QTCREATORBUG-25262
Change-Id: Icf95a418216ae94fcfc76784a10eb23e403f3d52
Reviewed-by: Erik Verbruggen <erik.verbruggen@me.com>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Christiaan Janssen
2021-03-09 18:28:58 +01:00
committed by christiaan.janssen
parent 9c3e1cacf1
commit edba0ca838
3 changed files with 168 additions and 0 deletions

View File

@@ -764,6 +764,27 @@ static void setKitEnvironment(Kit *k, const McuTarget *mcuTarget,
EnvironmentKitAspect::setEnvironmentChanges(k, changes); EnvironmentKitAspect::setEnvironmentChanges(k, changes);
} }
static void setKitDependencies(Kit *k, const McuTarget *mcuTarget,
const McuPackage *qtForMCUsSdkPackage)
{
NameValueItems dependencies;
auto processPackage = [&dependencies](const McuPackage *package) {
if (!package->environmentVariableName().isEmpty())
dependencies.append({package->environmentVariableName(),
QDir::toNativeSeparators(package->detectionPath())});
};
for (auto package : mcuTarget->packages())
processPackage(package);
processPackage(qtForMCUsSdkPackage);
McuDependenciesKitAspect::setDependencies(k, dependencies);
auto irrelevant = k->irrelevantAspects();
irrelevant.insert(McuDependenciesKitAspect::id());
k->setIrrelevantAspects(irrelevant);
}
static void setKitCMakeOptions(Kit *k, const McuTarget* mcuTarget, const QString &qulDir) static void setKitCMakeOptions(Kit *k, const McuTarget* mcuTarget, const QString &qulDir)
{ {
using namespace CMakeProjectManager; using namespace CMakeProjectManager;
@@ -886,6 +907,7 @@ Kit *McuSupportOptions::newKit(const McuTarget *mcuTarget, const McuPackage *qtF
setKitToolchains(k, mcuTarget->toolChainPackage()); setKitToolchains(k, mcuTarget->toolChainPackage());
setKitDebugger(k, mcuTarget->toolChainPackage()); setKitDebugger(k, mcuTarget->toolChainPackage());
setKitEnvironment(k, mcuTarget, qtForMCUsSdk); setKitEnvironment(k, mcuTarget, qtForMCUsSdk);
setKitDependencies(k, mcuTarget, qtForMCUsSdk);
setKitCMakeOptions(k, mcuTarget, qtForMCUsSdk->path()); setKitCMakeOptions(k, mcuTarget, qtForMCUsSdk->path());
setKitQtVersionOptions(k); setKitQtVersionOptions(k);
@@ -1006,7 +1028,130 @@ void McuSupportOptions::fixExistingKits()
} }
} }
} }
// Fix kit dependencies for known targets
auto qtForMCUsPackage = Sdk::createQtForMCUsPackage();
qtForMCUsPackage->updateStatus();
if (qtForMCUsPackage->validStatus()) {
auto dir = FilePath::fromUserInput(qtForMCUsPackage->path());
QVector<McuPackage*> packages;
QVector<McuTarget*> mcuTargets;
Sdk::targetsAndPackages(dir, &packages, &mcuTargets);
for (auto target: qAsConst(mcuTargets))
for (auto kit: existingKits(target)) {
if (McuDependenciesKitAspect::dependencies(kit).isEmpty()) {
setKitDependencies(kit, target, qtForMCUsPackage);
}
}
qDeleteAll(packages);
qDeleteAll(mcuTargets);
}
delete qtForMCUsPackage;
} }
class McuDependenciesKitAspectWidget final : public KitAspectWidget
{
Q_DECLARE_TR_FUNCTIONS(McuSupport::McuDependenciesKitAspect)
public:
McuDependenciesKitAspectWidget(Kit *workingCopy, const KitAspect *ki)
: KitAspectWidget(workingCopy, ki)
{
m_emptyWidget = new QWidget();
}
~McuDependenciesKitAspectWidget() override {
delete m_emptyWidget;
}
void makeReadOnly() override {}
void refresh() override {}
QWidget *mainWidget() const override {
return m_emptyWidget;
}
private:
QWidget *m_emptyWidget;
};
} // Internal } // Internal
McuDependenciesKitAspect::McuDependenciesKitAspect()
{
setObjectName(QLatin1String("McuDependenciesKitAspect"));
setId(McuDependenciesKitAspect::id());
setDisplayName(tr("Mcu Dependencies"));
setDescription(tr("Paths to 3rd party dependencies"));
setPriority(28500);
}
Tasks McuDependenciesKitAspect::validate(const Kit *k) const
{
Tasks result;
QTC_ASSERT(k, return result);
const QVariant checkFormat = k->value(McuDependenciesKitAspect::id());
if (!checkFormat.isNull() && !checkFormat.canConvert(QVariant::List))
return { BuildSystemTask(Task::Error, tr("The mcu dependencies setting value is invalid.")) };
const QVariant envStringList = k->value(EnvironmentKitAspect::id());
if (!envStringList.isNull() && !envStringList.canConvert(QVariant::List))
return { BuildSystemTask(Task::Error, tr("The environment setting value is invalid.")) };
const auto environment = Utils::NameValueDictionary(envStringList.toStringList());
for (const auto &dependency: dependencies(k)) {
if (!environment.hasKey(dependency.name)) {
result << BuildSystemTask(Task::Warning, tr("Environment variable %1 not defined.").arg(dependency.name));
} else {
const auto path = Utils::FilePath::fromString(environment.value(dependency.name) + "/" + dependency.value);
if (!path.exists()) {
result << BuildSystemTask(Task::Warning, tr("%1 not found.").arg(path.toUserOutput()));
}
}
}
return result;
}
void McuDependenciesKitAspect::fix(Kit *k)
{
QTC_ASSERT(k, return);
const QVariant variant = k->value(McuDependenciesKitAspect::id());
if (!variant.isNull() && !variant.canConvert(QVariant::List)) {
qWarning("Kit \"%s\" has a wrong mcu dependencies value set.", qPrintable(k->displayName()));
setDependencies(k, Utils::NameValueItems());
}
}
KitAspectWidget *McuDependenciesKitAspect::createConfigWidget(Kit *k) const
{
QTC_ASSERT(k, return nullptr);
return new Internal::McuDependenciesKitAspectWidget(k, this);
}
KitAspect::ItemList McuDependenciesKitAspect::toUserOutput(const Kit *k) const
{
Q_UNUSED(k);
return {};
}
Utils::Id McuDependenciesKitAspect::id()
{
return "PE.Profile.McuDependencies";
}
Utils::NameValueItems McuDependenciesKitAspect::dependencies(const Kit *k)
{
if (k)
return Utils::NameValueItem::fromStringList(k->value(McuDependenciesKitAspect::id()).toStringList());
return Utils::NameValueItems();
}
void McuDependenciesKitAspect::setDependencies(Kit *k, const Utils::NameValueItems &dependencies)
{
if (k)
k->setValue(McuDependenciesKitAspect::id(), Utils::NameValueItem::toStringList(dependencies));
}
} // McuSupport } // McuSupport

View File

@@ -26,8 +26,10 @@
#pragma once #pragma once
#include "mcusupportversiondetection.h" #include "mcusupportversiondetection.h"
#include "mcusupport_global.h"
#include <utils/id.h> #include <utils/id.h>
#include <projectexplorer/kitinformation.h>
#include <QObject> #include <QObject>
#include <QVector> #include <QVector>
@@ -234,4 +236,24 @@ signals:
}; };
} // namespace Internal } // namespace Internal
class MCUSUPPORTSHARED_EXPORT McuDependenciesKitAspect : public ProjectExplorer::KitAspect
{
Q_OBJECT
public:
McuDependenciesKitAspect();
ProjectExplorer::Tasks validate(const ProjectExplorer::Kit *k) const override;
void fix(ProjectExplorer::Kit *k) override;
ProjectExplorer::KitAspectWidget *createConfigWidget(ProjectExplorer::Kit *k) const override;
ItemList toUserOutput(const ProjectExplorer::Kit *k) const override;
static Utils::Id id();
static Utils::NameValueItems dependencies(const ProjectExplorer::Kit *k);
static void setDependencies(ProjectExplorer::Kit *k, const Utils::NameValueItems &dependencies);
};
} // namespace McuSupport } // namespace McuSupport

View File

@@ -59,6 +59,7 @@ public:
{Constants::RUNCONFIGURATION} {Constants::RUNCONFIGURATION}
}; };
McuSupportOptionsPage optionsPage; McuSupportOptionsPage optionsPage;
McuDependenciesKitAspect environmentPathsKitAspect;
}; };
static McuSupportPluginPrivate *dd = nullptr; static McuSupportPluginPrivate *dd = nullptr;