forked from qt-creator/qt-creator
Properly import qmake projects
The code simply picked one matching toolchain and set it on the temporary kit, ignoring the fact that we have pairs of toolchains (C and C++). So the second one was set to some random value and typically did not match the first one, resulting in a broken Kit. We now collect both types of toolchains. Fixes: QTCREATORBUG-18153 Fixes: QTCREATORBUG-19423 Change-Id: I348e5467f30d449cc344946ec7e87d4ca5ddfbd1 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -265,19 +265,30 @@ void QmakeProjectImporter::deleteDirectoryData(void *directoryData) const
|
|||||||
delete static_cast<DirectoryData *>(directoryData);
|
delete static_cast<DirectoryData *>(directoryData);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ToolChain *preferredToolChain(BaseQtVersion *qtVersion, const FileName &ms,
|
static const QList<ToolChain *> preferredToolChains(BaseQtVersion *qtVersion, const FileName &ms,
|
||||||
const QMakeStepConfig::TargetArchConfig &archConfig)
|
const QMakeStepConfig::TargetArchConfig &archConfig)
|
||||||
{
|
{
|
||||||
const FileName spec = ms.isEmpty() ? qtVersion->mkspec() : ms;
|
const FileName spec = ms.isEmpty() ? qtVersion->mkspec() : ms;
|
||||||
|
|
||||||
const QList<ToolChain *> toolchains = ToolChainManager::toolChains();
|
const QList<ToolChain *> toolchains = ToolChainManager::toolChains();
|
||||||
QList<Abi> qtAbis = qtVersion->qtAbis();
|
QList<Abi> qtAbis = qtVersion->qtAbis();
|
||||||
return findOr(toolchains, toolchains.isEmpty() ? nullptr : toolchains.first(),
|
const auto matcher = [&](const ToolChain *tc) {
|
||||||
[&](ToolChain *tc) {
|
|
||||||
return qtAbis.contains(tc->targetAbi())
|
return qtAbis.contains(tc->targetAbi())
|
||||||
&& tc->suggestedMkspecList().contains(spec)
|
&& tc->suggestedMkspecList().contains(spec)
|
||||||
&& QMakeStepConfig::targetArchFor(tc->targetAbi(), qtVersion) == archConfig;
|
&& QMakeStepConfig::targetArchFor(tc->targetAbi(), qtVersion) == archConfig;
|
||||||
|
};
|
||||||
|
ToolChain * const cxxToolchain = findOrDefault(toolchains, [matcher](const ToolChain *tc) {
|
||||||
|
return tc->language() == ProjectExplorer::Constants::CXX_LANGUAGE_ID && matcher(tc);
|
||||||
});
|
});
|
||||||
|
ToolChain * const cToolchain = findOrDefault(toolchains, [matcher](const ToolChain *tc) {
|
||||||
|
return tc->language() == ProjectExplorer::Constants::C_LANGUAGE_ID && matcher(tc);
|
||||||
|
});
|
||||||
|
QList<ToolChain *> chosenToolchains;
|
||||||
|
for (ToolChain * const tc : {cxxToolchain, cToolchain}) {
|
||||||
|
if (tc)
|
||||||
|
chosenToolchains << tc;
|
||||||
|
};
|
||||||
|
return chosenToolchains;
|
||||||
}
|
}
|
||||||
|
|
||||||
Kit *QmakeProjectImporter::createTemporaryKit(const QtProjectImporter::QtVersionData &data,
|
Kit *QmakeProjectImporter::createTemporaryKit(const QtProjectImporter::QtVersionData &data,
|
||||||
@@ -288,7 +299,8 @@ Kit *QmakeProjectImporter::createTemporaryKit(const QtProjectImporter::QtVersion
|
|||||||
Q_UNUSED(osType); // TODO use this to select the right toolchain?
|
Q_UNUSED(osType); // TODO use this to select the right toolchain?
|
||||||
return QtProjectImporter::createTemporaryKit(data,
|
return QtProjectImporter::createTemporaryKit(data,
|
||||||
[&data, parsedSpec, archConfig](Kit *k) -> void {
|
[&data, parsedSpec, archConfig](Kit *k) -> void {
|
||||||
ToolChainKitInformation::setToolChain(k, preferredToolChain(data.qt, parsedSpec, archConfig));
|
for (ToolChain * const tc : preferredToolChains(data.qt, parsedSpec, archConfig))
|
||||||
|
ToolChainKitInformation::setToolChain(k, tc);
|
||||||
if (parsedSpec != data.qt->mkspec())
|
if (parsedSpec != data.qt->mkspec())
|
||||||
QmakeKitInformation::setMkspec(k, parsedSpec);
|
QmakeKitInformation::setMkspec(k, parsedSpec);
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user