forked from qt-creator/qt-creator
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:
committed by
christiaan.janssen
parent
9c3e1cacf1
commit
edba0ca838
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -59,6 +59,7 @@ public:
|
|||||||
{Constants::RUNCONFIGURATION}
|
{Constants::RUNCONFIGURATION}
|
||||||
};
|
};
|
||||||
McuSupportOptionsPage optionsPage;
|
McuSupportOptionsPage optionsPage;
|
||||||
|
McuDependenciesKitAspect environmentPathsKitAspect;
|
||||||
};
|
};
|
||||||
|
|
||||||
static McuSupportPluginPrivate *dd = nullptr;
|
static McuSupportPluginPrivate *dd = nullptr;
|
||||||
|
Reference in New Issue
Block a user