From 9d5ff668efaa0f8a56d7676458b0b3451b3aa8a8 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 31 Jul 2012 12:49:27 +0200 Subject: [PATCH] add requires() function and REQUIRES magic variable follow suit with qmake ... Change-Id: I6afc3898a01cc9926b9652b7f0f66becc255f01b Reviewed-by: Daniel Teske Reviewed-by: Oswald Buddenhagen --- src/shared/proparser/qmakebuiltins.cpp | 4 +++- src/shared/proparser/qmakeevaluator.cpp | 17 +++++++++++++++++ src/shared/proparser/qmakeevaluator.h | 3 +++ src/shared/proparser/qmakeevaluator_p.h | 3 +++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/shared/proparser/qmakebuiltins.cpp b/src/shared/proparser/qmakebuiltins.cpp index 7c8f4e716ea..7b193848bb4 100644 --- a/src/shared/proparser/qmakebuiltins.cpp +++ b/src/shared/proparser/qmakebuiltins.cpp @@ -1023,8 +1023,10 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateConditionalFunction( } } return ReturnFalse; -#if 0 +#ifdef PROEVALUATOR_FULL case T_REQUIRES: + checkRequirements(args); + return ReturnFalse; // Another qmake breakage #endif case T_EVAL: { VisitReturn ret = ReturnFalse; diff --git a/src/shared/proparser/qmakeevaluator.cpp b/src/shared/proparser/qmakeevaluator.cpp index fb0587b4349..45222fb9553 100644 --- a/src/shared/proparser/qmakeevaluator.cpp +++ b/src/shared/proparser/qmakeevaluator.cpp @@ -117,6 +117,9 @@ void QMakeEvaluator::initStatics() statics.strforever = QLatin1String("forever"); statics.strhost_build = QLatin1String("host_build"); statics.strTEMPLATE = ProString("TEMPLATE"); +#ifdef PROEVALUATOR_FULL + statics.strREQUIRES = ProString("REQUIRES"); +#endif statics.fakeValue = ProStringList(ProString("_FAKE_")); // It has to have a unique begin() value @@ -837,6 +840,10 @@ void QMakeEvaluator::visitProVariable( if (varName == statics.strTEMPLATE) setTemplate(); +#ifdef PROEVALUATOR_FULL + else if (varName == statics.strREQUIRES) + checkRequirements(values(varName)); +#endif } void QMakeEvaluator::setTemplate() @@ -1527,6 +1534,16 @@ bool QMakeEvaluator::evaluateConditional(const QString &cond, const QString &con return ret; } +#ifdef PROEVALUATOR_FULL +void QMakeEvaluator::checkRequirements(const ProStringList &deps) +{ + ProStringList &failed = valuesRef(ProString("QMAKE_FAILED_REQUIREMENTS")); + foreach (const ProString &dep, deps) + if (!evaluateConditional(dep.toQString(), fL1S("(requires)"))) + failed << dep; +} +#endif + ProValueMap *QMakeEvaluator::findValues(const ProString &variableName, ProValueMap::Iterator *rit) { for (int i = m_valuemapStack.size(); --i >= 0; ) { diff --git a/src/shared/proparser/qmakeevaluator.h b/src/shared/proparser/qmakeevaluator.h index eb8daf46e83..2fa3c87cd13 100644 --- a/src/shared/proparser/qmakeevaluator.h +++ b/src/shared/proparser/qmakeevaluator.h @@ -166,6 +166,9 @@ public: VisitReturn evaluateConditionalFunction(const ProString &function, const ushort *&tokPtr); bool evaluateConditional(const QString &cond, const QString &context); +#ifdef PROEVALUATOR_FULL + void checkRequirements(const ProStringList &deps); +#endif QStringList qmakeMkspecPaths() const; QStringList qmakeFeaturePaths() const; diff --git a/src/shared/proparser/qmakeevaluator_p.h b/src/shared/proparser/qmakeevaluator_p.h index ea958ace4c6..964116f6d27 100644 --- a/src/shared/proparser/qmakeevaluator_p.h +++ b/src/shared/proparser/qmakeevaluator_p.h @@ -51,6 +51,9 @@ struct QMakeStatics { QString strforever; QString strhost_build; ProString strTEMPLATE; +#ifdef PROEVALUATOR_FULL + ProString strREQUIRES; +#endif QHash expands; QHash functions; QHash varMap;