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()));
|
||||
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);
|
||||
allNewToolchains.append(newToolchains);
|
||||
}
|
||||
@@ -332,7 +334,7 @@ void KitDetectorPrivate::autoDetect()
|
||||
|
||||
emit q->logOutput(ProjectExplorer::Tr::tr("Starting auto-detection. This will take a while..."));
|
||||
|
||||
const Toolchains toolchains = autoDetectToolchains();
|
||||
autoDetectToolchains();
|
||||
const QtVersions qtVersions = autoDetectQtVersions();
|
||||
|
||||
const QList<Id> cmakeIds = autoDetectCMake();
|
||||
@@ -340,7 +342,7 @@ void KitDetectorPrivate::autoDetect()
|
||||
autoDetectDebugger();
|
||||
autoDetectPython();
|
||||
|
||||
const auto initializeKit = [this, toolchains, qtVersions, cmakeId](Kit *k) {
|
||||
const auto initializeKit = [this, qtVersions, cmakeId](Kit *k) {
|
||||
k->setAutoDetected(false);
|
||||
k->setAutoDetectionSource(m_sharedId);
|
||||
k->setUnexpandedDisplayName("%{Device:Name}");
|
||||
@@ -352,18 +354,32 @@ void KitDetectorPrivate::autoDetect()
|
||||
DeviceKitAspect::setDevice(k, m_device);
|
||||
BuildDeviceKitAspect::setDevice(k, m_device);
|
||||
|
||||
QtVersion *qt = nullptr;
|
||||
if (!qtVersions.isEmpty()) {
|
||||
qt = qtVersions.at(0);
|
||||
QtSupport::QtKitAspect::setQtVersion(k, qt);
|
||||
const Toolchains toolchainCandidates = ToolchainManager::toolchains(
|
||||
[this](const Toolchain *tc) { return tc->detectionSource() == m_sharedId; });
|
||||
const QList<ToolchainBundle> bundles = ToolchainBundle::collectBundles(toolchainCandidates);
|
||||
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) {
|
||||
return tc->detectionSource() == m_sharedId
|
||||
&& (!qt || qt->qtAbis().contains(tc->targetAbi()));
|
||||
});
|
||||
for (Toolchain *toolchain : toolchainsToSet)
|
||||
ToolchainKitAspect::setToolchain(k, toolchain);
|
||||
|
||||
// Otherwise, just set a random toolchain.
|
||||
if (!match && !bundles.isEmpty())
|
||||
ToolchainKitAspect::setBundle(k, bundles.first());
|
||||
|
||||
if (cmakeId.isValid())
|
||||
k->setSticky(CMakeProjectManager::Constants::TOOL_ID, true);
|
||||
|
||||
@@ -620,6 +620,13 @@ void ToolchainKitAspect::setToolchain(Kit *k, Toolchain *tc)
|
||||
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
|
||||
*
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
#include <utils/environment.h>
|
||||
|
||||
namespace ProjectExplorer {
|
||||
|
||||
class Toolchain;
|
||||
class ToolchainBundle;
|
||||
|
||||
// SysRootKitAspect
|
||||
|
||||
@@ -36,6 +36,7 @@ public:
|
||||
static Toolchain *cxxToolchain(const Kit *k);
|
||||
static QList<Toolchain *> toolChains(const Kit *k);
|
||||
static void setToolchain(Kit *k, Toolchain *tc);
|
||||
static void setBundle(Kit *k, const ToolchainBundle &bundle);
|
||||
static void setAllToolchainsToMatch(Kit *k, Toolchain *tc);
|
||||
static void clearToolchain(Kit *k, Utils::Id language);
|
||||
static Abi targetAbi(const Kit *k);
|
||||
|
||||
@@ -246,7 +246,7 @@ public:
|
||||
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))
|
||||
modifier(static_cast<T &>(*tc));
|
||||
|
||||
Reference in New Issue
Block a user