2022-08-19 15:59:36 +02:00
|
|
|
// Copyright (C) 2022 The Qt Company Ltd.
|
|
|
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
2022-04-06 10:15:29 +02:00
|
|
|
|
|
|
|
|
#include "kitdetector.h"
|
2022-04-07 09:01:21 +02:00
|
|
|
|
2022-04-07 14:04:20 +02:00
|
|
|
#include <cmakeprojectmanager/cmakeprojectconstants.h>
|
|
|
|
|
|
2022-04-06 10:15:29 +02:00
|
|
|
#include <extensionsystem/pluginmanager.h>
|
|
|
|
|
|
2022-04-12 21:01:45 +02:00
|
|
|
#include <projectexplorer/devicesupport/idevice.h>
|
2022-07-13 10:43:31 +02:00
|
|
|
#include <projectexplorer/projectexplorertr.h>
|
2022-04-06 10:15:29 +02:00
|
|
|
#include <projectexplorer/toolchain.h>
|
|
|
|
|
#include <projectexplorer/toolchainmanager.h>
|
|
|
|
|
|
|
|
|
|
#include <qtsupport/baseqtversion.h>
|
|
|
|
|
#include <qtsupport/qtkitinformation.h>
|
|
|
|
|
#include <qtsupport/qtversionfactory.h>
|
|
|
|
|
#include <qtsupport/qtversionmanager.h>
|
|
|
|
|
|
|
|
|
|
#include <utils/filepath.h>
|
|
|
|
|
#include <utils/qtcassert.h>
|
2022-04-07 14:04:20 +02:00
|
|
|
#include <utils/algorithm.h>
|
2022-04-06 10:15:29 +02:00
|
|
|
|
|
|
|
|
#include <QApplication>
|
|
|
|
|
|
|
|
|
|
using namespace ProjectExplorer;
|
|
|
|
|
using namespace QtSupport;
|
|
|
|
|
using namespace Utils;
|
|
|
|
|
|
2022-07-13 10:43:31 +02:00
|
|
|
namespace Docker::Internal {
|
2022-04-06 10:15:29 +02:00
|
|
|
|
|
|
|
|
class KitDetectorPrivate
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
KitDetectorPrivate(KitDetector *parent, const IDevice::ConstPtr &device)
|
2022-04-07 09:01:21 +02:00
|
|
|
: q(parent)
|
|
|
|
|
, m_device(device)
|
2022-04-06 10:15:29 +02:00
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
void autoDetect();
|
|
|
|
|
void undoAutoDetect() const;
|
|
|
|
|
void listAutoDetected() const;
|
|
|
|
|
|
|
|
|
|
void setSharedId(const QString &sharedId) { m_sharedId = sharedId; }
|
|
|
|
|
void setSearchPaths(const FilePaths &searchPaths) { m_searchPaths = searchPaths; }
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
QtVersions autoDetectQtVersions() const;
|
|
|
|
|
QList<ToolChain *> autoDetectToolChains();
|
2022-04-07 14:04:20 +02:00
|
|
|
QList<Id> autoDetectCMake();
|
2022-04-06 10:15:29 +02:00
|
|
|
void autoDetectDebugger();
|
|
|
|
|
|
|
|
|
|
KitDetector *q;
|
|
|
|
|
IDevice::ConstPtr m_device;
|
|
|
|
|
QString m_sharedId;
|
|
|
|
|
FilePaths m_searchPaths;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
KitDetector::KitDetector(const IDevice::ConstPtr &device)
|
|
|
|
|
: d(new KitDetectorPrivate(this, device))
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
KitDetector::~KitDetector()
|
|
|
|
|
{
|
|
|
|
|
delete d;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KitDetector::autoDetect(const QString &sharedId, const FilePaths &searchPaths) const
|
|
|
|
|
{
|
|
|
|
|
d->setSharedId(sharedId);
|
|
|
|
|
d->setSearchPaths(searchPaths);
|
|
|
|
|
d->autoDetect();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KitDetector::undoAutoDetect(const QString &sharedId) const
|
|
|
|
|
{
|
|
|
|
|
d->setSharedId(sharedId);
|
|
|
|
|
d->undoAutoDetect();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KitDetector::listAutoDetected(const QString &sharedId) const
|
|
|
|
|
{
|
|
|
|
|
d->setSharedId(sharedId);
|
|
|
|
|
d->listAutoDetected();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KitDetectorPrivate::undoAutoDetect() const
|
|
|
|
|
{
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput(ProjectExplorer::Tr::tr("Start removing auto-detected items associated with this docker image."));
|
2022-04-06 10:15:29 +02:00
|
|
|
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput('\n' + ProjectExplorer::Tr::tr("Removing kits..."));
|
2022-04-06 10:15:29 +02:00
|
|
|
for (Kit *kit : KitManager::kits()) {
|
|
|
|
|
if (kit->autoDetectionSource() == m_sharedId) {
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput(ProjectExplorer::Tr::tr("Removed \"%1\"").arg(kit->displayName()));
|
2022-04-06 10:15:29 +02:00
|
|
|
KitManager::deregisterKit(kit);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput('\n' + ProjectExplorer::Tr::tr("Removing Qt version entries..."));
|
2022-04-06 10:15:29 +02:00
|
|
|
for (QtVersion *qtVersion : QtVersionManager::versions()) {
|
|
|
|
|
if (qtVersion->detectionSource() == m_sharedId) {
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput(ProjectExplorer::Tr::tr("Removed \"%1\"").arg(qtVersion->displayName()));
|
2022-04-06 10:15:29 +02:00
|
|
|
QtVersionManager::removeVersion(qtVersion);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput('\n' + ProjectExplorer::Tr::tr("Removing toolchain entries..."));
|
2022-04-06 10:15:29 +02:00
|
|
|
const Toolchains toolchains = ToolChainManager::toolchains();
|
|
|
|
|
for (ToolChain *toolChain : toolchains) {
|
|
|
|
|
if (toolChain && toolChain->detectionSource() == m_sharedId) {
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput(ProjectExplorer::Tr::tr("Removed \"%1\"").arg(toolChain->displayName()));
|
2022-04-06 10:15:29 +02:00
|
|
|
ToolChainManager::deregisterToolChain(toolChain);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2022-04-07 09:01:21 +02:00
|
|
|
if (auto cmakeManager = ExtensionSystem::PluginManager::getObjectByName("CMakeToolManager")) {
|
2022-04-06 10:15:29 +02:00
|
|
|
QString logMessage;
|
|
|
|
|
const bool res = QMetaObject::invokeMethod(cmakeManager,
|
|
|
|
|
"removeDetectedCMake",
|
|
|
|
|
Q_ARG(QString, m_sharedId),
|
|
|
|
|
Q_ARG(QString *, &logMessage));
|
|
|
|
|
QTC_CHECK(res);
|
|
|
|
|
emit q->logOutput('\n' + logMessage);
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-07 09:01:21 +02:00
|
|
|
if (auto debuggerPlugin = ExtensionSystem::PluginManager::getObjectByName("DebuggerPlugin")) {
|
2022-04-06 10:15:29 +02:00
|
|
|
QString logMessage;
|
|
|
|
|
const bool res = QMetaObject::invokeMethod(debuggerPlugin,
|
|
|
|
|
"removeDetectedDebuggers",
|
|
|
|
|
Q_ARG(QString, m_sharedId),
|
|
|
|
|
Q_ARG(QString *, &logMessage));
|
|
|
|
|
QTC_CHECK(res);
|
|
|
|
|
emit q->logOutput('\n' + logMessage);
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput('\n' + ProjectExplorer::Tr::tr("Removal of previously auto-detected kit items finished.") + "\n\n");
|
2022-04-06 10:15:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KitDetectorPrivate::listAutoDetected() const
|
|
|
|
|
{
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput(ProjectExplorer::Tr::tr("Start listing auto-detected items associated with this docker image."));
|
2022-04-06 10:15:29 +02:00
|
|
|
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput('\n' + ProjectExplorer::Tr::tr("Kits:"));
|
2022-04-06 10:15:29 +02:00
|
|
|
for (Kit *kit : KitManager::kits()) {
|
|
|
|
|
if (kit->autoDetectionSource() == m_sharedId)
|
|
|
|
|
emit q->logOutput(kit->displayName());
|
2022-04-07 09:01:21 +02:00
|
|
|
}
|
2022-04-06 10:15:29 +02:00
|
|
|
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput('\n' + ProjectExplorer::Tr::tr("Qt versions:"));
|
2022-04-06 10:15:29 +02:00
|
|
|
for (QtVersion *qtVersion : QtVersionManager::versions()) {
|
|
|
|
|
if (qtVersion->detectionSource() == m_sharedId)
|
|
|
|
|
emit q->logOutput(qtVersion->displayName());
|
2022-04-07 09:01:21 +02:00
|
|
|
}
|
2022-04-06 10:15:29 +02:00
|
|
|
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput('\n' + ProjectExplorer::Tr::tr("Toolchains:"));
|
2022-04-06 10:15:29 +02:00
|
|
|
for (ToolChain *toolChain : ToolChainManager::toolchains()) {
|
|
|
|
|
if (toolChain->detectionSource() == m_sharedId)
|
|
|
|
|
emit q->logOutput(toolChain->displayName());
|
2022-04-07 09:01:21 +02:00
|
|
|
}
|
2022-04-06 10:15:29 +02:00
|
|
|
|
2022-04-07 09:01:21 +02:00
|
|
|
if (QObject *cmakeManager = ExtensionSystem::PluginManager::getObjectByName(
|
|
|
|
|
"CMakeToolManager")) {
|
2022-04-06 10:15:29 +02:00
|
|
|
QString logMessage;
|
|
|
|
|
const bool res = QMetaObject::invokeMethod(cmakeManager,
|
|
|
|
|
"listDetectedCMake",
|
|
|
|
|
Q_ARG(QString, m_sharedId),
|
|
|
|
|
Q_ARG(QString *, &logMessage));
|
|
|
|
|
QTC_CHECK(res);
|
|
|
|
|
emit q->logOutput('\n' + logMessage);
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-07 09:01:21 +02:00
|
|
|
if (QObject *debuggerPlugin = ExtensionSystem::PluginManager::getObjectByName(
|
|
|
|
|
"DebuggerPlugin")) {
|
2022-04-06 10:15:29 +02:00
|
|
|
QString logMessage;
|
|
|
|
|
const bool res = QMetaObject::invokeMethod(debuggerPlugin,
|
|
|
|
|
"listDetectedDebuggers",
|
|
|
|
|
Q_ARG(QString, m_sharedId),
|
|
|
|
|
Q_ARG(QString *, &logMessage));
|
|
|
|
|
QTC_CHECK(res);
|
|
|
|
|
emit q->logOutput('\n' + logMessage);
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput('\n' + ProjectExplorer::Tr::tr("Listing of previously auto-detected kit items finished.") + "\n\n");
|
2022-04-06 10:15:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QtVersions KitDetectorPrivate::autoDetectQtVersions() const
|
|
|
|
|
{
|
|
|
|
|
QtVersions qtVersions;
|
|
|
|
|
|
|
|
|
|
QString error;
|
|
|
|
|
|
|
|
|
|
const auto handleQmake = [this, &qtVersions, &error](const FilePath &qmake) {
|
2022-06-01 14:18:50 +02:00
|
|
|
if (QtVersion *qtVersion = QtVersionFactory::createQtVersionFromQMakePath(qmake,
|
|
|
|
|
false,
|
|
|
|
|
m_sharedId,
|
|
|
|
|
&error)) {
|
2022-04-07 14:04:20 +02:00
|
|
|
if (qtVersion->isValid()) {
|
|
|
|
|
if (!Utils::anyOf(qtVersions,
|
|
|
|
|
[qtVersion](QtVersion* other) {
|
|
|
|
|
return qtVersion->mkspecPath() == other->mkspecPath();
|
|
|
|
|
})) {
|
|
|
|
|
|
|
|
|
|
qtVersions.append(qtVersion);
|
|
|
|
|
QtVersionManager::addVersion(qtVersion);
|
|
|
|
|
emit q->logOutput(
|
2022-07-13 10:43:31 +02:00
|
|
|
ProjectExplorer::Tr::tr("Found \"%1\"").arg(qtVersion->qmakeFilePath().toUserOutput()));
|
2022-04-07 14:04:20 +02:00
|
|
|
}
|
|
|
|
|
}
|
2022-04-06 10:15:29 +02:00
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
};
|
|
|
|
|
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput(ProjectExplorer::Tr::tr("Searching for qmake executables..."));
|
2022-04-06 10:15:29 +02:00
|
|
|
|
|
|
|
|
const QStringList candidates = {"qmake-qt6", "qmake-qt5", "qmake"};
|
|
|
|
|
for (const FilePath &searchPath : m_searchPaths) {
|
2022-04-07 09:01:21 +02:00
|
|
|
searchPath.iterateDirectory(handleQmake,
|
|
|
|
|
{candidates,
|
|
|
|
|
QDir::Files | QDir::Executable,
|
|
|
|
|
QDirIterator::Subdirectories});
|
2022-04-06 10:15:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!error.isEmpty())
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput(ProjectExplorer::Tr::tr("Error: %1.").arg(error));
|
2022-04-06 10:15:29 +02:00
|
|
|
if (qtVersions.isEmpty())
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput(ProjectExplorer::Tr::tr("No Qt installation found."));
|
2022-04-06 10:15:29 +02:00
|
|
|
return qtVersions;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Toolchains KitDetectorPrivate::autoDetectToolChains()
|
|
|
|
|
{
|
|
|
|
|
const QList<ToolChainFactory *> factories = ToolChainFactory::allToolChainFactories();
|
|
|
|
|
|
|
|
|
|
Toolchains alreadyKnown = ToolChainManager::toolchains();
|
|
|
|
|
Toolchains allNewToolChains;
|
|
|
|
|
QApplication::processEvents();
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput('\n' + ProjectExplorer::Tr::tr("Searching toolchains..."));
|
2022-04-06 10:15:29 +02:00
|
|
|
for (ToolChainFactory *factory : factories) {
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput(ProjectExplorer::Tr::tr("Searching toolchains of type %1").arg(factory->displayName()));
|
2022-04-06 10:15:29 +02:00
|
|
|
const ToolchainDetector detector(alreadyKnown, m_device, m_searchPaths);
|
|
|
|
|
const Toolchains newToolChains = factory->autoDetect(detector);
|
|
|
|
|
for (ToolChain *toolChain : newToolChains) {
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput(ProjectExplorer::Tr::tr("Found \"%1\"").arg(toolChain->compilerCommand().toUserOutput()));
|
2022-04-06 10:15:29 +02:00
|
|
|
toolChain->setDetectionSource(m_sharedId);
|
|
|
|
|
ToolChainManager::registerToolChain(toolChain);
|
|
|
|
|
alreadyKnown.append(toolChain);
|
|
|
|
|
}
|
|
|
|
|
allNewToolChains.append(newToolChains);
|
|
|
|
|
}
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput(ProjectExplorer::Tr::tr("%1 new toolchains found.").arg(allNewToolChains.size()));
|
2022-04-06 10:15:29 +02:00
|
|
|
|
|
|
|
|
return allNewToolChains;
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-07 14:04:20 +02:00
|
|
|
QList<Id> KitDetectorPrivate::autoDetectCMake()
|
2022-04-06 10:15:29 +02:00
|
|
|
{
|
2022-04-07 14:04:20 +02:00
|
|
|
QList<Id> result;
|
2022-04-06 10:15:29 +02:00
|
|
|
QObject *cmakeManager = ExtensionSystem::PluginManager::getObjectByName("CMakeToolManager");
|
|
|
|
|
if (!cmakeManager)
|
2022-04-07 14:04:20 +02:00
|
|
|
return {};
|
2022-04-06 10:15:29 +02:00
|
|
|
|
|
|
|
|
QString logMessage;
|
|
|
|
|
const bool res = QMetaObject::invokeMethod(cmakeManager,
|
|
|
|
|
"autoDetectCMakeForDevice",
|
2022-04-07 14:04:20 +02:00
|
|
|
Q_RETURN_ARG(QList<Utils::Id>, result),
|
2022-04-06 10:15:29 +02:00
|
|
|
Q_ARG(Utils::FilePaths, m_searchPaths),
|
|
|
|
|
Q_ARG(QString, m_sharedId),
|
|
|
|
|
Q_ARG(QString *, &logMessage));
|
|
|
|
|
QTC_CHECK(res);
|
|
|
|
|
emit q->logOutput('\n' + logMessage);
|
2022-04-07 14:04:20 +02:00
|
|
|
|
|
|
|
|
return result;
|
2022-04-06 10:15:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KitDetectorPrivate::autoDetectDebugger()
|
|
|
|
|
{
|
|
|
|
|
QObject *debuggerPlugin = ExtensionSystem::PluginManager::getObjectByName("DebuggerPlugin");
|
|
|
|
|
if (!debuggerPlugin)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
QString logMessage;
|
|
|
|
|
const bool res = QMetaObject::invokeMethod(debuggerPlugin,
|
|
|
|
|
"autoDetectDebuggersForDevice",
|
|
|
|
|
Q_ARG(Utils::FilePaths, m_searchPaths),
|
|
|
|
|
Q_ARG(QString, m_sharedId),
|
|
|
|
|
Q_ARG(QString *, &logMessage));
|
|
|
|
|
QTC_CHECK(res);
|
|
|
|
|
emit q->logOutput('\n' + logMessage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KitDetectorPrivate::autoDetect()
|
|
|
|
|
{
|
|
|
|
|
QApplication::setOverrideCursor(Qt::WaitCursor);
|
|
|
|
|
|
|
|
|
|
undoAutoDetect();
|
|
|
|
|
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput(ProjectExplorer::Tr::tr("Starting auto-detection. This will take a while..."));
|
2022-04-06 10:15:29 +02:00
|
|
|
|
|
|
|
|
const Toolchains toolchains = autoDetectToolChains();
|
|
|
|
|
const QtVersions qtVersions = autoDetectQtVersions();
|
|
|
|
|
|
2022-04-07 14:04:20 +02:00
|
|
|
const QList<Id> cmakeIds = autoDetectCMake();
|
|
|
|
|
const Id cmakeId = cmakeIds.empty() ? Id() : cmakeIds.first();
|
2022-04-06 10:15:29 +02:00
|
|
|
autoDetectDebugger();
|
|
|
|
|
|
2022-04-07 14:04:20 +02:00
|
|
|
const auto initializeKit = [this, toolchains, qtVersions, cmakeId](Kit *k) {
|
2022-04-06 10:15:29 +02:00
|
|
|
k->setAutoDetected(false);
|
|
|
|
|
k->setAutoDetectionSource(m_sharedId);
|
|
|
|
|
k->setUnexpandedDisplayName("%{Device:Name}");
|
|
|
|
|
|
2022-04-07 14:04:20 +02:00
|
|
|
if (cmakeId.isValid())
|
|
|
|
|
k->setValue(CMakeProjectManager::Constants::TOOL_ID, cmakeId.toSetting());
|
|
|
|
|
|
2022-05-27 22:08:38 -04:00
|
|
|
DeviceTypeKitAspect::setDeviceTypeId(k, m_device->type());
|
2022-04-06 10:15:29 +02:00
|
|
|
DeviceKitAspect::setDevice(k, m_device);
|
2022-04-07 14:04:20 +02:00
|
|
|
BuildDeviceKitAspect::setDevice(k, m_device);
|
2022-04-06 10:15:29 +02:00
|
|
|
|
|
|
|
|
QtVersion *qt = nullptr;
|
|
|
|
|
if (!qtVersions.isEmpty()) {
|
|
|
|
|
qt = qtVersions.at(0);
|
|
|
|
|
QtSupport::QtKitAspect::setQtVersion(k, qt);
|
|
|
|
|
}
|
|
|
|
|
Toolchains toolchainsToSet;
|
2022-04-07 09:01:21 +02:00
|
|
|
toolchainsToSet = ToolChainManager::toolchains([qt, this](const ToolChain *tc) {
|
|
|
|
|
return tc->detectionSource() == m_sharedId
|
|
|
|
|
&& (!qt || qt->qtAbis().contains(tc->targetAbi()));
|
2022-04-06 10:15:29 +02:00
|
|
|
});
|
|
|
|
|
for (ToolChain *toolChain : toolchainsToSet)
|
|
|
|
|
ToolChainKitAspect::setToolChain(k, toolChain);
|
|
|
|
|
|
2022-04-07 14:04:20 +02:00
|
|
|
if (cmakeId.isValid())
|
|
|
|
|
k->setSticky(CMakeProjectManager::Constants::TOOL_ID, true);
|
|
|
|
|
|
2022-04-06 10:15:29 +02:00
|
|
|
k->setSticky(ToolChainKitAspect::id(), true);
|
|
|
|
|
k->setSticky(QtSupport::QtKitAspect::id(), true);
|
|
|
|
|
k->setSticky(DeviceKitAspect::id(), true);
|
|
|
|
|
k->setSticky(DeviceTypeKitAspect::id(), true);
|
2022-04-07 14:04:20 +02:00
|
|
|
k->setSticky(BuildDeviceKitAspect::id(), true);
|
2022-04-06 10:15:29 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Kit *kit = KitManager::registerKit(initializeKit);
|
2022-07-13 10:43:31 +02:00
|
|
|
emit q->logOutput('\n' + ProjectExplorer::Tr::tr("Registered kit %1").arg(kit->displayName()));
|
2022-04-06 10:15:29 +02:00
|
|
|
|
|
|
|
|
QApplication::restoreOverrideCursor();
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-13 10:43:31 +02:00
|
|
|
} // Docker::Internal
|