forked from qt-creator/qt-creator
ProjectExplorer: Allow gcc autodetection on docker devices
This uses a separate branch for the remote detection and leaves the local development host path untouched. Ideally the code should be identical, but currently the environment handling on remote devices is not on par with the local cases, yet good enough to find normal gcc installations. Change-Id: I6762299d8ddfdf2aceb0d57cc77ab71fcc83788b Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -1035,23 +1035,47 @@ QList<ToolChain *> GccToolChainFactory::detectForImport(const ToolChainDescripti
|
|||||||
return QList<ToolChain *>();
|
return QList<ToolChain *>();
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(
|
|
||||||
|
static FilePaths findCompilerCandidates(const IDevice::Ptr &device,
|
||||||
const QString &compilerName,
|
const QString &compilerName,
|
||||||
DetectVariants detectVariants,
|
bool detectVariants)
|
||||||
const Id language,
|
|
||||||
const Id requiredTypeId,
|
|
||||||
const QList<ToolChain *> &alreadyKnown,
|
|
||||||
const IDevice::Ptr &device,
|
|
||||||
const ToolchainChecker &checker)
|
|
||||||
{
|
{
|
||||||
Q_UNUSED(device)
|
const QFileInfo fi(compilerName);
|
||||||
|
if (device.isNull() && fi.isAbsolute() && fi.isFile())
|
||||||
|
return {FilePath::fromString(compilerName)};
|
||||||
|
|
||||||
|
QStringList nameFilters(compilerName);
|
||||||
|
if (detectVariants) {
|
||||||
|
nameFilters
|
||||||
|
<< compilerName + "-[1-9]*" // "clang-8", "gcc-5"
|
||||||
|
<< ("*-" + compilerName) // "avr-gcc", "avr32-gcc"
|
||||||
|
<< ("*-" + compilerName + "-[1-9]*")// "avr-gcc-4.8.1", "avr32-gcc-4.4.7"
|
||||||
|
<< ("*-*-*-" + compilerName) // "arm-none-eabi-gcc"
|
||||||
|
<< ("*-*-*-" + compilerName + "-[1-9]*") // "arm-none-eabi-gcc-9.1.0"
|
||||||
|
<< ("*-*-*-*-" + compilerName) // "x86_64-pc-linux-gnu-gcc"
|
||||||
|
<< ("*-*-*-*-" + compilerName
|
||||||
|
+ "-[1-9]*"); // "x86_64-pc-linux-gnu-gcc-7.4.1"
|
||||||
|
}
|
||||||
|
|
||||||
FilePaths compilerPaths;
|
FilePaths compilerPaths;
|
||||||
QFileInfo fi(compilerName);
|
|
||||||
if (fi.isAbsolute()) {
|
if (!device.isNull()) {
|
||||||
if (fi.isFile())
|
// FIXME: Merge with block below
|
||||||
compilerPaths << FilePath::fromString(compilerName);
|
FilePaths searchPaths = device->systemEnvironment().path();
|
||||||
|
for (const FilePath &deviceDir : qAsConst(searchPaths)) {
|
||||||
|
static const QRegularExpression regexp(binaryRegexp);
|
||||||
|
const FilePath globalDir = device->mapToGlobalPath(deviceDir);
|
||||||
|
const FilePaths fileNames = device->directoryEntries(globalDir, nameFilters,
|
||||||
|
QDir::Files | QDir::Executable);
|
||||||
|
for (const FilePath &fileName : fileNames) {
|
||||||
|
if (fileName.fileName() == compilerName)
|
||||||
|
compilerPaths << fileName;
|
||||||
|
else if (regexp.match(fileName.path()).hasMatch())
|
||||||
|
compilerPaths << fileName;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// The normal, local host case.
|
||||||
FilePaths searchPaths = Environment::systemEnvironment().path();
|
FilePaths searchPaths = Environment::systemEnvironment().path();
|
||||||
searchPaths << gnuSearchPathsFromRegistry();
|
searchPaths << gnuSearchPathsFromRegistry();
|
||||||
searchPaths << atmelSearchPathsFromRegistry();
|
searchPaths << atmelSearchPathsFromRegistry();
|
||||||
@@ -1066,18 +1090,6 @@ QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(
|
|||||||
for (const FilePath &dir : qAsConst(searchPaths)) {
|
for (const FilePath &dir : qAsConst(searchPaths)) {
|
||||||
static const QRegularExpression regexp(binaryRegexp);
|
static const QRegularExpression regexp(binaryRegexp);
|
||||||
QDir binDir(dir.toString());
|
QDir binDir(dir.toString());
|
||||||
QStringList nameFilters(compilerName);
|
|
||||||
if (detectVariants == DetectVariants::Yes) {
|
|
||||||
nameFilters
|
|
||||||
<< compilerName + "-[1-9]*" // "clang-8", "gcc-5"
|
|
||||||
<< ("*-" + compilerName) // "avr-gcc", "avr32-gcc"
|
|
||||||
<< ("*-" + compilerName + "-[1-9]*")// "avr-gcc-4.8.1", "avr32-gcc-4.4.7"
|
|
||||||
<< ("*-*-*-" + compilerName) // "arm-none-eabi-gcc"
|
|
||||||
<< ("*-*-*-" + compilerName + "-[1-9]*") // "arm-none-eabi-gcc-9.1.0"
|
|
||||||
<< ("*-*-*-*-" + compilerName) // "x86_64-pc-linux-gnu-gcc"
|
|
||||||
<< ("*-*-*-*-" + compilerName
|
|
||||||
+ "-[1-9]*"); // "x86_64-pc-linux-gnu-gcc-7.4.1"
|
|
||||||
}
|
|
||||||
nameFilters = transform(nameFilters, [](const QString &baseName) {
|
nameFilters = transform(nameFilters, [](const QString &baseName) {
|
||||||
return HostOsInfo::withExecutableSuffix(baseName);
|
return HostOsInfo::withExecutableSuffix(baseName);
|
||||||
});
|
});
|
||||||
@@ -1093,6 +1105,21 @@ QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return compilerPaths;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(
|
||||||
|
const QString &compilerName,
|
||||||
|
DetectVariants detectVariants,
|
||||||
|
const Id language,
|
||||||
|
const Id requiredTypeId,
|
||||||
|
const QList<ToolChain *> &alreadyKnown,
|
||||||
|
const IDevice::Ptr &device,
|
||||||
|
const ToolchainChecker &checker)
|
||||||
|
{
|
||||||
|
const FilePaths compilerPaths =
|
||||||
|
findCompilerCandidates(device, compilerName, detectVariants == DetectVariants::Yes);
|
||||||
|
|
||||||
QList<ToolChain *> existingCandidates
|
QList<ToolChain *> existingCandidates
|
||||||
= filtered(alreadyKnown, [requiredTypeId, language, &checker](const ToolChain *tc) {
|
= filtered(alreadyKnown, [requiredTypeId, language, &checker](const ToolChain *tc) {
|
||||||
if (tc->typeId() != requiredTypeId)
|
if (tc->typeId() != requiredTypeId)
|
||||||
|
Reference in New Issue
Block a user