From 114acbbba06ef98120cc5513a9600b7d437cc87c Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 27 Feb 2019 15:45:17 +0100 Subject: [PATCH] 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 --- .../qmakeprojectimporter.cpp | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp index c97bab5a38c..a04657aa407 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp @@ -265,19 +265,30 @@ void QmakeProjectImporter::deleteDirectoryData(void *directoryData) const delete static_cast(directoryData); } -static ToolChain *preferredToolChain(BaseQtVersion *qtVersion, const FileName &ms, - const QMakeStepConfig::TargetArchConfig &archConfig) +static const QList preferredToolChains(BaseQtVersion *qtVersion, const FileName &ms, + const QMakeStepConfig::TargetArchConfig &archConfig) { const FileName spec = ms.isEmpty() ? qtVersion->mkspec() : ms; const QList toolchains = ToolChainManager::toolChains(); QList qtAbis = qtVersion->qtAbis(); - return findOr(toolchains, toolchains.isEmpty() ? nullptr : toolchains.first(), - [&](ToolChain *tc) { + const auto matcher = [&](const ToolChain *tc) { return qtAbis.contains(tc->targetAbi()) - && tc->suggestedMkspecList().contains(spec) - && QMakeStepConfig::targetArchFor(tc->targetAbi(), qtVersion) == archConfig; + && tc->suggestedMkspecList().contains(spec) + && 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 chosenToolchains; + for (ToolChain * const tc : {cxxToolchain, cToolchain}) { + if (tc) + chosenToolchains << tc; + }; + return chosenToolchains; } 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? return QtProjectImporter::createTemporaryKit(data, [&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()) QmakeKitInformation::setMkspec(k, parsedSpec); });