ProjectExplorer: Pass device to ToolChain::autodetect

Currently unused, will be useful to detect toolchains in docker
containers.

Change-Id: I0fd7643969ab02c05839332a436147ffb242635d
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2021-04-27 16:06:50 +02:00
parent c8f8513c8d
commit 509f40825a
23 changed files with 101 additions and 49 deletions

View File

@@ -435,8 +435,10 @@ IarToolChainFactory::IarToolChainFactory()
setUserCreatable(true);
}
QList<ToolChain *> IarToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
QList<ToolChain *> IarToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device)
{
Q_UNUSED(device);
Candidates candidates;
#ifdef Q_OS_WIN

View File

@@ -91,7 +91,8 @@ public:
IarToolChainFactory();
QList<ProjectExplorer::ToolChain *> autoDetect(
const QList<ProjectExplorer::ToolChain *> &alreadyKnown) final;
const QList<ProjectExplorer::ToolChain *> &alreadyKnown,
const ProjectExplorer::IDevice::Ptr &device) final;
private:
QList<ProjectExplorer::ToolChain *> autoDetectToolchains(const Candidates &candidates,

View File

@@ -605,8 +605,10 @@ static QString extractVersion(const QString &toolsFile, const QString &section)
return {};
}
QList<ToolChain *> KeilToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
QList<ToolChain *> KeilToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device)
{
Q_UNUSED(device)
#ifdef Q_OS_WIN64
static const char kRegistryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\" \
"Windows\\CurrentVersion\\Uninstall\\Keil µVision4";

View File

@@ -92,7 +92,8 @@ public:
KeilToolChainFactory();
QList<ProjectExplorer::ToolChain *> autoDetect(
const QList<ProjectExplorer::ToolChain *> &alreadyKnown) final;
const QList<ProjectExplorer::ToolChain *> &alreadyKnown,
const ProjectExplorer::IDevice::Ptr &device) final;
private:
QList<ProjectExplorer::ToolChain *> autoDetectToolchains(const Candidates &candidates,

View File

@@ -313,8 +313,10 @@ SdccToolChainFactory::SdccToolChainFactory()
setUserCreatable(true);
}
QList<ToolChain *> SdccToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
QList<ToolChain *> SdccToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device)
{
Q_UNUSED(device)
Candidates candidates;
if (Utils::HostOsInfo::isWindowsHost()) {

View File

@@ -83,7 +83,8 @@ public:
SdccToolChainFactory();
QList<ProjectExplorer::ToolChain *> autoDetect(
const QList<ProjectExplorer::ToolChain *> &alreadyKnown) final;
const QList<ProjectExplorer::ToolChain *> &alreadyKnown,
const ProjectExplorer::IDevice::Ptr &device) final;
private:
QList<ProjectExplorer::ToolChain *> autoDetectToolchains(const Candidates &candidates,

View File

@@ -580,8 +580,10 @@ IosToolChainFactory::IosToolChainFactory()
ProjectExplorer::Constants::CXX_LANGUAGE_ID});
}
QList<ToolChain *> IosToolChainFactory::autoDetect(const QList<ToolChain *> &existingToolChains)
QList<ToolChain *> IosToolChainFactory::autoDetect(const QList<ToolChain *> &existingToolChains,
const IDevice::Ptr &device)
{
Q_UNUSED(device);
QList<ClangToolChain *> existingClangToolChains = clangToolChains(existingToolChains);
const QList<XcodePlatform> platforms = XcodeProbe::detectPlatforms().values();
QList<ToolChain *> toolChains;

View File

@@ -98,7 +98,9 @@ class IosToolChainFactory : public ProjectExplorer::ToolChainFactory
public:
IosToolChainFactory();
QList<ProjectExplorer::ToolChain *> autoDetect(const QList<ProjectExplorer::ToolChain *> &existingToolChains) override;
QList<ProjectExplorer::ToolChain *> autoDetect(
const QList<ProjectExplorer::ToolChain *> &existingToolChains,
const ProjectExplorer::IDevice::Ptr &device) override;
};
class IosConfigurations : public QObject

View File

@@ -419,7 +419,7 @@ static ToolChain *iarToolChain(Id language)
return f->supportedToolChainType() == BareMetal::Constants::IAREW_TOOLCHAIN_TYPEID;
});
if (iarFactory) {
const QList<ToolChain*> detected = iarFactory->autoDetect(QList<ToolChain*>());
const QList<ToolChain*> detected = iarFactory->autoDetect({}, {});
for (auto tc: detected) {
if (tc->language() == language) {
toolChain = tc;

View File

@@ -49,8 +49,10 @@ NimToolChainFactory::NimToolChainFactory()
setUserCreatable(true);
}
QList<ToolChain *> NimToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
QList<ToolChain *> NimToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device)
{
Q_UNUSED(device);
QList<ToolChain *> result;
Environment systemEnvironment = Environment::systemEnvironment();

View File

@@ -39,7 +39,8 @@ class NimToolChainFactory : public ProjectExplorer::ToolChainFactory
public:
NimToolChainFactory();
QList<ProjectExplorer::ToolChain *> autoDetect(const QList<ProjectExplorer::ToolChain *> &alreadyKnown) final;
QList<ProjectExplorer::ToolChain *> autoDetect(const QList<ProjectExplorer::ToolChain *> &alreadyKnown,
const ProjectExplorer::IDevice::Ptr &device) final;
QList<ProjectExplorer::ToolChain *> detectForImport(const ProjectExplorer::ToolChainDescription &tcd) final;
};

View File

@@ -998,7 +998,8 @@ GccToolChainFactory::GccToolChainFactory()
setUserCreatable(true);
}
QList<ToolChain *> GccToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
QList<ToolChain *> GccToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device)
{
// GCC is almost never what you want on macOS, but it is by default found in /usr/bin
if (HostOsInfo::isMacHost())
@@ -1010,9 +1011,11 @@ QList<ToolChain *> GccToolChainFactory::autoDetect(const QList<ToolChain *> &alr
&& tc->compilerCommand().fileName() != "c99-gcc";
};
tcs.append(autoDetectToolchains("g++", DetectVariants::Yes, Constants::CXX_LANGUAGE_ID,
Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown, tcChecker));
Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown,
device, tcChecker));
tcs.append(autoDetectToolchains("gcc", DetectVariants::Yes, Constants::C_LANGUAGE_ID,
Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown, tcChecker));
Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown,
device, tcChecker));
return tcs;
}
@@ -1032,10 +1035,16 @@ QList<ToolChain *> GccToolChainFactory::detectForImport(const ToolChainDescripti
}
QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(
const QString &compilerName, DetectVariants detectVariants, Utils::Id language,
const Utils::Id requiredTypeId, const QList<ToolChain *> &alreadyKnown,
const QString &compilerName,
DetectVariants detectVariants,
const Id language,
const Id requiredTypeId,
const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device,
const ToolchainChecker &checker)
{
Q_UNUSED(device)
FilePaths compilerPaths;
QFileInfo fi(compilerName);
if (fi.isAbsolute()) {
@@ -1123,8 +1132,8 @@ QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(
}
}
if (!alreadyExists) {
const QList<ToolChain *> newToolchains = autoDetectToolChain({compilerPath, language},
checker);
const QList<ToolChain *> newToolchains
= autoDetectToolChain({compilerPath, language}, checker);
result << newToolchains;
existingCandidates << newToolchains;
}
@@ -1591,15 +1600,16 @@ ClangToolChainFactory::ClangToolChainFactory()
setToolchainConstructor([] { return new ClangToolChain; });
}
QList<ToolChain *> ClangToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
QList<ToolChain *> ClangToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device)
{
QList<ToolChain *> tcs;
QList<ToolChain *> known = alreadyKnown;
tcs.append(autoDetectToolchains("clang++", DetectVariants::Yes, Constants::CXX_LANGUAGE_ID,
Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown));
Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown, device));
tcs.append(autoDetectToolchains("clang", DetectVariants::Yes, Constants::C_LANGUAGE_ID,
Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown));
Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown, device));
known.append(tcs);
const FilePath compilerPath = FilePath::fromString(Core::ICore::clangExecutable(CLANG_BINDIR));
@@ -1608,7 +1618,7 @@ QList<ToolChain *> ClangToolChainFactory::autoDetect(const QList<ToolChain *> &a
HostOsInfo::withExecutableSuffix("clang"));
tcs.append(autoDetectToolchains(clang.toString(), DetectVariants::No,
Constants::C_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID,
tcs));
tcs, device));
}
return tcs;
@@ -1779,16 +1789,17 @@ MingwToolChainFactory::MingwToolChainFactory()
setToolchainConstructor([] { return new MingwToolChain; });
}
QList<ToolChain *> MingwToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
QList<ToolChain *> MingwToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device)
{
static const auto tcChecker = [](const ToolChain *tc) {
return tc->targetAbi().osFlavor() == Abi::WindowsMSysFlavor;
};
QList<ToolChain *> result = autoDetectToolchains(
"g++", DetectVariants::Yes, Constants::CXX_LANGUAGE_ID,
Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown, tcChecker);
Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown, device, tcChecker);
result += autoDetectToolchains("gcc", DetectVariants::Yes, Constants::C_LANGUAGE_ID,
Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown, tcChecker);
Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown, device, tcChecker);
return result;
}
@@ -1860,13 +1871,14 @@ LinuxIccToolChainFactory::LinuxIccToolChainFactory()
setToolchainConstructor([] { return new LinuxIccToolChain; });
}
QList<ToolChain *> LinuxIccToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
QList<ToolChain *> LinuxIccToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device)
{
QList<ToolChain *> result
= autoDetectToolchains("icpc", DetectVariants::No, Constants::CXX_LANGUAGE_ID,
Constants::LINUXICC_TOOLCHAIN_TYPEID, alreadyKnown);
Constants::LINUXICC_TOOLCHAIN_TYPEID, alreadyKnown, device);
result += autoDetectToolchains("icc", DetectVariants::Yes, Constants::C_LANGUAGE_ID,
Constants::LINUXICC_TOOLCHAIN_TYPEID, alreadyKnown);
Constants::LINUXICC_TOOLCHAIN_TYPEID, alreadyKnown, device);
return result;
}

View File

@@ -52,15 +52,17 @@ class GccToolChainFactory : public ToolChainFactory
public:
GccToolChainFactory();
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown) override;
QList<ToolChain *> detectForImport(const ProjectExplorer::ToolChainDescription &tcd) override;
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device) override;
QList<ToolChain *> detectForImport(const ToolChainDescription &tcd) override;
protected:
enum class DetectVariants { Yes, No };
using ToolchainChecker = std::function<bool(const ToolChain *)>;
QList<ToolChain *> autoDetectToolchains(
const QString &compilerName, DetectVariants detectVariants, Utils::Id language,
const QString &compilerName, DetectVariants detectVariants, const Utils::Id language,
const Utils::Id requiredTypeId, const QList<ToolChain *> &alreadyKnown,
const ProjectExplorer::IDevice::Ptr &device,
const ToolchainChecker &checker = {});
QList<ToolChain *> autoDetectToolChain(
const ToolChainDescription &tcd,
@@ -132,7 +134,8 @@ class ClangToolChainFactory : public GccToolChainFactory
public:
ClangToolChainFactory();
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown) override;
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device) override;
QList<ToolChain *> detectForImport(const ToolChainDescription &tcd) final;
};
@@ -145,7 +148,8 @@ class MingwToolChainFactory : public GccToolChainFactory
public:
MingwToolChainFactory();
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown) override;
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device) override;
QList<ToolChain *> detectForImport(const ToolChainDescription &tcd) final;
};
@@ -158,7 +162,7 @@ class LinuxIccToolChainFactory : public GccToolChainFactory
public:
LinuxIccToolChainFactory();
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown) override;
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown, const IDevice::Ptr &) override;
QList<ToolChain *> detectForImport(const ToolChainDescription &tcd) final;
};

View File

@@ -1811,8 +1811,11 @@ static void detectCppBuildTools2015(QList<ToolChain *> *list)
}
}
QList<ToolChain *> MsvcToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
QList<ToolChain *> MsvcToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device)
{
Q_UNUSED(device)
QList<ToolChain *> results;
// 1) Installed SDKs preferred over standalone Visual studio
@@ -1913,9 +1916,11 @@ bool ClangClToolChainFactory::canCreate() const
return !g_availableMsvcToolchains.isEmpty();
}
QList<ToolChain *> ClangClToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
QList<ToolChain *> ClangClToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device)
{
Q_UNUSED(alreadyKnown)
Q_UNUSED(device) // FIXME: Use it.
#ifdef Q_OS_WIN64
const char registryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\LLVM\\LLVM";

View File

@@ -187,7 +187,8 @@ class MsvcToolChainFactory : public ToolChainFactory
public:
MsvcToolChainFactory();
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown) override;
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device) override;
bool canCreate() const override;
@@ -201,7 +202,8 @@ class ClangClToolChainFactory : public ToolChainFactory
public:
ClangClToolChainFactory();
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown) override;
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device) override;
bool canCreate() const override;
};

View File

@@ -488,9 +488,11 @@ const QList<ToolChainFactory *> ToolChainFactory::allToolChainFactories()
return Internal::g_toolChainFactories;
}
QList<ToolChain *> ToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
QList<ToolChain *> ToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device)
{
Q_UNUSED(alreadyKnown)
Q_UNUSED(device)
return {};
}

View File

@@ -28,6 +28,7 @@
#include "projectexplorer_export.h"
#include "abi.h"
#include "devicesupport/idevice.h"
#include "headerpath.h"
#include "projectmacro.h"
#include "task.h"
@@ -202,7 +203,8 @@ public:
QString displayName() const { return m_displayName; }
Utils::Id supportedToolChainType() const;
virtual QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown);
virtual QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device);
virtual QList<ToolChain *> detectForImport(const ToolChainDescription &tcd);
virtual bool canCreate() const;

View File

@@ -413,7 +413,7 @@ void ToolChainOptionsWidget::redetectToolchains()
QList<ToolChain *> toAdd;
QSet<ToolChain *> toDelete;
for (ToolChainFactory *f : ToolChainFactory::allToolChainFactories()) {
for (ToolChain * const tc : f->autoDetect(knownTcs)) {
for (ToolChain * const tc : f->autoDetect(knownTcs, {})) { // FIXME: Pass device.
if (knownTcs.contains(tc) || toDelete.contains(tc))
continue;
const auto matchItem = [tc](const ToolChainTreeItem *item) {

View File

@@ -67,11 +67,12 @@ struct ToolChainOperations
QList<ToolChain *> toDelete;
};
static QList<ToolChain *> autoDetectToolChains(const QList<ToolChain *> alreadyKnownTcs)
static QList<ToolChain *> autoDetectToolChains(const QList<ToolChain *> alreadyKnownTcs,
const IDevice::Ptr &device)
{
QList<ToolChain *> result;
for (ToolChainFactory *f : ToolChainFactory::allToolChainFactories())
result.append(f->autoDetect(alreadyKnownTcs));
result.append(f->autoDetect(alreadyKnownTcs, device));
// Remove invalid toolchains that might have sneaked in.
return Utils::filtered(result, [](const ToolChain *tc) { return tc->isValid(); });
@@ -203,7 +204,8 @@ QList<ToolChain *> ToolChainSettingsAccessor::restoreToolChains(QWidget *parent)
// Autodetect: Pass autodetected toolchains from user file so the information can be reused:
const QList<ToolChain *> autodetectedUserFileTcs
= Utils::filtered(userFileTcs, &ToolChain::isAutoDetected);
const QList<ToolChain *> autodetectedTcs = autoDetectToolChains(autodetectedUserFileTcs);
// FIXME: Use real device?
const QList<ToolChain *> autodetectedTcs = autoDetectToolChains(autodetectedUserFileTcs, {});
// merge tool chains and register those that we need to keep:
const ToolChainOperations ops = mergeToolChainLists(systemFileTcs, userFileTcs, autodetectedTcs);

View File

@@ -213,8 +213,11 @@ QnxToolChainFactory::QnxToolChainFactory()
}
QList<ProjectExplorer::ToolChain *> QnxToolChainFactory::autoDetect(
const QList<ProjectExplorer::ToolChain *> &alreadyKnown)
const QList<ProjectExplorer::ToolChain *> &alreadyKnown,
const IDevice::Ptr &device)
{
Q_UNUSED(device);
QList<ToolChain *> tcs;
QList<QnxConfiguration *> configurations =
QnxConfigurationManager::instance()->configurations();

View File

@@ -71,7 +71,8 @@ public:
QnxToolChainFactory();
QList<ProjectExplorer::ToolChain *> autoDetect(
const QList<ProjectExplorer::ToolChain *> &alreadyKnown) override;
const QList<ProjectExplorer::ToolChain *> &alreadyKnown,
const ProjectExplorer::IDevice::Ptr &device) final;
};
//----------------------------------------------------------------------------

View File

@@ -128,7 +128,7 @@ void WebAssemblyToolChain::registerToolChains()
return f->supportedToolChainType() == Constants::WEBASSEMBLY_TOOLCHAIN_TYPEID;
});
QTC_ASSERT(factory, return);
for (auto toolChain : factory->autoDetect({}))
for (auto toolChain : factory->autoDetect({}, {}))
ToolChainManager::registerToolChain(toolChain);
// Let kits pick up the new toolchains
@@ -158,9 +158,11 @@ WebAssemblyToolChainFactory::WebAssemblyToolChainFactory()
}
QList<ToolChain *> WebAssemblyToolChainFactory::autoDetect(
const QList<ToolChain *> &alreadyKnown)
const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device)
{
Q_UNUSED(alreadyKnown)
Q_UNUSED(device)
const FilePath sdk = WebAssemblyEmSdk::registeredEmSdk();
if (!WebAssemblyEmSdk::isValid(sdk))

View File

@@ -58,7 +58,8 @@ public:
WebAssemblyToolChainFactory();
QList<ProjectExplorer::ToolChain *> autoDetect(
const QList<ProjectExplorer::ToolChain *> &alreadyKnown) override;
const QList<ProjectExplorer::ToolChain *> &alreadyKnown,
const ProjectExplorer::IDevice::Ptr &device) override;
};
} // namespace Internal