make error() propagate from requires() and REQUIRES=

that can make sense if a function which determines the availability of
a dependency fails to do so for unexpected reasons.

Change-Id: If6cd113df25aee66830c120a2fab067c822a4543
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
This commit is contained in:
Oswald Buddenhagen 2016-06-30 16:02:29 +02:00
parent 339b9706cc
commit 1b4ea11332
4 changed files with 26 additions and 6 deletions

View File

@ -1200,7 +1200,8 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
return ReturnFalse;
case T_REQUIRES:
#ifdef PROEVALUATOR_FULL
checkRequirements(args);
if (checkRequirements(args) == ReturnError)
return ReturnError;
#endif
return ReturnFalse; // Another qmake breakage
case T_EVAL: {

View File

@ -933,7 +933,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProVariable(
}
#ifdef PROEVALUATOR_FULL
else if (varName == statics.strREQUIRES)
checkRequirements(values(varName));
return checkRequirements(values(varName));
#endif
return ReturnTrue;
@ -1795,12 +1795,17 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateConditional(
}
#ifdef PROEVALUATOR_FULL
void QMakeEvaluator::checkRequirements(const ProStringList &deps)
QMakeEvaluator::VisitReturn QMakeEvaluator::checkRequirements(const ProStringList &deps)
{
ProStringList &failed = valuesRef(ProKey("QMAKE_FAILED_REQUIREMENTS"));
foreach (const ProString &dep, deps)
if (evaluateConditional(dep.toQString(), m_current.pro->fileName(), m_current.line) != ReturnTrue)
foreach (const ProString &dep, deps) {
VisitReturn vr = evaluateConditional(dep.toQString(), m_current.pro->fileName(), m_current.line);
if (vr == ReturnError)
return ReturnError;
if (vr != ReturnTrue)
failed << dep;
}
return ReturnTrue;
}
#endif

View File

@ -222,7 +222,7 @@ public:
VisitReturn evaluateConditional(const QString &cond, const QString &where, int line = -1);
#ifdef PROEVALUATOR_FULL
void checkRequirements(const ProStringList &deps);
VisitReturn checkRequirements(const ProStringList &deps);
#endif
void updateMkspecPaths();

View File

@ -707,6 +707,20 @@ void tst_qmakelib::addControlStructs()
<< "VAR = UNDEF\nOKE = UNDEF"
<< "Project ERROR: error"
<< false;
QTest::newRow("REQUIRES = error()")
<< "REQUIRES = error(error)\n"
"OKE = 1"
<< "OKE = UNDEF"
<< "Project ERROR: error"
<< false;
QTest::newRow("requires(error())")
<< "requires(error(error))\n"
"OKE = 1"
<< "OKE = UNDEF"
<< "Project ERROR: error"
<< false;
}
void tst_qmakelib::addReplaceFunctions(const QString &qindir)