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:
Christian Kandeler
2019-02-27 15:45:17 +01:00
parent b9e26fcd37
commit 114acbbba0

View File

@@ -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);
}); });