forked from qt-creator/qt-creator
Docker: Improve Kit setup
- Use toolchain bundles, ensuring compatible C/C++ toolchains - Try harder to match Qt and toolchains Change-Id: I8739a5e1e75d08df4346d51cb0ee7704ca072489 Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
@@ -262,7 +262,9 @@ Toolchains KitDetectorPrivate::autoDetectToolchains()
|
|||||||
.arg(toolchain->compilerCommand().toUserOutput()));
|
.arg(toolchain->compilerCommand().toUserOutput()));
|
||||||
toolchain->setDetectionSource(m_sharedId);
|
toolchain->setDetectionSource(m_sharedId);
|
||||||
}
|
}
|
||||||
ToolchainManager::registerToolchains(newToolchains);
|
const QList<ToolchainBundle> bundles = ToolchainBundle::collectBundles(newToolchains);
|
||||||
|
for (const ToolchainBundle &b : bundles)
|
||||||
|
ToolchainManager::registerToolchains(b.toolchains());
|
||||||
alreadyKnown.append(newToolchains);
|
alreadyKnown.append(newToolchains);
|
||||||
allNewToolchains.append(newToolchains);
|
allNewToolchains.append(newToolchains);
|
||||||
}
|
}
|
||||||
@@ -332,7 +334,7 @@ void KitDetectorPrivate::autoDetect()
|
|||||||
|
|
||||||
emit q->logOutput(ProjectExplorer::Tr::tr("Starting auto-detection. This will take a while..."));
|
emit q->logOutput(ProjectExplorer::Tr::tr("Starting auto-detection. This will take a while..."));
|
||||||
|
|
||||||
const Toolchains toolchains = autoDetectToolchains();
|
autoDetectToolchains();
|
||||||
const QtVersions qtVersions = autoDetectQtVersions();
|
const QtVersions qtVersions = autoDetectQtVersions();
|
||||||
|
|
||||||
const QList<Id> cmakeIds = autoDetectCMake();
|
const QList<Id> cmakeIds = autoDetectCMake();
|
||||||
@@ -340,7 +342,7 @@ void KitDetectorPrivate::autoDetect()
|
|||||||
autoDetectDebugger();
|
autoDetectDebugger();
|
||||||
autoDetectPython();
|
autoDetectPython();
|
||||||
|
|
||||||
const auto initializeKit = [this, toolchains, qtVersions, cmakeId](Kit *k) {
|
const auto initializeKit = [this, qtVersions, cmakeId](Kit *k) {
|
||||||
k->setAutoDetected(false);
|
k->setAutoDetected(false);
|
||||||
k->setAutoDetectionSource(m_sharedId);
|
k->setAutoDetectionSource(m_sharedId);
|
||||||
k->setUnexpandedDisplayName("%{Device:Name}");
|
k->setUnexpandedDisplayName("%{Device:Name}");
|
||||||
@@ -352,18 +354,32 @@ void KitDetectorPrivate::autoDetect()
|
|||||||
DeviceKitAspect::setDevice(k, m_device);
|
DeviceKitAspect::setDevice(k, m_device);
|
||||||
BuildDeviceKitAspect::setDevice(k, m_device);
|
BuildDeviceKitAspect::setDevice(k, m_device);
|
||||||
|
|
||||||
QtVersion *qt = nullptr;
|
const Toolchains toolchainCandidates = ToolchainManager::toolchains(
|
||||||
if (!qtVersions.isEmpty()) {
|
[this](const Toolchain *tc) { return tc->detectionSource() == m_sharedId; });
|
||||||
qt = qtVersions.at(0);
|
const QList<ToolchainBundle> bundles = ToolchainBundle::collectBundles(toolchainCandidates);
|
||||||
QtSupport::QtKitAspect::setQtVersion(k, qt);
|
for (const ToolchainBundle &b : bundles)
|
||||||
|
ToolchainManager::registerToolchains(b.createdToolchains());
|
||||||
|
|
||||||
|
// Try to find a matching Qt/Toolchain pair.
|
||||||
|
bool match = false;
|
||||||
|
for (const ToolchainBundle &bundle : bundles) {
|
||||||
|
if (match)
|
||||||
|
break;
|
||||||
|
for (QtVersion * const qt : qtVersions) {
|
||||||
|
if (Utils::contains(qt->qtAbis(), [&bundle](const Abi &abi) {
|
||||||
|
return bundle.targetAbi().isCompatibleWith(abi);
|
||||||
|
})) {
|
||||||
|
match = true;
|
||||||
|
ToolchainKitAspect::setBundle(k, bundle);
|
||||||
|
QtKitAspect::setQtVersion(k, qt);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Toolchains toolchainsToSet;
|
|
||||||
toolchainsToSet = ToolchainManager::toolchains([qt, this](const Toolchain *tc) {
|
// Otherwise, just set a random toolchain.
|
||||||
return tc->detectionSource() == m_sharedId
|
if (!match && !bundles.isEmpty())
|
||||||
&& (!qt || qt->qtAbis().contains(tc->targetAbi()));
|
ToolchainKitAspect::setBundle(k, bundles.first());
|
||||||
});
|
|
||||||
for (Toolchain *toolchain : toolchainsToSet)
|
|
||||||
ToolchainKitAspect::setToolchain(k, toolchain);
|
|
||||||
|
|
||||||
if (cmakeId.isValid())
|
if (cmakeId.isValid())
|
||||||
k->setSticky(CMakeProjectManager::Constants::TOOL_ID, true);
|
k->setSticky(CMakeProjectManager::Constants::TOOL_ID, true);
|
||||||
|
|||||||
@@ -620,6 +620,13 @@ void ToolchainKitAspect::setToolchain(Kit *k, Toolchain *tc)
|
|||||||
k->setValue(id(), variantFromStore(result));
|
k->setValue(id(), variantFromStore(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ToolchainKitAspect::setBundle(Kit *k, const ToolchainBundle &bundle)
|
||||||
|
{
|
||||||
|
bundle.forEach<Toolchain>([k](Toolchain &tc) {
|
||||||
|
setToolchain(k, &tc);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief ToolchainKitAspect::setAllToolchainsToMatch
|
* @brief ToolchainKitAspect::setAllToolchainsToMatch
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -11,8 +11,8 @@
|
|||||||
#include <utils/environment.h>
|
#include <utils/environment.h>
|
||||||
|
|
||||||
namespace ProjectExplorer {
|
namespace ProjectExplorer {
|
||||||
|
|
||||||
class Toolchain;
|
class Toolchain;
|
||||||
|
class ToolchainBundle;
|
||||||
|
|
||||||
// SysRootKitAspect
|
// SysRootKitAspect
|
||||||
|
|
||||||
@@ -36,6 +36,7 @@ public:
|
|||||||
static Toolchain *cxxToolchain(const Kit *k);
|
static Toolchain *cxxToolchain(const Kit *k);
|
||||||
static QList<Toolchain *> toolChains(const Kit *k);
|
static QList<Toolchain *> toolChains(const Kit *k);
|
||||||
static void setToolchain(Kit *k, Toolchain *tc);
|
static void setToolchain(Kit *k, Toolchain *tc);
|
||||||
|
static void setBundle(Kit *k, const ToolchainBundle &bundle);
|
||||||
static void setAllToolchainsToMatch(Kit *k, Toolchain *tc);
|
static void setAllToolchainsToMatch(Kit *k, Toolchain *tc);
|
||||||
static void clearToolchain(Kit *k, Utils::Id language);
|
static void clearToolchain(Kit *k, Utils::Id language);
|
||||||
static Abi targetAbi(const Kit *k);
|
static Abi targetAbi(const Kit *k);
|
||||||
|
|||||||
@@ -246,7 +246,7 @@ public:
|
|||||||
std::invoke(setter, static_cast<T &>(*tc), args...);
|
std::invoke(setter, static_cast<T &>(*tc), args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T> void forEach(const std::function<void(T &toolchain)> &modifier)
|
template<typename T> void forEach(const std::function<void(T &toolchain)> &modifier) const
|
||||||
{
|
{
|
||||||
for (Toolchain * const tc : std::as_const(m_toolchains))
|
for (Toolchain * const tc : std::as_const(m_toolchains))
|
||||||
modifier(static_cast<T &>(*tc));
|
modifier(static_cast<T &>(*tc));
|
||||||
|
|||||||
Reference in New Issue
Block a user