From 8f73b24e87632cbd6bb9f16fd5771d8b9a1435ea Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 23 Sep 2016 15:53:31 +0200 Subject: [PATCH] Qmake: Warn when project uses unexpected compiler(s) to build Change-Id: I28b45b2f994ce2dd030f5dae2ab78ecb0b547b1f Reviewed-by: Tim Jenssen --- .../qmakeprojectmanager/qmakenodes.cpp | 2 + src/plugins/qmakeprojectmanager/qmakenodes.h | 4 +- .../qmakeprojectmanager/qmakeproject.cpp | 50 +++++++++++++++++++ .../qmakeprojectmanager/qmakeproject.h | 5 ++ 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index c2266a5086e..5dc8800f1aa 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -2026,6 +2026,8 @@ EvalResult *QmakeProFileNode::evaluate(const EvalInput &input) result->newVarValues[AndroidExtraLibs] = input.readerExact->values(QLatin1String("ANDROID_EXTRA_LIBS")); result->newVarValues[IsoIconsVar] = input.readerExact->values(QLatin1String("ISO_ICONS")); result->newVarValues[QmakeProjectName] = input.readerExact->values(QLatin1String("QMAKE_PROJECT_NAME")); + result->newVarValues[QmakeCc] = input.readerExact->values("QMAKE_CC"); + result->newVarValues[QmakeCxx] = input.readerExact->values("QMAKE_CXX"); result->isDeployable = false; if (result->projectType == ApplicationTemplate) { diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.h b/src/plugins/qmakeprojectmanager/qmakenodes.h index 5e70c708a80..376c718cb27 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.h +++ b/src/plugins/qmakeprojectmanager/qmakenodes.h @@ -107,7 +107,9 @@ enum QmakeVariable { AndroidPackageSourceDir, AndroidExtraLibs, IsoIconsVar, - QmakeProjectName + QmakeProjectName, + QmakeCc, + QmakeCxx }; namespace Internal { diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 0be679baf3a..b896fc0a958 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -393,6 +394,8 @@ void QmakeProject::updateCodeModels() void QmakeProject::updateCppCodeModel() { + m_toolChainWarnings.clear(); + typedef CppTools::ProjectPart ProjectPart; typedef CppTools::ProjectFile ProjectFile; @@ -420,6 +423,8 @@ void QmakeProject::updateCppCodeModel() QList generators; QStringList allFiles; foreach (QmakeProFileNode *pro, proFiles) { + warnOnToolChainMismatch(pro); + ProjectPart::Ptr templatePart(new ProjectPart); templatePart->project = this; templatePart->displayName = pro->displayName(); @@ -1532,6 +1537,51 @@ bool QmakeProject::matchesKit(const Kit *kit) return false; } +static Utils::FileName getFullPathOf(const QString &exe, const BuildConfiguration *bc) +{ + QTC_ASSERT(bc, return Utils::FileName::fromString(exe)); + QFileInfo fi(exe); + if (fi.isAbsolute()) + return Utils::FileName::fromString(exe); + + return bc->environment().searchInPath(exe); +} + +void QmakeProject::testToolChain(ToolChain *tc, const Utils::FileName &path) const +{ + if (!tc || path.isEmpty()) + return; + + const Utils::FileName expected = tc->compilerCommand(); + if (expected != path) { + const QPair pair = qMakePair(expected, path); + if (!m_toolChainWarnings.contains(pair)) { + TaskHub::addTask(Task(Task::Warning, + QCoreApplication::translate("QmakeProjectManager", "\"%1\" is used by qmake, but \"%2\" is configured in the kit.\n" + "Please update your kit or choose a mkspec for qmake that matches your target environment better."). + arg(path.toUserOutput()).arg(expected.toUserOutput()), + Utils::FileName(), -1, ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); + m_toolChainWarnings.insert(pair); + } + } +} + +void QmakeProject::warnOnToolChainMismatch(const QmakeProFileNode *pro) const +{ + Target *t = activeTarget(); + if (!t) + return; + + const BuildConfiguration *bc = t ? t->activeBuildConfiguration() : nullptr; + if (!bc) + return; + + testToolChain(ToolChainKitInformation::toolChain(t->kit(), ToolChain::Language::C), + getFullPathOf(pro->singleVariableValue(QmakeCc), bc)); + testToolChain(ToolChainKitInformation::toolChain(t->kit(), ToolChain::Language::Cxx), + getFullPathOf(pro->singleVariableValue(QmakeCxx), bc)); +} + QString QmakeProject::executableFor(const QmakeProFileNode *node) { const Kit * const kit = activeTarget()->kit(); diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.h b/src/plugins/qmakeprojectmanager/qmakeproject.h index 80c904dd31c..eb3e4328ec0 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.h +++ b/src/plugins/qmakeprojectmanager/qmakeproject.h @@ -173,6 +173,11 @@ private: void startAsyncTimer(QmakeProFileNode::AsyncUpdateDelay delay); bool matchesKit(const ProjectExplorer::Kit *kit); + void warnOnToolChainMismatch(const QmakeProFileNode *pro) const; + void testToolChain(ProjectExplorer::ToolChain *tc, const Utils::FileName &path) const; + + mutable QSet> m_toolChainWarnings; + // Current configuration QString m_oldQtIncludePath; QString m_oldQtLibsPath;